aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.travis.yml1
-rwxr-xr-xapp/Resources/static/themes/material/css/main.css11
-rw-r--r--docs/de/conf.py55
-rw-r--r--docs/de/requirements.txt2
-rw-r--r--docs/de/user/errors_during_fetching.rst2
-rw-r--r--docs/en/user/errors_during_fetching.rst2
-rw-r--r--docs/en/user/import.rst21
-rw-r--r--docs/fr/user/errors_during_fetching.rst2
-rw-r--r--docs/fr/user/import.rst20
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php19
-rw-r--r--src/Wallabag/CoreBundle/Controller/ExportController.php2
-rw-r--r--src/Wallabag/CoreBundle/Repository/EntryRepository.php16
-rw-r--r--src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.js103
-rw-r--r--src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.min.js1
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.da.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.de.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.en.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.es.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml21
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.it.yml8
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml19
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml7
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/_title.html.twig15
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig14
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig1
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig4
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig16
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig1
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig3
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig4
-rw-r--r--src/Wallabag/ImportBundle/Controller/ReadabilityController.php65
-rw-r--r--src/Wallabag/ImportBundle/Import/ReadabilityImport.php179
-rw-r--r--src/Wallabag/ImportBundle/Resources/config/services.yml10
-rw-r--r--src/Wallabag/ImportBundle/Resources/views/Readability/index.html.twig43
-rw-r--r--src/Wallabag/UserBundle/Resources/translations/wallabag_user.oc.yml11
-rw-r--r--src/Wallabag/UserBundle/Resources/views/Security/login.html.twig2
-rw-r--r--tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php10
-rw-r--r--tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php2
-rw-r--r--tests/Wallabag/ImportBundle/Controller/ReadabilityControllerTest.php122
-rw-r--r--tests/Wallabag/ImportBundle/Import/ReadabilityImportTest.php150
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/readability-read.json25
-rw-r--r--tests/Wallabag/ImportBundle/fixtures/readability.json25
45 files changed, 1007 insertions, 56 deletions
diff --git a/.travis.yml b/.travis.yml
index 65e7e304..c343d5ae 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -62,6 +62,7 @@ matrix:
62 env: DB=sqlite ASSETS=build 62 env: DB=sqlite ASSETS=build
63 allow_failures: 63 allow_failures:
64 - php: hhvm-3.12 64 - php: hhvm-3.12
65 - php: 7.1
65 - php: nightly 66 - php: nightly
66 67
67# exclude v1 branches 68# exclude v1 branches
diff --git a/app/Resources/static/themes/material/css/main.css b/app/Resources/static/themes/material/css/main.css
index b81335eb..d3cd1244 100755
--- a/app/Resources/static/themes/material/css/main.css
+++ b/app/Resources/static/themes/material/css/main.css
@@ -91,6 +91,7 @@ body {
91 91
92body.login main { 92body.login main {
93 padding: 0; 93 padding: 0;
94 min-height: 100vh;
94} 95}
95 96
96.border-bottom { 97.border-bottom {
@@ -256,6 +257,10 @@ nav input {
256 display: none; 257 display: none;
257} 258}
258 259
260input-field.nav-panel-add, .input-field.nav-panel-add form {
261 height: 100%;
262}
263
259/* ========================================================================== 264/* ==========================================================================
260 2 = Side-nav 265 2 = Side-nav
261 ========================================================================== */ 266 ========================================================================== */
@@ -342,6 +347,12 @@ main ul.row {
342 347
343.card .card-content .card-title { 348.card .card-content .card-title {
344 line-height: 32px; 349 line-height: 32px;
350 max-height: 64px;
351 display: block;
352}
353
354.card .card-content i.right, .card .card-reveal i.right {
355 margin-left: 0;
345} 356}
346 357
347.card .card-entry-labels { 358.card .card-entry-labels {
diff --git a/docs/de/conf.py b/docs/de/conf.py
new file mode 100644
index 00000000..8f2d130d
--- /dev/null
+++ b/docs/de/conf.py
@@ -0,0 +1,55 @@
1# -*- coding: utf-8 -*-
2#
3# wallabag documentation build configuration file, created by
4# sphinx-quickstart on Fri Oct 16 06:47:23 2015.
5
6import sys
7import os
8
9extensions = []
10templates_path = ['_templates']
11source_suffix = '.rst'
12master_doc = 'index'
13project = u'wallabag-fr'
14copyright = u'2013-2016, Nicolas Lœuillet - MIT Licence'
15version = '2.0.0'
16release = version
17exclude_patterns = ['_build']
18pygments_style = 'sphinx'
19html_theme = 'default'
20html_static_path = ['_static']
21htmlhelp_basename = 'wallabagdedoc'
22
23latex_elements = {
24}
25
26latex_documents = [
27 ('index', 'wallabag-de.tex', u'wallabag Documentation',
28 u'Nicolas Lœuillet', 'manual'),
29]
30
31man_pages = [
32 ('index', 'wallabagde', u'wallabag Documentation',
33 [u'Nicolas Lœuillet'], 1)
34]
35
36texinfo_documents = [
37 ('index', 'wallabag', u'wallabag Documentation',
38 u'Nicolas Lœuillet', 'wallabag', 'wallabag is an opensource read-it-later.',
39 'Miscellaneous'),
40]
41
42##### Guzzle sphinx theme
43
44import guzzle_sphinx_theme
45html_translator_class = 'guzzle_sphinx_theme.HTMLTranslator'
46html_theme_path = guzzle_sphinx_theme.html_theme_path()
47html_theme = 'guzzle_sphinx_theme'
48
49# Custom sidebar templates, maps document names to template names.
50html_sidebars = {
51 '**': ['logo-text.html', 'globaltoc.html', 'searchbox.html']
52}
53
54# Register the theme as an extension to generate a sitemap.xml
55extensions.append("guzzle_sphinx_theme")
diff --git a/docs/de/requirements.txt b/docs/de/requirements.txt
new file mode 100644
index 00000000..06fc8973
--- /dev/null
+++ b/docs/de/requirements.txt
@@ -0,0 +1,2 @@
1Sphinx>=1.3.0,<1.4.0
2guzzle_sphinx_theme>=0.7.0,<0.8.0
diff --git a/docs/de/user/errors_during_fetching.rst b/docs/de/user/errors_during_fetching.rst
index b8e3e999..29621559 100644
--- a/docs/de/user/errors_during_fetching.rst
+++ b/docs/de/user/errors_during_fetching.rst
@@ -12,7 +12,7 @@ Das kann verschiedene Ursachen haben:
12Wie kann ich helfen das zu beheben? 12Wie kann ich helfen das zu beheben?
13----------------------------------- 13-----------------------------------
14 14
15- `indem du uns eine Mail mit der URL des Artikels sendest <mailto:hello\@wallabag.org>`_ 15- `indem du uns eine Mail mit der URL des Artikels sendest <mailto:hello@wallabag.org>`_
16- indem du versuchst das Laden des Artikels durch Erstellen einer Datei für den Artikel 16- indem du versuchst das Laden des Artikels durch Erstellen einer Datei für den Artikel
17 selbst zu beheben 17 selbst zu beheben
18 Du kannst `dieses Tool <http://siteconfig.fivefilters.org/>`__ nutzen. 18 Du kannst `dieses Tool <http://siteconfig.fivefilters.org/>`__ nutzen.
diff --git a/docs/en/user/errors_during_fetching.rst b/docs/en/user/errors_during_fetching.rst
index da6ee745..68892750 100644
--- a/docs/en/user/errors_during_fetching.rst
+++ b/docs/en/user/errors_during_fetching.rst
@@ -12,7 +12,7 @@ There may be several reasons:
12How can I help to fix that? 12How can I help to fix that?
13--------------------------- 13---------------------------
14 14
15- `by sending us an email with the article's URL <mailto:hello\@wallabag.org>`_ 15- `by sending us an email with the article's URL <mailto:hello@wallabag.org>`_
16- by trying to fix this article by yourself :) by creating a file for the article. 16- by trying to fix this article by yourself :) by creating a file for the article.
17 You can use `this tool <http://siteconfig.fivefilters.org/>`__. 17 You can use `this tool <http://siteconfig.fivefilters.org/>`__.
18 18
diff --git a/docs/en/user/import.rst b/docs/en/user/import.rst
index 63210484..e6c37d72 100644
--- a/docs/en/user/import.rst
+++ b/docs/en/user/import.rst
@@ -30,14 +30,25 @@ You need to authorize wallabag to interact with your Pocket account.
30Your data will be imported. Data import can be a demanding process for your server 30Your data will be imported. Data import can be a demanding process for your server
31(we need to work on this import to improve it). 31(we need to work on this import to improve it).
32 32
33From Instapaper
34---------------
35
36*Feature not yet implemented in wallabag v2.*
37
38From Readability 33From Readability
39---------------- 34----------------
40 35
36Export your Readability data
37~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38
39On the tools (`https://www.readability.com/tools/<https://www.readability.com/tools/>`_) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).
40
41Import your data into wallabag 2.x
42~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43
44Click on ``Import`` link in the menu, on ``Import contents`` in Readability section
45and then select your json file and upload it.
46
47Your data will be imported. Data import can be a demanding process for your server (we need to work on this import to improve it).
48
49From Instapaper
50---------------
51
41*Feature not yet implemented in wallabag v2.* 52*Feature not yet implemented in wallabag v2.*
42 53
43From HTML or JSON file 54From HTML or JSON file
diff --git a/docs/fr/user/errors_during_fetching.rst b/docs/fr/user/errors_during_fetching.rst
index 0f26fbc8..74290bef 100644
--- a/docs/fr/user/errors_during_fetching.rst
+++ b/docs/fr/user/errors_during_fetching.rst
@@ -12,7 +12,7 @@ Il peut y avoir plusieurs raisons :
12Comment puis-je aider pour réparer ça ? 12Comment puis-je aider pour réparer ça ?
13--------------------------------------- 13---------------------------------------
14 14
15- `en nous envoyant un email avec l'URL de l'article <mailto:hello\@wallabag.org>`_ 15- `en nous envoyant un email avec l'URL de l'article <mailto:hello@wallabag.org>`_
16- en essayant de réparer cet article par vous-même :) en créant un fichier pour l'article. 16- en essayant de réparer cet article par vous-même :) en créant un fichier pour l'article.
17 Vous pouvez utiliser `cet outil <http://siteconfig.fivefilters.org/>`__. 17 Vous pouvez utiliser `cet outil <http://siteconfig.fivefilters.org/>`__.
18 18
diff --git a/docs/fr/user/import.rst b/docs/fr/user/import.rst
index e6c2fa02..99ac602b 100644
--- a/docs/fr/user/import.rst
+++ b/docs/fr/user/import.rst
@@ -30,15 +30,27 @@ Vous devez autoriser wallabag à se connecter à votre compte Pocket.
30Vos données vont être importées. L'import de données est une action qui peut être couteuse 30Vos données vont être importées. L'import de données est une action qui peut être couteuse
31pour votre serveur (nous devons encore travailler pour améliorer cet import). 31pour votre serveur (nous devons encore travailler pour améliorer cet import).
32 32
33Depuis Readability
34------------------
35
36Exportez vos données de Readability
37~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38
39Sur la page des outils (`https://www.readability.com/tools/<https://www.readability.com/tools/>`_), cliquez sur "Export your data" dans la section "Data Export". Vous allez recevoir un email avec un lien pour télécharger le json.
40
41Importez vos données dans wallabag 2.x
42~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43
44Cliquez sur le lien ``Importer`` dans le menu, sur ``Importer les contenus`` dans
45la section Readability et ensuite sélectionnez votre fichier json pour l'uploader.
46
47Vos données vont être importées. L'import de données est une action qui peut être couteuse pour votre serveur (nous devons encore travailler pour améliorer cet import).
48
33Depuis Instapaper 49Depuis Instapaper
34----------------- 50-----------------
35 51
36*Fonctionnalité pas encore implémentée dans wallabag v2.* 52*Fonctionnalité pas encore implémentée dans wallabag v2.*
37 53
38Depuis Readability
39------------------
40
41*Fonctionnalité pas encore implémentée dans wallabag v2.*
42 54
43Depuis un fichier HTML ou JSON 55Depuis un fichier HTML ou JSON
44------------------------------ 56------------------------------
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index d71ba6cd..624576b5 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -226,6 +226,10 @@ class EntryController extends Controller
226 $repository = $this->get('wallabag_core.entry_repository'); 226 $repository = $this->get('wallabag_core.entry_repository');
227 227
228 switch ($type) { 228 switch ($type) {
229 case 'untagged':
230 $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId());
231
232 break;
229 case 'starred': 233 case 'starred':
230 $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId()); 234 $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId());
231 break; 235 break;
@@ -523,4 +527,19 @@ class EntryController extends Controller
523 ['entry' => $entry] 527 ['entry' => $entry]
524 ); 528 );
525 } 529 }
530
531 /**
532 * Shows untagged articles for current user.
533 *
534 * @param Request $request
535 * @param int $page
536 *
537 * @Route("/untagged/list/{page}", name="untagged", defaults={"page" = "1"})
538 *
539 * @return \Symfony\Component\HttpFoundation\Response
540 */
541 public function showUntaggedEntriesAction(Request $request, $page)
542 {
543 return $this->showEntries('untagged', $request, $page);
544 }
526} 545}
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php
index 959b308d..6191d5d7 100644
--- a/src/Wallabag/CoreBundle/Controller/ExportController.php
+++ b/src/Wallabag/CoreBundle/Controller/ExportController.php
@@ -46,7 +46,7 @@ class ExportController extends Controller
46 * 46 *
47 * @Route("/export/{category}.{format}", name="export_entries", requirements={ 47 * @Route("/export/{category}.{format}", name="export_entries", requirements={
48 * "format": "epub|mobi|pdf|json|xml|txt|csv", 48 * "format": "epub|mobi|pdf|json|xml|txt|csv",
49 * "category": "all|unread|starred|archive|tag_entries" 49 * "category": "all|unread|starred|archive|tag_entries|untagged"
50 * }) 50 * })
51 * 51 *
52 * @return \Symfony\Component\HttpFoundation\Response 52 * @return \Symfony\Component\HttpFoundation\Response
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
index fada40bb..e5c21679 100644
--- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php
+++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
@@ -85,6 +85,22 @@ class EntryRepository extends EntityRepository
85 } 85 }
86 86
87 /** 87 /**
88 * Retrieves untagged entries for a user.
89 *
90 * @param int $userId
91 *
92 * @return QueryBuilder
93 */
94 public function getBuilderForUntaggedByUser($userId)
95 {
96 return $this
97 ->getBuilderByUser($userId)
98 ->leftJoin('e.tags', 't')
99 ->groupBy('e.id')
100 ->having('count(t.id) = 0');
101 }
102
103 /**
88 * Find Entries. 104 * Find Entries.
89 * 105 *
90 * @param int $userId 106 * @param int $userId
diff --git a/src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.js b/src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.js
new file mode 100644
index 00000000..bf9eadef
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.js
@@ -0,0 +1,103 @@
1/*
2 * jQuery tinydot 0.2.0
3 *
4 * Copyright (c) Alexander Danilov
5 * modos189.ru
6 *
7 * Plugin website:
8 * tinydot.modos189.ru
9 *
10 * Licensed under the MIT license.
11 * http://en.wikipedia.org/wiki/MIT_License
12 */
13
14(function( $, undef )
15{
16 if ( $.fn.tinydot )
17 {
18 return;
19 }
20
21 $.fn.tinydot = function( o ) {
22
23 var $dot = this;
24 $dot.child = getChildOrDie($dot);
25 $dot.orgContent = $($dot.child).html();
26 ellipsis( $dot );
27
28 $dot.watch = function()
29 {
30 $(window).on('resize', function(){
31 if ( watchInt )
32 {
33 clearInterval( watchInt );
34 }
35 watchInt = setTimeout(
36 function()
37 {
38 reinitialize($dot);
39 }, 100
40 );
41 });
42
43 return $dot;
44 };
45
46 var opts = $.extend( true, {}, $.fn.tinydot.defaults, o ),
47 watchInt = null;
48
49 if ( opts.watch )
50 {
51 $dot.watch();
52 }
53 }
54
55 // public
56 $.fn.tinydot.defaults = {
57 'watch' : false
58 };
59
60 function getChildOrDie( $elem )
61 {
62 var childrens = $elem.children();
63 if (childrens.length == 0) {
64 // create children
65 var data = $($elem).html();
66 $elem.html('');
67 $elem.append('<span />');
68 return $elem.children('span').html(data);
69 } else {
70 return childrens[0];
71 }
72 }
73
74 function reinitialize( $elem )
75 {
76 $($elem.child).html($elem.orgContent);
77 ellipsis( $elem );
78 }
79
80 function ellipsis( $elem ) {
81 var divh=$($elem).height();
82 while ($($elem.child).outerHeight()>divh) {
83 $($elem.child).html(function (index, html) {
84 return html.replace(/\W*\s(\S)*$/, '...');
85 });
86 }
87 }
88
89})( jQuery );
90
91jQuery(document).ready(function($) {
92 //We only invoke jQuery.tinydot on elements that have dot-ellipsis class
93 $(".dot-ellipsis").each(function(){
94 //Checking if update on window resize required
95 var watch_window=$(this).hasClass("dot-resize-update");
96
97 //Invoking jQuery.tinydot
98 var x = new Object();
99 if (watch_window)
100 x.watch='window';
101 $(this).tinydot(x);
102 });
103});
diff --git a/src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.min.js b/src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.min.js
new file mode 100644
index 00000000..74754629
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Resources/public/themes/material/js/jquery.tinydot.min.js
@@ -0,0 +1 @@
!function(a,b){function c(b){var c=b.children();if(0==c.length){var d=a(b).html();return b.html(""),b.append("<span />"),b.children("span").html(d)}return c[0]}function d(b){a(b.child).html(b.orgContent),e(b)}function e(b){for(var c=a(b).height();a(b.child).outerHeight()>c;)a(b.child).html(function(a,b){return b.replace(/\W*\s(\S)*$/,"...")})}a.fn.tinydot||(a.fn.tinydot=function(b){var f=this;f.child=c(f),f.orgContent=a(f.child).html(),e(f),f.watch=function(){return a(window).on("resize",function(){h&&clearInterval(h),h=setTimeout(function(){d(f)},100)}),f};var g=a.extend(!0,{},a.fn.tinydot.defaults,b),h=null;g.watch&&f.watch()},a.fn.tinydot.defaults={watch:!1})}(jQuery),jQuery(document).ready(function(a){a(".dot-ellipsis").each(function(){var b=a(this).hasClass("dot-resize-update"),c=new Object;b&&(c.watch="window"),a(this).tinydot(c)})});
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
index f9b7bfac..073dee28 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
@@ -140,6 +140,7 @@ entry:
140 # archived: 'Archived entries' 140 # archived: 'Archived entries'
141 # filtered: 'Filtered entries' 141 # filtered: 'Filtered entries'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.' 145 # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
145 reading_time: 'estimeret læsetid' 146 reading_time: 'estimeret læsetid'
@@ -291,6 +292,7 @@ quickstart:
291 # pocket: 'Migrate from Pocket' 292 # pocket: 'Migrate from Pocket'
292 # wallabag_v1: 'Migrate from wallabag v1' 293 # wallabag_v1: 'Migrate from wallabag v1'
293 # wallabag_v2: 'Migrate from wallabag v2' 294 # wallabag_v2: 'Migrate from wallabag v2'
295 # readability: 'Migrate from Readability'
294 # developer: 296 # developer:
295 # title: 'Developers' 297 # title: 'Developers'
296 # create_application: 'Create your third application' 298 # create_application: 'Create your third application'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Tags' 314 page_title: 'Tags'
313 list: 315 list:
314 # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.' 316 # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.'
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 # page_title: 'Import' 320 # page_title: 'Import'
@@ -339,6 +342,10 @@ import:
339 # wallabag_v2: 342 # wallabag_v2:
340 # page_title: 'Import > Wallabag v2' 343 # page_title: 'Import > Wallabag v2'
341 # 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.' 344 # 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.'
345 # readability:
346 # page_title: 'Import > Readability'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 # page_title: 'Developer' 351 # page_title: 'Developer'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
index 79d03286..4cfd240f 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
@@ -140,6 +140,7 @@ entry:
140 archived: 'Archivierte Einträge' 140 archived: 'Archivierte Einträge'
141 filtered: 'Gefilterte Einträge' 141 filtered: 'Gefilterte Einträge'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 number_on_the_page: '{0} Es gibt keine Einträge.|{1} Es gibt einen Eintrag.|]1,Inf[ Es gibt %count% Einträge.' 145 number_on_the_page: '{0} Es gibt keine Einträge.|{1} Es gibt einen Eintrag.|]1,Inf[ Es gibt %count% Einträge.'
145 reading_time: 'geschätzte Lesezeit' 146 reading_time: 'geschätzte Lesezeit'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'von Pocket migrieren' 292 pocket: 'von Pocket migrieren'
292 wallabag_v1: 'von wallabag v1 migrieren' 293 wallabag_v1: 'von wallabag v1 migrieren'
293 wallabag_v2: 'von wallabag v2 migrieren' 294 wallabag_v2: 'von wallabag v2 migrieren'
295 readability: 'von Readability migrieren'
294 developer: 296 developer:
295 title: 'Entwickler' 297 title: 'Entwickler'
296 create_application: 'Erstelle eine Anwendung und nutze die wallabag API' 298 create_application: 'Erstelle eine Anwendung und nutze die wallabag API'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Tags' 314 page_title: 'Tags'
313 list: 315 list:
314 number_on_the_page: '{0} Es gibt keine Tags.|{1} Es gibt einen Tag.|]1,Inf[ Es gibt %count% Tags.' 316 number_on_the_page: '{0} Es gibt keine Tags.|{1} Es gibt einen Tag.|]1,Inf[ Es gibt %count% Tags.'
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 page_title: 'Importieren' 320 page_title: 'Importieren'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'Aus wallabag v2 importieren' 343 page_title: 'Aus wallabag v2 importieren'
341 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.' 344 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.'
345 readability:
346 page_title: 'Aus Readability importieren'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 page_title: 'Entwickler' 351 page_title: 'Entwickler'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
index d921b39f..42374b40 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
@@ -140,6 +140,7 @@ entry:
140 archived: 'Archived entries' 140 archived: 'Archived entries'
141 filtered: 'Filtered entries' 141 filtered: 'Filtered entries'
142 filtered_tags: 'Filtered by tags' 142 filtered_tags: 'Filtered by tags'
143 untagged: 'Untagged entries'
143 list: 144 list:
144 number_on_the_page: '{0} There are no entries.|{1} There is one entry.|]1,Inf[ There are %count% entries.' 145 number_on_the_page: '{0} There are no entries.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
145 reading_time: 'estimated reading time' 146 reading_time: 'estimated reading time'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'Migrate from Pocket' 292 pocket: 'Migrate from Pocket'
292 wallabag_v1: 'Migrate from wallabag v1' 293 wallabag_v1: 'Migrate from wallabag v1'
293 wallabag_v2: 'Migrate from wallabag v2' 294 wallabag_v2: 'Migrate from wallabag v2'
295 readability: 'Migrate from Readability'
294 developer: 296 developer:
295 title: 'Developers' 297 title: 'Developers'
296 create_application: 'Create your third application' 298 create_application: 'Create your third application'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Tags' 314 page_title: 'Tags'
313 list: 315 list:
314 number_on_the_page: '{0} There are no tags.|{1} There is one tag.|]1,Inf[ There are %count% tags.' 316 number_on_the_page: '{0} There are no tags.|{1} There is one tag.|]1,Inf[ There are %count% tags.'
317 see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 page_title: 'Import' 320 page_title: 'Import'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'Import > Wallabag v2' 343 page_title: 'Import > Wallabag v2'
341 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.' 344 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.'
345 readability:
346 page_title: 'Import > Readability'
347 description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 page_title: 'Developer' 351 page_title: 'Developer'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
index c2ec4dbd..ee84cc62 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
@@ -140,6 +140,7 @@ entry:
140 archived: 'Artículos archivados' 140 archived: 'Artículos archivados'
141 filtered: 'Artículos filtrados' 141 filtered: 'Artículos filtrados'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 number_on_the_page: '{0} No hay artículos.|{1} Hay un artículo.|]1,Inf[ Hay %count% artículos.' 145 number_on_the_page: '{0} No hay artículos.|{1} Hay un artículo.|]1,Inf[ Hay %count% artículos.'
145 reading_time: 'tiempo estimado de lectura' 146 reading_time: 'tiempo estimado de lectura'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'Migrar desde Pocket' 292 pocket: 'Migrar desde Pocket'
292 wallabag_v1: 'Migrar desde wallabag v1' 293 wallabag_v1: 'Migrar desde wallabag v1'
293 wallabag_v2: 'Migrar desde wallabag v2' 294 wallabag_v2: 'Migrar desde wallabag v2'
295 readability: 'Migrar desde Readability'
294 developer: 296 developer:
295 title: 'Promotores' 297 title: 'Promotores'
296 create_application: 'Cree su tercera aplicación' 298 create_application: 'Cree su tercera aplicación'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Etiquetas' 314 page_title: 'Etiquetas'
313 list: 315 list:
314 number_on_the_page: '{0} No hay ninguna etiqueta.|{1} Hay una etiqueta.|]1,Inf[ Hay %count% etiquetas.' 316 number_on_the_page: '{0} No hay ninguna etiqueta.|{1} Hay una etiqueta.|]1,Inf[ Hay %count% etiquetas.'
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 page_title: 'Importar' 320 page_title: 'Importar'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'Importar > Wallabag v2' 343 page_title: 'Importar > Wallabag v2'
341 description: 'Va a importar sus artículos de otra instancia de wallabag v2. Vaya a Todos los artículos, entonces, en la barra lateral, oprima en "JSON". Usted tendrá un fichero "All articles.json"' 344 description: 'Va a importar sus artículos de otra instancia de wallabag v2. Vaya a Todos los artículos, entonces, en la barra lateral, oprima en "JSON". Usted tendrá un fichero "All articles.json"'
345 readability:
346 page_title: 'Importar > Readability'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 page_title: 'Promotor' 351 page_title: 'Promotor'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
index 561ed907..e9af1e8d 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
@@ -140,6 +140,7 @@ entry:
140 archived: 'مقاله‌های بایگانی‌شده' 140 archived: 'مقاله‌های بایگانی‌شده'
141 filtered: 'مقاله‌های فیلترشده' 141 filtered: 'مقاله‌های فیلترشده'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 number_on_the_page: '{0} هیج مقاله‌ای نیست.|{1} یک مقاله هست.|]1,Inf[ %count% مقاله هست.' 145 number_on_the_page: '{0} هیج مقاله‌ای نیست.|{1} یک مقاله هست.|]1,Inf[ %count% مقاله هست.'
145 reading_time: 'زمان تخمینی برای خواندن' 146 reading_time: 'زمان تخمینی برای خواندن'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'مهاجرت از Pocket' 292 pocket: 'مهاجرت از Pocket'
292 wallabag_v1: 'مهاجرت از نسخهٔ یکم wallabag' 293 wallabag_v1: 'مهاجرت از نسخهٔ یکم wallabag'
293 wallabag_v2: 'مهاجرت از نسخهٔ دوم wallabag' 294 wallabag_v2: 'مهاجرت از نسخهٔ دوم wallabag'
295 readability: 'مهاجرت از نسخهٔ دوم Readability'
294 developer: 296 developer:
295 title: 'برنامه‌نویسان' 297 title: 'برنامه‌نویسان'
296 create_application: 'برنامهٔ wallabag خود را بسازید' 298 create_application: 'برنامهٔ wallabag خود را بسازید'
@@ -312,18 +314,19 @@ tag:
312 page_title: 'برچسب‌ها' 314 page_title: 'برچسب‌ها'
313 list: 315 list:
314 number_on_the_page: '{0} هیچ برچسبی نیست.|{1} یک برچسب هست.|]1,Inf[ %count% برچسب هست.' 316 number_on_the_page: '{0} هیچ برچسبی نیست.|{1} یک برچسب هست.|]1,Inf[ %count% برچسب هست.'
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 page_title: 'درون‌ریزی' 320 page_title: 'درون‌ریزی'
318 page_description: 'به درون‌ریز wallabag خوش آمدید. لطفاً سرویس قبلی خود را که می‌خواهید از آن مهاجرت کنید انتخاب کنید.' 321 page_description: 'به درون‌ریز wallabag خوش آمدید. لطفاً سرویس قبلی خود را که می‌خواهید از آن مهاجرت کنید انتخاب کنید.'
319 action: 322 action:
320 import_contents: 'درون‌ریزی مقاله‌ها' 323 import_contents: 'درون‌ریزی مقاله‌ها'
321 form: 324 form:
322 mark_as_read_title: 'علامت‌زدن همه به عنوان خوانده‌شده؟' 325 mark_as_read_title: 'علامت‌زدن همه به عنوان خوانده‌شده؟'
323 mark_as_read_label: 'همهٔ مقاله‌های درون‌ریزی شده را به عنوان خوانده‌شده علامت بزن' 326 mark_as_read_label: 'همهٔ مقاله‌های درون‌ریزی شده را به عنوان خوانده‌شده علامت بزن'
324 file_label: 'پرونده' 327 file_label: 'پرونده'
325 save_label: 'بارگذاری پرونده' 328 save_label: 'بارگذاری پرونده'
326 pocket: 329 pocket:
327 page_title: 'درون‌ریزی > Pocket' 330 page_title: 'درون‌ریزی > Pocket'
328 description: "این برنامه همهٔ داده‌های Pocket شما را درون‌ریزی می‌کند. سرویس Pocket اجازه نمی‌دهد که متن مقاله‌ها را درون‌ریزی کنیم، بنابراین wallabag متن مقاله‌ها را دوباره از اینترنت دریافت می‌کند." 331 description: "این برنامه همهٔ داده‌های Pocket شما را درون‌ریزی می‌کند. سرویس Pocket اجازه نمی‌دهد که متن مقاله‌ها را درون‌ریزی کنیم، بنابراین wallabag متن مقاله‌ها را دوباره از اینترنت دریافت می‌کند."
329 config_missing: 332 config_missing:
@@ -332,13 +335,17 @@ import:
332 user_message: 'مدیر سرور شما باید یک API Key برای Pocket تعریف کند.' 335 user_message: 'مدیر سرور شما باید یک API Key برای Pocket تعریف کند.'
333 authorize_message: 'شما می‌توانید داده‌هایتان را از حساب Pocket خود درون‌ریزی کنید. روی دکمهٔ زیر کلیک کنید و به برنامه اجازه دهید تا به getpocket.com وصل شود.' 336 authorize_message: 'شما می‌توانید داده‌هایتان را از حساب Pocket خود درون‌ریزی کنید. روی دکمهٔ زیر کلیک کنید و به برنامه اجازه دهید تا به getpocket.com وصل شود.'
334 connect_to_pocket: 'به Pocket وصل شو و داده‌ها را دریافت کن' 337 connect_to_pocket: 'به Pocket وصل شو و داده‌ها را دریافت کن'
335 wallabag_v1: 338 wallabag_v1:
336 page_title: 'درون‌ریزی > Wallabag v1' 339 page_title: 'درون‌ریزی > Wallabag v1'
337 description: 'این برنامه همهٔ داده‌های شما را در نسخهٔ ۱ wallabag درون‌ریزی می‌کند. در صفحهٔ تنظیمات، روی "JSON export" در بخش "Export your wallabag data" کلیک کنید. با این کار شما پرونده‌ای به شکل "wallabag-export-1-xxxx-xx-xx.json" دریافت خواهید کرد.' 340 description: 'این برنامه همهٔ داده‌های شما را در نسخهٔ ۱ wallabag درون‌ریزی می‌کند. در صفحهٔ تنظیمات، روی "JSON export" در بخش "Export your wallabag data" کلیک کنید. با این کار شما پرونده‌ای به شکل "wallabag-export-1-xxxx-xx-xx.json" دریافت خواهید کرد.'
338 how_to: 'لطفاً پرونده را انتخاب کنید و روی دکمهٔ زیر کلیک کنید تا بارگذاری و درون‌ریزی شود.' 341 how_to: 'لطفاً پرونده را انتخاب کنید و روی دکمهٔ زیر کلیک کنید تا بارگذاری و درون‌ریزی شود.'
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'درون‌ریزی > Wallabag v2' 343 page_title: 'درون‌ریزی > Wallabag v2'
341 description: 'این برنامه همهٔ داده‌های شما را در نسخهٔ ۲ wallabag درون‌ریزی می‌کند. به بخش «همهٔ مقاله‌ها» بروید و در بخش «برون‌ریزی» روی "JSON" کلیک کنید. با این کار شما پرونده‌ای به شکل "All articles.json" دریافت خواهید کرد.' 344 description: 'این برنامه همهٔ داده‌های شما را در نسخهٔ ۲ wallabag درون‌ریزی می‌کند. به بخش «همهٔ مقاله‌ها» بروید و در بخش «برون‌ریزی» روی "JSON" کلیک کنید. با این کار شما پرونده‌ای به شکل "All articles.json" دریافت خواهید کرد.'
345 readability:
346 page_title: 'درون‌ریزی > Readability'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 # page_title: 'Developer' 351 # page_title: 'Developer'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index c0671883..402cdf4a 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -140,6 +140,7 @@ entry:
140 archived: 'Articles lus' 140 archived: 'Articles lus'
141 filtered: 'Articles filtrés' 141 filtered: 'Articles filtrés'
142 filtered_tags: 'Articles filtrés par tags' 142 filtered_tags: 'Articles filtrés par tags'
143 untagged: 'Article sans tag'
143 list: 144 list:
144 number_on_the_page: "{0} Il n'y a pas d'articles.|{1} Il y a un article.|]1,Inf[ Il y a %count% articles." 145 number_on_the_page: "{0} Il n'y a pas d'articles.|{1} Il y a un article.|]1,Inf[ Il y a %count% articles."
145 reading_time: 'durée de lecture' 146 reading_time: 'durée de lecture'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'Migrer depuis Pocket' 292 pocket: 'Migrer depuis Pocket'
292 wallabag_v1: 'Migrer depuis wallabag v1' 293 wallabag_v1: 'Migrer depuis wallabag v1'
293 wallabag_v2: 'Migrer depuis wallabag v2' 294 wallabag_v2: 'Migrer depuis wallabag v2'
295 readability: 'Migrer depuis Readability'
294 developer: 296 developer:
295 title: 'Pour les développeurs' 297 title: 'Pour les développeurs'
296 create_application: 'Créer votre application tierce' 298 create_application: 'Créer votre application tierce'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Tags' 314 page_title: 'Tags'
313 list: 315 list:
314 number_on_the_page: "{0} Il n'y a pas de tag.|{1} Il y a un tag.|]1,Inf[ Il y a %count% tags." 316 number_on_the_page: "{0} Il n'y a pas de tag.|{1} Il y a un tag.|]1,Inf[ Il y a %count% tags."
317 see_untagged_entries: 'Voir les articles sans tag'
315 318
316import: 319import:
317 page_title: 'Importer' 320 page_title: 'Importer'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'Importer > Wallabag v2' 343 page_title: 'Importer > Wallabag v2'
341 description: "Cet outil va importer tous vos articles d'une autre instance de wallabag v2. Allez dans tous vos articles, puis, sur la barre latérale, cliquez sur \"JSON\". Vous allez récupérer un fichier \"All articles.json\"" 344 description: "Cet outil va importer tous vos articles d'une autre instance de wallabag v2. Allez dans tous vos articles, puis, sur la barre latérale, cliquez sur \"JSON\". Vous allez récupérer un fichier \"All articles.json\""
345 readability:
346 page_title: 'Importer > Readability'
347 description: 'Cet outil va importer toutes vos données de Readability. Sur la page des outils (https://www.readability.com/tools/), cliquez sur "Export your data" dans la section "Data Export". Vous allez recevoir un email avec un lien pour télécharger le json.'
348 how_to: "Choisissez le fichier de votre export Readability et cliquez sur le bouton ci-dessous pour l'importer."
342 349
343developer: 350developer:
344 page_title: 'Développeur' 351 page_title: 'Développeur'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
index 2e3dd08b..3aee4816 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
@@ -139,6 +139,8 @@ entry:
139 starred: 'Contenuti preferiti' 139 starred: 'Contenuti preferiti'
140 archived: 'Contenuti archiviati' 140 archived: 'Contenuti archiviati'
141 filtered: 'Contenuti filtrati' 141 filtered: 'Contenuti filtrati'
142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
142 list: 144 list:
143 number_on_the_page: "{0} Non ci sono contenuti.|{1} C'è un contenuto.|]1,Inf[ Ci sono %count% contenuti." 145 number_on_the_page: "{0} Non ci sono contenuti.|{1} C'è un contenuto.|]1,Inf[ Ci sono %count% contenuti."
144 reading_time: 'tempo di lettura stimato' 146 reading_time: 'tempo di lettura stimato'
@@ -289,6 +291,7 @@ quickstart:
289 pocket: 'Trasferisci da Pocket' 291 pocket: 'Trasferisci da Pocket'
290 wallabag_v1: 'Trasferisci da wallabag v1' 292 wallabag_v1: 'Trasferisci da wallabag v1'
291 wallabag_v2: 'Trasferisci da wallabag v2' 293 wallabag_v2: 'Trasferisci da wallabag v2'
294 readability: 'Trasferisci da Readability'
292 developer: 295 developer:
293 title: 'Sviluppatori' 296 title: 'Sviluppatori'
294 create_application: 'Crea la tua applicazione' 297 create_application: 'Crea la tua applicazione'
@@ -310,6 +313,7 @@ tag:
310 page_title: 'Tags' 313 page_title: 'Tags'
311 list: 314 list:
312 number_on_the_page: "{0} Non ci sono tag.|{1} C'è un tag.|]1,Inf[ ci sono %count% tag." 315 number_on_the_page: "{0} Non ci sono tag.|{1} C'è un tag.|]1,Inf[ ci sono %count% tag."
316 # see_untagged_entries: 'See untagged entries'
313 317
314import: 318import:
315 page_title: 'Importa' 319 page_title: 'Importa'
@@ -337,6 +341,10 @@ import:
337 wallabag_v2: 341 wallabag_v2:
338 page_title: 'Importa da > Wallabag v2' 342 page_title: 'Importa da > Wallabag v2'
339 description: 'Questo importatore copierà tutti i tuoi dati da un wallabag v2. Vai in "Tutti i contenuti", e, nella sidebar di esportazione, clicca su "JSON". Otterrai un file "Tutti i contenuti.json".' 343 description: 'Questo importatore copierà tutti i tuoi dati da un wallabag v2. Vai in "Tutti i contenuti", e, nella sidebar di esportazione, clicca su "JSON". Otterrai un file "Tutti i contenuti.json".'
344 readability:
345 page_title: 'Importa da > Readability'
346 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
347 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
340 348
341developer: 349developer:
342 page_title: 'Sviluppatori' 350 page_title: 'Sviluppatori'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
index 7b978a60..855f2361 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
@@ -140,6 +140,7 @@ entry:
140 archived: 'Articles legits' 140 archived: 'Articles legits'
141 filtered: 'Articles filtrats' 141 filtered: 'Articles filtrats'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 number_on_the_page: "{0} I a pas cap d'article.|{1} I a un article.|]1,Inf[ I a %count% articles." 145 number_on_the_page: "{0} I a pas cap d'article.|{1} I a un article.|]1,Inf[ I a %count% articles."
145 reading_time: 'durada de lectura' 146 reading_time: 'durada de lectura'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'Migrar dempuèi Pocket' 292 pocket: 'Migrar dempuèi Pocket'
292 wallabag_v1: 'Migrar dempuèi wallabag v1' 293 wallabag_v1: 'Migrar dempuèi wallabag v1'
293 wallabag_v2: 'Migrar dempuèi wallabag v2' 294 wallabag_v2: 'Migrar dempuèi wallabag v2'
295 readability: 'Migrar dempuèi Readability'
294 developer: 296 developer:
295 title: 'Pels desvolopadors' 297 title: 'Pels desvolopadors'
296 create_application: 'Crear vòstra aplicacion tèrça' 298 create_application: 'Crear vòstra aplicacion tèrça'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Etiquetas' 314 page_title: 'Etiquetas'
313 list: 315 list:
314 number_on_the_page: "{0} I a pas cap d'etiquetas.|{1} I a una etiqueta.|]1,Inf[ I a %count% etiquetas." 316 number_on_the_page: "{0} I a pas cap d'etiquetas.|{1} I a una etiqueta.|]1,Inf[ I a %count% etiquetas."
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 page_title: 'Importar' 320 page_title: 'Importar'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'Importer > Wallabag v2' 343 page_title: 'Importer > Wallabag v2'
341 description: "Aquesta aisina importarà totas vòstras donadas d'una instància mai de wallabag v2. Anatz dins totes vòstres articles, puèi, sus la barra laterala, clicatz sus \"JSON\". Traparatz un fichièr \"All articles.json\"" 344 description: "Aquesta aisina importarà totas vòstras donadas d'una instància mai de wallabag v2. Anatz dins totes vòstres articles, puèi, sus la barra laterala, clicatz sus \"JSON\". Traparatz un fichièr \"All articles.json\""
345 readability:
346 page_title: 'Importer > Readability'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 page_title: 'Desvolopador' 351 page_title: 'Desvolopador'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
index da170e4d..da50cd4c 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
@@ -139,13 +139,14 @@ entry:
139 starred: 'Wpisy oznaczone gwiazdką' 139 starred: 'Wpisy oznaczone gwiazdką'
140 archived: 'Zarchiwizowane wpisy' 140 archived: 'Zarchiwizowane wpisy'
141 filtered: 'Odfiltrowane wpisy' 141 filtered: 'Odfiltrowane wpisy'
142 # filtered_tags: 'Filtered by tags' 142 filtered_tags: 'Filtrowane po tagach'
143 untagged: 'Odtaguj wpisy'
143 list: 144 list:
144 number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ Są %count% wpisy.' 145 number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ Są %count% wpisy.'
145 reading_time: 'szacunkowy czas czytania' 146 reading_time: 'szacunkowy czas czytania'
146 reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min' 147 reading_time_minutes: 'szacunkowy czas czytania: %readingTime% min'
147 reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min' 148 reading_time_less_one_minute: 'szacunkowy czas czytania: <small class="inferieur">&lt;</small> 1 min'
148 # number_of_tags: '{1}and one other tag|]1,Inf[and %count% other tags' 149 number_of_tags: '{1} i inny tag|]1,Inf[i %count% innych tagów'
149 reading_time_minutes_short: '%readingTime% min' 150 reading_time_minutes_short: '%readingTime% min'
150 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min' 151 reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
151 original_article: 'oryginał' 152 original_article: 'oryginał'
@@ -187,8 +188,8 @@ entry:
187 add_a_tag: 'Dodaj tag' 188 add_a_tag: 'Dodaj tag'
188 share_content: 'Udostępnij' 189 share_content: 'Udostępnij'
189 share_email_label: 'Adres email' 190 share_email_label: 'Adres email'
190 # public_link: 'public link' 191 public_link: 'Publiczny link'
191 # delete_public_link: 'delete public link' 192 delete_public_link: 'Usuń publiczny link'
192 download: 'Pobierz' 193 download: 'Pobierz'
193 print: 'Drukuj' 194 print: 'Drukuj'
194 problem: 195 problem:
@@ -291,6 +292,7 @@ quickstart:
291 pocket: 'Migruj z Pocket' 292 pocket: 'Migruj z Pocket'
292 wallabag_v1: 'Migruj z wallabag v1' 293 wallabag_v1: 'Migruj z wallabag v1'
293 wallabag_v2: 'Migruj z wallabag v2' 294 wallabag_v2: 'Migruj z wallabag v2'
295 readability: 'Migruj z Readability'
294 developer: 296 developer:
295 title: 'Deweloperzy' 297 title: 'Deweloperzy'
296 create_application: 'Stwórz swoją aplikację' 298 create_application: 'Stwórz swoją aplikację'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Tagi' 314 page_title: 'Tagi'
313 list: 315 list:
314 number_on_the_page: '{0} Nie ma tagów.|{1} Jest jeden tag.|]1,Inf[ Są %count% tagi.' 316 number_on_the_page: '{0} Nie ma tagów.|{1} Jest jeden tag.|]1,Inf[ Są %count% tagi.'
317 see_untagged_entries: 'Zobacz nieotagowane wpisy'
315 318
316import: 319import:
317 page_title: 'Import' 320 page_title: 'Import'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'Import > Wallabag v2' 343 page_title: 'Import > Wallabag v2'
341 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".' 344 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".'
345 readability:
346 page_title: 'Import > Readability'
347 description: 'Ten importer, zaimportuje wszystkie twoje artykuły z Readability. Na stronie narzędzi (https://www.readability.com/tools/), kliknij na "Export your data" w sekcji "Data Export". Otrzymach email z plikiem JSON (plik nie będzie zawierał rozszerzenia .json).'
348 how_to: 'Wybierz swój plik eksportu z Readability i kliknij poniższy przycisk, aby go załadować.'
342 349
343developer: 350developer:
344 page_title: 'Deweloper' 351 page_title: 'Deweloper'
@@ -346,7 +353,7 @@ developer:
346 documentation: 'Dokumentacja' 353 documentation: 'Dokumentacja'
347 how_to_first_app: 'Jak stworzyć moją pierwszą aplikację' 354 how_to_first_app: 'Jak stworzyć moją pierwszą aplikację'
348 full_documentation: 'Pokaż pełne API' 355 full_documentation: 'Pokaż pełne API'
349 # list_methods: 'List API methods' 356 list_methods: 'Lista metod API'
350 clients: 357 clients:
351 title: 'Klienci' 358 title: 'Klienci'
352 create_new: 'Utwórz nowego klienta' 359 create_new: 'Utwórz nowego klienta'
@@ -404,7 +411,7 @@ flashes:
404 notice: 411 notice:
405 entry_already_saved: 'Wpis już został dodany %date%' 412 entry_already_saved: 'Wpis już został dodany %date%'
406 entry_saved: 'Wpis zapisany' 413 entry_saved: 'Wpis zapisany'
407 # entry_saved_failed: 'Failed to save entry' 414 entry_saved_failed: 'Zapis artykułu s nie powiódł'
408 entry_updated: 'Wpis zaktualizowany' 415 entry_updated: 'Wpis zaktualizowany'
409 entry_reloaded: 'Wpis ponownie załadowany' 416 entry_reloaded: 'Wpis ponownie załadowany'
410 entry_reload_failed: 'Błąd ponownego załadowania' 417 entry_reload_failed: 'Błąd ponownego załadowania'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
index fa2d6468..f41609d0 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
@@ -140,6 +140,7 @@ entry:
140 # archived: 'Archived entries' 140 # archived: 'Archived entries'
141 # filtered: 'Filtered entries' 141 # filtered: 'Filtered entries'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.' 145 # number_on_the_page: '{0} There is no entry.|{1} There is one entry.|]1,Inf[ There are %count% entries.'
145 reading_time: 'timp estimat de citire' 146 reading_time: 'timp estimat de citire'
@@ -291,6 +292,7 @@ quickstart:
291 # pocket: 'Migrate from Pocket' 292 # pocket: 'Migrate from Pocket'
292 # wallabag_v1: 'Migrate from wallabag v1' 293 # wallabag_v1: 'Migrate from wallabag v1'
293 # wallabag_v2: 'Migrate from wallabag v2' 294 # wallabag_v2: 'Migrate from wallabag v2'
295 # readability: 'Migrate from Readability'
294 # developer: 296 # developer:
295 # title: 'Developers' 297 # title: 'Developers'
296 # create_application: 'Create your third application' 298 # create_application: 'Create your third application'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Tag-uri' 314 page_title: 'Tag-uri'
313 list: 315 list:
314 # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.' 316 # number_on_the_page: '{0} There is no tag.|{1} There is one tag.|]1,Inf[ There are %count% tags.'
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 # page_title: 'Import' 320 # page_title: 'Import'
@@ -339,6 +342,10 @@ import:
339 # wallabag_v2: 342 # wallabag_v2:
340 # page_title: 'Import > Wallabag v2' 343 # page_title: 'Import > Wallabag v2'
341 # 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.' 344 # 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.'
345 # readability:
346 # page_title: 'Import > Readability'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 # page_title: 'Developer' 351 # page_title: 'Developer'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
index 05c31336..6dfbfa89 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
@@ -140,6 +140,7 @@ entry:
140 # archived: 'Archived entries' 140 # archived: 'Archived entries'
141 # filtered: 'Filtered entries' 141 # filtered: 'Filtered entries'
142 # filtered_tags: 'Filtered by tags' 142 # filtered_tags: 'Filtered by tags'
143 # untagged: 'Untagged entries'
143 list: 144 list:
144 number_on_the_page: '{0} Herhangi bir makale yok.|{1} Burada bir adet makale var.|]1,Inf[ Burada %count% adet makale var.' 145 number_on_the_page: '{0} Herhangi bir makale yok.|{1} Burada bir adet makale var.|]1,Inf[ Burada %count% adet makale var.'
145 reading_time: 'tahmini okuma süresi' 146 reading_time: 'tahmini okuma süresi'
@@ -291,6 +292,7 @@ quickstart:
291 pocket: "Pocket üzerindeki verilerinizi wallabag'e aktarın" 292 pocket: "Pocket üzerindeki verilerinizi wallabag'e aktarın"
292 wallabag_v1: "wallabag v1 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın" 293 wallabag_v1: "wallabag v1 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın"
293 wallabag_v2: "wallabag v2 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın" 294 wallabag_v2: "wallabag v2 üzerindeki verilerinizi wallabag'in yeni sürümüne aktarın"
295 readability: "Readability üzerindeki verilerinizi wallabag'e aktarın'"
294 developer: 296 developer:
295 # title: 'Developers' 297 # title: 'Developers'
296 # create_application: 'Create your third application' 298 # create_application: 'Create your third application'
@@ -312,6 +314,7 @@ tag:
312 page_title: 'Etiketler' 314 page_title: 'Etiketler'
313 list: 315 list:
314 number_on_the_page: '{0} Herhangi bir etiket yok.|{1} Burada bir adet etiket var.|]1,Inf[ Burada %count% adet etiket var.' 316 number_on_the_page: '{0} Herhangi bir etiket yok.|{1} Burada bir adet etiket var.|]1,Inf[ Burada %count% adet etiket var.'
317 # see_untagged_entries: 'See untagged entries'
315 318
316import: 319import:
317 page_title: 'İçe Aktar' 320 page_title: 'İçe Aktar'
@@ -339,6 +342,10 @@ import:
339 wallabag_v2: 342 wallabag_v2:
340 page_title: 'İçe Aktar > Wallabag v2' 343 page_title: 'İçe Aktar > Wallabag v2'
341 # 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.' 344 # 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.'
345 readability:
346 page_title: 'İçe Aktar > Readability'
347 # description: 'This importer will import all your Readability articles. On the tools (https://www.readability.com/tools/) page, click on "Export your data" in the "Data Export" section. You will received an email to download a json (which does not end with .json in fact).'
348 # how_to: 'Please select your Readability export and click on the below button to upload and import it.'
342 349
343developer: 350developer:
344 # page_title: 'Developer' 351 # page_title: 'Developer'
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/_title.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/_title.html.twig
new file mode 100644
index 00000000..d1c2f203
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/_title.html.twig
@@ -0,0 +1,15 @@
1{% set currentRoute = app.request.attributes.get('_route') %}
2
3{% if currentRoute == 'starred' %}
4 {{ 'entry.page_titles.starred'|trans }}
5{% elseif currentRoute == 'archive' %}
6 {{ 'entry.page_titles.archived'|trans }}
7{% elseif currentRoute == 'all' %}
8 {{ 'entry.page_titles.filtered'|trans }}
9{% elseif currentRoute == 'tag_entries' %}
10 {{ 'entry.page_titles.filtered_tags'|trans }}
11{% elseif currentRoute == 'untagged' %}
12 {{ 'entry.page_titles.untagged'|trans }}
13{% else %}
14 {{ 'entry.page_titles.unread'|trans }}
15{% endif %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
index 9380e67a..1554cce4 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
@@ -1,19 +1,7 @@
1{% extends "WallabagCoreBundle::layout.html.twig" %} 1{% extends "WallabagCoreBundle::layout.html.twig" %}
2 2
3{% block title %} 3{% block title %}
4 {% set currentRoute = app.request.attributes.get('_route') %} 4 {% include "@WallabagCore/themes/_title.html.twig" %}
5
6 {% if currentRoute == 'starred' %}
7 {{ 'entry.page_titles.starred'|trans }}
8 {% elseif currentRoute == 'archive' %}
9 {{ 'entry.page_titles.archived'|trans }}
10 {% elseif currentRoute == 'all' %}
11 {{ 'entry.page_titles.filtered'|trans }}
12 {% elseif currentRoute == 'tag_entries' %}
13 {{ 'entry.page_titles.filtered_tags'|trans }}
14 {% else %}
15 {{ 'entry.page_titles.unread'|trans }}
16 {% endif %}
17{% endblock %} 5{% endblock %}
18 6
19{% block content %} 7{% block content %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig
index b3d3d5a0..ea1c1cbe 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Static/quickstart.html.twig
@@ -39,6 +39,7 @@
39 <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li> 39 <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li>
40 <li><a href="{{ path('import_wallabag_v1') }}">{{ 'quickstart.migrate.wallabag_v1'|trans }}</a></li> 40 <li><a href="{{ path('import_wallabag_v1') }}">{{ 'quickstart.migrate.wallabag_v1'|trans }}</a></li>
41 <li><a href="{{ path('import_wallabag_v2') }}">{{ 'quickstart.migrate.wallabag_v2'|trans }}</a></li> 41 <li><a href="{{ path('import_wallabag_v2') }}">{{ 'quickstart.migrate.wallabag_v2'|trans }}</a></li>
42 <li><a href="{{ path('import_readability') }}">{{ 'quickstart.migrate.readability'|trans }}</a></li>
42 </ul> 43 </ul>
43 44
44 <h4>{{ 'quickstart.developer.title'|trans }}</h4> 45 <h4>{{ 'quickstart.developer.title'|trans }}</h4>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig
index 739e1486..50043907 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig
@@ -12,4 +12,8 @@
12 <li id="tag-{{ tag.id|e }}"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.entries.getValues | length }})</a></li> 12 <li id="tag-{{ tag.id|e }}"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.entries.getValues | length }})</a></li>
13 {% endfor %} 13 {% endfor %}
14 </ul> 14 </ul>
15
16 <div>
17 <a href="{{ path('untagged') }}">{{ 'tag.list.see_untagged_entries'|trans }}</a>
18 </div>
15{% endblock %} 19{% endblock %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
index 2a972e1c..806a4eef 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
@@ -1,19 +1,7 @@
1{% extends "WallabagCoreBundle::layout.html.twig" %} 1{% extends "WallabagCoreBundle::layout.html.twig" %}
2 2
3{% block title %} 3{% block title %}
4 {% set currentRoute = app.request.attributes.get('_route') %} 4 {% include "@WallabagCore/themes/_title.html.twig" %}
5
6 {% if currentRoute == 'starred' %}
7 {{ 'entry.page_titles.starred'|trans }}
8 {% elseif currentRoute == 'archive' %}
9 {{ 'entry.page_titles.archived'|trans }}
10 {% elseif currentRoute == 'all' %}
11 {{ 'entry.page_titles.filtered'|trans }}
12 {% elseif currentRoute == 'tag_entries' %}
13 {{ 'entry.page_titles.filtered_tags'|trans }}
14 {% else %}
15 {{ 'entry.page_titles.unread'|trans }}
16 {% endif %}
17{% endblock %} 5{% endblock %}
18 6
19{% block content %} 7{% block content %}
@@ -41,7 +29,7 @@
41 <i class="card-title grey-text text-darken-4 activator material-icons right">more_vert</i> 29 <i class="card-title grey-text text-darken-4 activator material-icons right">more_vert</i>
42 {% endif %} 30 {% endif %}
43 31
44 <span class="card-title"><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|striptags }}">{{ entry.title|striptags|raw }}</a></span> 32 <span class="card-title dot-ellipsis dot-resize-update"><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|raw }}">{{ entry.title|striptags|raw }}</a></span>
45 33
46 <div class="estimatedTime grey-text"> 34 <div class="estimatedTime grey-text">
47 <span class="tool reading-time"> 35 <span class="tool reading-time">
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig
index 59dd037b..8cbf4ab4 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Static/quickstart.html.twig
@@ -44,6 +44,7 @@
44 <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li> 44 <li><a href="{{ path('import_pocket') }}">{{ 'quickstart.migrate.pocket'|trans }}</a></li>
45 <li><a href="{{ path('import_wallabag_v1') }}">{{ 'quickstart.migrate.wallabag_v1'|trans }}</a></li> 45 <li><a href="{{ path('import_wallabag_v1') }}">{{ 'quickstart.migrate.wallabag_v1'|trans }}</a></li>
46 <li><a href="{{ path('import_wallabag_v2') }}">{{ 'quickstart.migrate.wallabag_v2'|trans }}</a></li> 46 <li><a href="{{ path('import_wallabag_v2') }}">{{ 'quickstart.migrate.wallabag_v2'|trans }}</a></li>
47 <li><a href="{{ path('import_readability') }}">{{ 'quickstart.migrate.readability'|trans }}</a></li>
47 </ul> 48 </ul>
48 49
49 <h4>{{ 'quickstart.developer.title'|trans }}</h4> 50 <h4>{{ 'quickstart.developer.title'|trans }}</h4>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig
index 9495f543..1690633a 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig
@@ -12,4 +12,7 @@
12 <li id="tag-{{ tag.id|e }}" class="col l4 m6 s12"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.entries.getValues | length }})</a></li> 12 <li id="tag-{{ tag.id|e }}" class="col l4 m6 s12"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.entries.getValues | length }})</a></li>
13 {% endfor %} 13 {% endfor %}
14 </ul> 14 </ul>
15 <div>
16 <a href="{{ path('untagged') }}">{{ 'tag.list.see_untagged_entries'|trans }}</a>
17 </div>
15{% endblock %} 18{% endblock %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
index 50134357..6e95345c 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
@@ -7,7 +7,9 @@
7 7
8{% block scripts %} 8{% block scripts %}
9 {{ parent() }} 9 {{ parent() }}
10 <script src="{{ asset('bundles/wallabagcore/themes/material/js/material.min.js') }}"></script> 10 <script src="{{ asset('bundles/wallabagcore/themes/material/js/jquery.tinydot.min.js') }}"></script>
11 <script src="{{ asset('bundles/wallabagcore/themes/material/js/materialize.min.js') }}"></script>
12 <script src="{{ asset('bundles/wallabagcore/themes/material/js/init.js') }}"></script>
11{% endblock %} 13{% endblock %}
12 14
13{% block header %} 15{% block header %}
diff --git a/src/Wallabag/ImportBundle/Controller/ReadabilityController.php b/src/Wallabag/ImportBundle/Controller/ReadabilityController.php
new file mode 100644
index 00000000..b61aa99c
--- /dev/null
+++ b/src/Wallabag/ImportBundle/Controller/ReadabilityController.php
@@ -0,0 +1,65 @@
1<?php
2
3namespace Wallabag\ImportBundle\Controller;
4
5use Symfony\Bundle\FrameworkBundle\Controller\Controller;
6use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
7use Symfony\Component\HttpFoundation\Request;
8use Wallabag\ImportBundle\Form\Type\UploadImportType;
9
10class ReadabilityController extends Controller
11{
12 /**
13 * @Route("/readability", name="import_readability")
14 */
15 public function indexAction(Request $request)
16 {
17 $form = $this->createForm(UploadImportType::class);
18 $form->handleRequest($request);
19
20 $readability = $this->get('wallabag_import.readability.import');
21
22 if ($form->isValid()) {
23 $file = $form->get('file')->getData();
24 $markAsRead = $form->get('mark_as_read')->getData();
25 $name = 'readability_'.$this->getUser()->getId().'.json';
26
27 if (in_array($file->getClientMimeType(), $this->getParameter('wallabag_import.allow_mimetypes')) && $file->move($this->getParameter('wallabag_import.resource_dir'), $name)) {
28 $res = $readability
29 ->setUser($this->getUser())
30 ->setFilepath($this->getParameter('wallabag_import.resource_dir').'/'.$name)
31 ->setMarkAsRead($markAsRead)
32 ->import();
33
34 $message = 'flashes.import.notice.failed';
35
36 if (true === $res) {
37 $summary = $readability->getSummary();
38 $message = $this->get('translator')->trans('flashes.import.notice.summary', [
39 '%imported%' => $summary['imported'],
40 '%skipped%' => $summary['skipped'],
41 ]);
42
43 unlink($this->getParameter('wallabag_import.resource_dir').'/'.$name);
44 }
45
46 $this->get('session')->getFlashBag()->add(
47 'notice',
48 $message
49 );
50
51 return $this->redirect($this->generateUrl('homepage'));
52 } else {
53 $this->get('session')->getFlashBag()->add(
54 'notice',
55 'flashes.import.notice.failed_on_file'
56 );
57 }
58 }
59
60 return $this->render('WallabagImportBundle:Readability:index.html.twig', [
61 'form' => $form->createView(),
62 'import' => $readability,
63 ]);
64 }
65}
diff --git a/src/Wallabag/ImportBundle/Import/ReadabilityImport.php b/src/Wallabag/ImportBundle/Import/ReadabilityImport.php
new file mode 100644
index 00000000..37b160c5
--- /dev/null
+++ b/src/Wallabag/ImportBundle/Import/ReadabilityImport.php
@@ -0,0 +1,179 @@
1<?php
2
3namespace Wallabag\ImportBundle\Import;
4
5use Wallabag\CoreBundle\Entity\Entry;
6use Wallabag\UserBundle\Entity\User;
7
8class ReadabilityImport extends AbstractImport
9{
10 private $user;
11 private $skippedEntries = 0;
12 private $importedEntries = 0;
13 private $filepath;
14 private $markAsRead;
15
16 /**
17 * We define the user in a custom call because on the import command there is no logged in user.
18 * So we can't retrieve user from the `security.token_storage` service.
19 *
20 * @param User $user
21 */
22 public function setUser(User $user)
23 {
24 $this->user = $user;
25
26 return $this;
27 }
28
29 /**
30 * {@inheritdoc}
31 */
32 public function getName()
33 {
34 return 'Readability';
35 }
36
37 /**
38 * {@inheritdoc}
39 */
40 public function getUrl()
41 {
42 return 'import_readability';
43 }
44
45 /**
46 * {@inheritdoc}
47 */
48 public function getDescription()
49 {
50 return 'import.readability.description';
51 }
52
53 /**
54 * Set file path to the json file.
55 *
56 * @param string $filepath
57 */
58 public function setFilepath($filepath)
59 {
60 $this->filepath = $filepath;
61
62 return $this;
63 }
64
65 /**
66 * Set whether articles must be all marked as read.
67 *
68 * @param bool $markAsRead
69 */
70 public function setMarkAsRead($markAsRead)
71 {
72 $this->markAsRead = $markAsRead;
73
74 return $this;
75 }
76
77 /**
78 * Get whether articles must be all marked as read.
79 */
80 public function getMarkAsRead()
81 {
82 return $this->markAsRead;
83 }
84
85 /**
86 * {@inheritdoc}
87 */
88 public function getSummary()
89 {
90 return [
91 'skipped' => $this->skippedEntries,
92 'imported' => $this->importedEntries,
93 ];
94 }
95
96 /**
97 * {@inheritdoc}
98 */
99 public function import()
100 {
101 if (!$this->user) {
102 $this->logger->error('ReadabilityImport: user is not defined');
103
104 return false;
105 }
106
107 if (!file_exists($this->filepath) || !is_readable($this->filepath)) {
108 $this->logger->error('ReadabilityImport: unable to read file', ['filepath' => $this->filepath]);
109
110 return false;
111 }
112
113 $data = json_decode(file_get_contents($this->filepath), true);
114
115 if (empty($data) || empty($data['bookmarks'])) {
116 return false;
117 }
118
119 $this->parseEntries($data['bookmarks']);
120
121 return true;
122 }
123
124 /**
125 * Parse and insert all given entries.
126 *
127 * @param $entries
128 */
129 protected function parseEntries($entries)
130 {
131 $i = 1;
132
133 foreach ($entries as $importedEntry) {
134 $existingEntry = $this->em
135 ->getRepository('WallabagCoreBundle:Entry')
136 ->findByUrlAndUserId($importedEntry['article__url'], $this->user->getId());
137
138 if (false !== $existingEntry) {
139 ++$this->skippedEntries;
140 continue;
141 }
142
143 $data = [
144 'title' => $importedEntry['article__title'],
145 'url' => $importedEntry['article__url'],
146 'content_type' => '',
147 'language' => '',
148 'is_archived' => $importedEntry['archive'] || $this->markAsRead,
149 'is_starred' => $importedEntry['favorite'],
150 ];
151
152 $entry = $this->fetchContent(
153 new Entry($this->user),
154 $data['url'],
155 $data
156 );
157
158 // jump to next entry in case of problem while getting content
159 if (false === $entry) {
160 ++$this->skippedEntries;
161 continue;
162 }
163 $entry->setArchived($data['is_archived']);
164 $entry->setStarred($data['is_starred']);
165
166 $this->em->persist($entry);
167 ++$this->importedEntries;
168
169 // flush every 20 entries
170 if (($i % 20) === 0) {
171 $this->em->flush();
172 $this->em->clear($entry);
173 }
174 ++$i;
175 }
176
177 $this->em->flush();
178 }
179}
diff --git a/src/Wallabag/ImportBundle/Resources/config/services.yml b/src/Wallabag/ImportBundle/Resources/config/services.yml
index 86b44cb3..520d43af 100644
--- a/src/Wallabag/ImportBundle/Resources/config/services.yml
+++ b/src/Wallabag/ImportBundle/Resources/config/services.yml
@@ -43,3 +43,13 @@ services:
43 - [ setLogger, [ "@logger" ]] 43 - [ setLogger, [ "@logger" ]]
44 tags: 44 tags:
45 - { name: wallabag_import.import, alias: wallabag_v2 } 45 - { name: wallabag_import.import, alias: wallabag_v2 }
46
47 wallabag_import.readability.import:
48 class: Wallabag\ImportBundle\Import\ReadabilityImport
49 arguments:
50 - "@doctrine.orm.entity_manager"
51 - "@wallabag_core.content_proxy"
52 calls:
53 - [ setLogger, [ "@logger" ]]
54 tags:
55 - { name: wallabag_import.import, alias: readability }
diff --git a/src/Wallabag/ImportBundle/Resources/views/Readability/index.html.twig b/src/Wallabag/ImportBundle/Resources/views/Readability/index.html.twig
new file mode 100644
index 00000000..f527d309
--- /dev/null
+++ b/src/Wallabag/ImportBundle/Resources/views/Readability/index.html.twig
@@ -0,0 +1,43 @@
1{% extends "WallabagCoreBundle::layout.html.twig" %}
2
3{% block title %}{{ 'import.readability.page_title'|trans }}{% endblock %}
4
5{% block content %}
6<div class="row">
7 <div class="col s12">
8 <div class="card-panel settings">
9 <div class="row">
10 <blockquote>{{ import.description|trans }}</blockquote>
11 <p>{{ 'import.readability.how_to'|trans }}</p>
12
13 <div class="col s12">
14 {{ form_start(form, {'method': 'POST'}) }}
15 {{ form_errors(form) }}
16 <div class="row">
17 <div class="file-field input-field col s12">
18 {{ form_errors(form.file) }}
19 <div class="btn">
20 <span>{{ form.file.vars.label|trans }}</span>
21 {{ form_widget(form.file) }}
22 </div>
23 <div class="file-path-wrapper">
24 <input class="file-path validate" type="text">
25 </div>
26 </div>
27 <div class="input-field col s6 with-checkbox">
28 <h6>{{ 'import.form.mark_as_read_title'|trans }}</h6>
29 {{ form_widget(form.mark_as_read) }}
30 {{ form_label(form.mark_as_read) }}
31 </div>
32 </div>
33
34 {{ form_widget(form.save, { 'attr': {'class': 'btn waves-effect waves-light'} }) }}
35
36 {{ form_rest(form) }}
37 </form>
38 </div>
39 </div>
40 </div>
41 </div>
42</div>
43{% endblock %}
diff --git a/src/Wallabag/UserBundle/Resources/translations/wallabag_user.oc.yml b/src/Wallabag/UserBundle/Resources/translations/wallabag_user.oc.yml
new file mode 100644
index 00000000..53a1afd1
--- /dev/null
+++ b/src/Wallabag/UserBundle/Resources/translations/wallabag_user.oc.yml
@@ -0,0 +1,11 @@
1# Two factor mail
2auth_code:
3 on: 'sus'
4 mailer:
5 subject: "Còdi d'autentificacion wallabag"
6 body:
7 hello: "Bonjorn %user%,"
8 first_para: "Estant qu'avètz activat la dobla autentificacion sus vòtre compte wallabag e que venètz de vos conectar dempuèi un novèl aparelh (ordinador, mobil, etc.) vos mandem un còdi per validar la connexion."
9 second_para: "Vaquí lo còdi a dintrar :"
10 support: "S'avètz un problèma de connexion, dobtetz pas a contacter l'assisténcia : "
11 signature: "La còla de wallabag"
diff --git a/src/Wallabag/UserBundle/Resources/views/Security/login.html.twig b/src/Wallabag/UserBundle/Resources/views/Security/login.html.twig
index 13a903ab..938f1a31 100644
--- a/src/Wallabag/UserBundle/Resources/views/Security/login.html.twig
+++ b/src/Wallabag/UserBundle/Resources/views/Security/login.html.twig
@@ -41,7 +41,7 @@
41 <i class="material-icons right">send</i> 41 <i class="material-icons right">send</i>
42 </button> 42 </button>
43 </div> 43 </div>
44 <div class="center"> 44 <div class="row center">
45 <a href="{{ path('fos_user_resetting_request') }}">{{ 'security.login.forgot_password'|trans }}</a> 45 <a href="{{ path('fos_user_resetting_request') }}">{{ 'security.login.forgot_password'|trans }}</a>
46 </div> 46 </div>
47</form> 47</form>
diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
index f9ac28c3..a74c17d9 100644
--- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
@@ -236,6 +236,16 @@ class EntryControllerTest extends WallabagCoreTestCase
236 $this->assertEquals(200, $client->getResponse()->getStatusCode()); 236 $this->assertEquals(200, $client->getResponse()->getStatusCode());
237 } 237 }
238 238
239 public function testUntagged()
240 {
241 $this->logInAs('admin');
242 $client = $this->getClient();
243
244 $client->request('GET', '/untagged/list');
245
246 $this->assertEquals(200, $client->getResponse()->getStatusCode());
247 }
248
239 public function testStarred() 249 public function testStarred()
240 { 250 {
241 $this->logInAs('admin'); 251 $this->logInAs('admin');
diff --git a/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php b/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php
index 96b5300b..d869cdf9 100644
--- a/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php
+++ b/tests/Wallabag/ImportBundle/Controller/ImportControllerTest.php
@@ -24,6 +24,6 @@ class ImportControllerTest extends WallabagCoreTestCase
24 $crawler = $client->request('GET', '/import/'); 24 $crawler = $client->request('GET', '/import/');
25 25
26 $this->assertEquals(200, $client->getResponse()->getStatusCode()); 26 $this->assertEquals(200, $client->getResponse()->getStatusCode());
27 $this->assertEquals(3, $crawler->filter('blockquote')->count()); 27 $this->assertEquals(4, $crawler->filter('blockquote')->count());
28 } 28 }
29} 29}
diff --git a/tests/Wallabag/ImportBundle/Controller/ReadabilityControllerTest.php b/tests/Wallabag/ImportBundle/Controller/ReadabilityControllerTest.php
new file mode 100644
index 00000000..92cf4bfc
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/Controller/ReadabilityControllerTest.php
@@ -0,0 +1,122 @@
1<?php
2
3namespace Tests\Wallabag\ImportBundle\Controller;
4
5use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6use Symfony\Component\HttpFoundation\File\UploadedFile;
7
8class ReadabilityControllerTest extends WallabagCoreTestCase
9{
10 public function testImportReadability()
11 {
12 $this->logInAs('admin');
13 $client = $this->getClient();
14
15 $crawler = $client->request('GET', '/import/readability');
16
17 $this->assertEquals(200, $client->getResponse()->getStatusCode());
18 $this->assertEquals(1, $crawler->filter('form[name=upload_import_file] > button[type=submit]')->count());
19 $this->assertEquals(1, $crawler->filter('input[type=file]')->count());
20 }
21
22 public function testImportReadabilityWithFile()
23 {
24 $this->logInAs('admin');
25 $client = $this->getClient();
26
27 $crawler = $client->request('GET', '/import/readability');
28 $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
29
30 $file = new UploadedFile(__DIR__.'/../fixtures/readability.json', 'readability.json');
31
32 $data = [
33 'upload_import_file[file]' => $file,
34 ];
35
36 $client->submit($form, $data);
37
38 $this->assertEquals(302, $client->getResponse()->getStatusCode());
39
40 $crawler = $client->followRedirect();
41
42 $content = $client->getContainer()
43 ->get('doctrine.orm.entity_manager')
44 ->getRepository('WallabagCoreBundle:Entry')
45 ->findByUrlAndUserId(
46 'https://venngage.com/blog/hashtags-are-worthless/',
47 $this->getLoggedInUserId()
48 );
49
50 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
51 $this->assertContains('flashes.import.notice.summary', $body[0]);
52 }
53
54 public function testImportReadabilityWithFileAndMarkAllAsRead()
55 {
56 $this->logInAs('admin');
57 $client = $this->getClient();
58
59 $crawler = $client->request('GET', '/import/readability');
60 $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
61
62 $file = new UploadedFile(__DIR__.'/../fixtures/readability-read.json', 'readability-read.json');
63
64 $data = [
65 'upload_import_file[file]' => $file,
66 'upload_import_file[mark_as_read]' => 1,
67 ];
68
69 $client->submit($form, $data);
70
71 $this->assertEquals(302, $client->getResponse()->getStatusCode());
72
73 $crawler = $client->followRedirect();
74
75 $content1 = $client->getContainer()
76 ->get('doctrine.orm.entity_manager')
77 ->getRepository('WallabagCoreBundle:Entry')
78 ->findByUrlAndUserId(
79 'https://blog.travis-ci.com/2016-07-28-what-we-learned-from-analyzing-2-million-travis-builds/',
80 $this->getLoggedInUserId()
81 );
82
83 $this->assertTrue($content1->isArchived());
84
85 $content2 = $client->getContainer()
86 ->get('doctrine.orm.entity_manager')
87 ->getRepository('WallabagCoreBundle:Entry')
88 ->findByUrlAndUserId(
89 'https://facebook.github.io/graphql/',
90 $this->getLoggedInUserId()
91 );
92
93 $this->assertTrue($content2->isArchived());
94
95 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
96 $this->assertContains('flashes.import.notice.summary', $body[0]);
97 }
98
99 public function testImportReadabilityWithEmptyFile()
100 {
101 $this->logInAs('admin');
102 $client = $this->getClient();
103
104 $crawler = $client->request('GET', '/import/readability');
105 $form = $crawler->filter('form[name=upload_import_file] > button[type=submit]')->form();
106
107 $file = new UploadedFile(__DIR__.'/../fixtures/test.txt', 'test.txt');
108
109 $data = [
110 'upload_import_file[file]' => $file,
111 ];
112
113 $client->submit($form, $data);
114
115 $this->assertEquals(302, $client->getResponse()->getStatusCode());
116
117 $crawler = $client->followRedirect();
118
119 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
120 $this->assertContains('flashes.import.notice.failed', $body[0]);
121 }
122}
diff --git a/tests/Wallabag/ImportBundle/Import/ReadabilityImportTest.php b/tests/Wallabag/ImportBundle/Import/ReadabilityImportTest.php
new file mode 100644
index 00000000..706d707b
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/Import/ReadabilityImportTest.php
@@ -0,0 +1,150 @@
1<?php
2
3namespace Tests\Wallabag\ImportBundle\Import;
4
5use Wallabag\ImportBundle\Import\ReadabilityImport;
6use Wallabag\UserBundle\Entity\User;
7use Wallabag\CoreBundle\Entity\Entry;
8use Monolog\Logger;
9use Monolog\Handler\TestHandler;
10
11class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
12{
13 protected $user;
14 protected $em;
15 protected $logHandler;
16 protected $contentProxy;
17
18 private function getReadabilityImport($unsetUser = false)
19 {
20 $this->user = new User();
21
22 $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
23 ->disableOriginalConstructor()
24 ->getMock();
25
26 $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
27 ->disableOriginalConstructor()
28 ->getMock();
29
30 $wallabag = new ReadabilityImport($this->em, $this->contentProxy);
31
32 $this->logHandler = new TestHandler();
33 $logger = new Logger('test', [$this->logHandler]);
34 $wallabag->setLogger($logger);
35
36 if (false === $unsetUser) {
37 $wallabag->setUser($this->user);
38 }
39
40 return $wallabag;
41 }
42
43 public function testInit()
44 {
45 $readabilityImport = $this->getReadabilityImport();
46
47 $this->assertEquals('Readability', $readabilityImport->getName());
48 $this->assertNotEmpty($readabilityImport->getUrl());
49 $this->assertEquals('import.readability.description', $readabilityImport->getDescription());
50 }
51
52 public function testImport()
53 {
54 $readabilityImport = $this->getReadabilityImport();
55 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
56
57 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
58 ->disableOriginalConstructor()
59 ->getMock();
60
61 $entryRepo->expects($this->exactly(2))
62 ->method('findByUrlAndUserId')
63 ->will($this->onConsecutiveCalls(false, true));
64
65 $this->em
66 ->expects($this->any())
67 ->method('getRepository')
68 ->willReturn($entryRepo);
69
70 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
71 ->disableOriginalConstructor()
72 ->getMock();
73
74 $this->contentProxy
75 ->expects($this->exactly(1))
76 ->method('updateEntry')
77 ->willReturn($entry);
78
79 $res = $readabilityImport->import();
80
81 $this->assertTrue($res);
82 $this->assertEquals(['skipped' => 1, 'imported' => 1], $readabilityImport->getSummary());
83 }
84
85 public function testImportAndMarkAllAsRead()
86 {
87 $readabilityImport = $this->getReadabilityImport();
88 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability-read.json');
89
90 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
91 ->disableOriginalConstructor()
92 ->getMock();
93
94 $entryRepo->expects($this->exactly(2))
95 ->method('findByUrlAndUserId')
96 ->will($this->onConsecutiveCalls(false, false));
97
98 $this->em
99 ->expects($this->any())
100 ->method('getRepository')
101 ->willReturn($entryRepo);
102
103 $this->contentProxy
104 ->expects($this->exactly(2))
105 ->method('updateEntry')
106 ->willReturn(new Entry($this->user));
107
108 // check that every entry persisted are archived
109 $this->em
110 ->expects($this->any())
111 ->method('persist')
112 ->with($this->callback(function ($persistedEntry) {
113 return $persistedEntry->isArchived();
114 }));
115
116 $res = $readabilityImport->setMarkAsRead(true)->import();
117
118 $this->assertTrue($res);
119
120 $this->assertEquals(['skipped' => 0, 'imported' => 2], $readabilityImport->getSummary());
121 }
122
123 public function testImportBadFile()
124 {
125 $readabilityImport = $this->getReadabilityImport();
126 $readabilityImport->setFilepath(__DIR__.'/../fixtures/wallabag-v1.jsonx');
127
128 $res = $readabilityImport->import();
129
130 $this->assertFalse($res);
131
132 $records = $this->logHandler->getRecords();
133 $this->assertContains('ReadabilityImport: unable to read file', $records[0]['message']);
134 $this->assertEquals('ERROR', $records[0]['level_name']);
135 }
136
137 public function testImportUserNotDefined()
138 {
139 $readabilityImport = $this->getReadabilityImport(true);
140 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
141
142 $res = $readabilityImport->import();
143
144 $this->assertFalse($res);
145
146 $records = $this->logHandler->getRecords();
147 $this->assertContains('ReadabilityImport: user is not defined', $records[0]['message']);
148 $this->assertEquals('ERROR', $records[0]['level_name']);
149 }
150}
diff --git a/tests/Wallabag/ImportBundle/fixtures/readability-read.json b/tests/Wallabag/ImportBundle/fixtures/readability-read.json
new file mode 100644
index 00000000..c60767dc
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/fixtures/readability-read.json
@@ -0,0 +1,25 @@
1{
2 "bookmarks": [
3 {
4 "article__excerpt": "This is a guest post from Moritz Beller from the Delft University of Technology in The Netherlands. His team produced amazing research on several million Travis CI builds, creating invaluable&hellip;",
5 "favorite": false,
6 "date_archived": "2016-08-02T06:49:30",
7 "article__url": "https://blog.travis-ci.com/2016-07-28-what-we-learned-from-analyzing-2-million-travis-builds/",
8 "date_added": "2016-08-01T05:24:16",
9 "date_favorited": null,
10 "article__title": "Travis",
11 "archive": true
12 },
13 {
14 "article__excerpt": "The GraphQL Type system describes the capabilities of a GraphQL server and is used to determine if a query is valid. The type system also describes the input types of query variables to determine if&hellip;",
15 "favorite": false,
16 "date_archived": "2016-07-19T06:48:31",
17 "article__url": "https://facebook.github.io/graphql/",
18 "date_added": "2016-06-24T17:50:16",
19 "date_favorited": null,
20 "article__title": "GraphQL",
21 "archive": true
22 }
23 ],
24 "recommendations": []
25}
diff --git a/tests/Wallabag/ImportBundle/fixtures/readability.json b/tests/Wallabag/ImportBundle/fixtures/readability.json
new file mode 100644
index 00000000..34379905
--- /dev/null
+++ b/tests/Wallabag/ImportBundle/fixtures/readability.json
@@ -0,0 +1,25 @@
1{
2 "bookmarks": [
3 {
4 "article__excerpt": "When Twitter started it had so much promise to change the way we communicate. But now it has been ruined by the amount of garbage and hate we have to wade through. It&#x2019;s like that polluted&hellip;",
5 "favorite": false,
6 "date_archived": null,
7 "article__url": "https://venngage.com/blog/hashtags-are-worthless/",
8 "date_added": "2016-08-25T12:05:00",
9 "date_favorited": null,
10 "article__title": "We Looked At 167,943 Tweets & Found Out Hashtags Are Worthless",
11 "archive": false
12 },
13 {
14 "article__excerpt": "TL;DR: Re-use your DOM elements and remove the ones that are far away from the viewport. Use placeholders to account for delayed data. Here&#x2019;s a demo and the code for the infinite&hellip;",
15 "favorite": false,
16 "date_archived": "2016-08-26T12:21:54",
17 "article__url": "https://developers.google.com/web/updates/2016/07/infinite-scroller?imm_mid=0e6839&cmp=em-webops-na-na-newsltr_20160805",
18 "date_added": "2016-08-06T05:35:26",
19 "date_favorited": null,
20 "article__title": "Complexities of an infinite scroller | Web Updates",
21 "archive": true
22 }
23 ],
24 "recommendations": []
25}