Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/jangernert/FeedReader.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lukas Gernert <jangernert@gmail.com>2018-05-06 22:44:09 +0300
committerGitHub <noreply@github.com>2018-05-06 22:44:09 +0300
commit61f6331e700421ca917a309df9efa2e119890ba5 (patch)
tree01c94f8ee97290694e26b57e96d6981a6629fe3c
parenteef152a3eaac5406e2b86d73951c8d64e4cdb177 (diff)
parent0741dd6e2c025d76975b408eee52d31f834b8042 (diff)
Merge pull request #670 from jangernert/masterv2.2
Do a 2.1 (or 3.0) release
-rw-r--r--.editorconfig16
-rw-r--r--.gitignore3
-rw-r--r--.gitmodules4
-rw-r--r--CMakeLists.txt301
-rw-r--r--COPYING675
-rw-r--r--Constants.vala.in22
-rw-r--r--INSTALL.md54
-rw-r--r--README.md124
-rw-r--r--WebExtension/CMakeLists.txt13
-rw-r--r--WebExtension/webextension.vala179
-rw-r--r--circle.yml60
-rw-r--r--cmake/FindCurl.cmake29
-rw-r--r--cmake/FindGLIB.cmake123
-rw-r--r--cmake/FindGirCompiler.cmake56
-rw-r--r--cmake/FindVala.cmake65
-rw-r--r--cmake/GObjectIntrospectionMacros.cmake34
-rw-r--r--cmake/GResource.cmake68
-rw-r--r--cmake/GSettings.cmake42
-rw-r--r--cmake/GetGitRevisionDescription.cmake131
-rw-r--r--cmake/GetGitRevisionDescription.cmake.in42
-rw-r--r--cmake/ParseArguments.cmake36
-rw-r--r--cmake/README10
-rw-r--r--cmake/README.Vala.rst173
-rw-r--r--cmake/Translations.cmake79
-rw-r--r--cmake/ValaPrecompile.cmake250
-rw-r--r--cmake/ValaVersion.cmake96
-rw-r--r--cmake/uninstall.cmake21
-rw-r--r--data/ArticleView/article.html13
-rw-r--r--data/ArticleView/style.css181
m---------data/GrabberConfig0
-rw-r--r--data/GrabberConfig/.about.com.txt3
-rw-r--r--data/GrabberConfig/.allthingsd.com.txt6
-rw-r--r--data/GrabberConfig/.blog.163.com.txt26
-rw-r--r--data/GrabberConfig/.blogs.nytimes.com.txt17
-rw-r--r--data/GrabberConfig/.blogspot.com.txt11
-rw-r--r--data/GrabberConfig/.businessinsider.com.txt9
-rw-r--r--data/GrabberConfig/.calepin.co.txt5
-rw-r--r--data/GrabberConfig/.chicagotribune.com.txt8
-rw-r--r--data/GrabberConfig/.cnet.com.txt16
-rw-r--r--data/GrabberConfig/.craigslist.org.txt8
-rw-r--r--data/GrabberConfig/.ctv.ca.txt8
-rw-r--r--data/GrabberConfig/.dreamwidth.org.txt7
-rw-r--r--data/GrabberConfig/.dxy.cn.txt4
-rw-r--r--data/GrabberConfig/.elpais.com.txt13
-rw-r--r--data/GrabberConfig/.etc.se.txt9
-rw-r--r--data/GrabberConfig/.ew.com.txt14
-rw-r--r--data/GrabberConfig/.finance.yahoo.com.txt12
-rw-r--r--data/GrabberConfig/.fivefilters.org.txt1
-rw-r--r--data/GrabberConfig/.fok.nl.txt13
-rw-r--r--data/GrabberConfig/.hardware.info.txt6
-rw-r--r--data/GrabberConfig/.ibm.com.txt11
-rw-r--r--data/GrabberConfig/.ifeng.com.txt14
-rw-r--r--data/GrabberConfig/.livejournal.com.txt6
-rw-r--r--data/GrabberConfig/.m.wikihow.com.txt17
-rw-r--r--data/GrabberConfig/.metafilter.com.txt9
-rw-r--r--data/GrabberConfig/.mozilla.org.txt5
-rw-r--r--data/GrabberConfig/.myjoyonline.com.txt6
-rw-r--r--data/GrabberConfig/.news.yahoo.com.txt6
-rw-r--r--data/GrabberConfig/.nytimes.com.txt4
-rw-r--r--data/GrabberConfig/.onliner.by.txt9
-rw-r--r--data/GrabberConfig/.orf.at.txt32
-rw-r--r--data/GrabberConfig/.peacefmonline.com.txt5
-rw-r--r--data/GrabberConfig/.reuters.com.txt11
-rw-r--r--data/GrabberConfig/.slashdot.org.txt16
-rw-r--r--data/GrabberConfig/.smashingmagazine.com.txt7
-rw-r--r--data/GrabberConfig/.stanford.edu.txt5
-rw-r--r--data/GrabberConfig/.thueringer-allgemeine.de.txt8
-rw-r--r--data/GrabberConfig/.time.com.txt26
-rw-r--r--data/GrabberConfig/.tweakblogs.net.txt4
-rw-r--r--data/GrabberConfig/.usinenouvelle.com.txt7
-rw-r--r--data/GrabberConfig/.wikihow.com.txt16
-rw-r--r--data/GrabberConfig/.wikimedia.org.txt12
-rw-r--r--data/GrabberConfig/.wikipedia.org.txt24
-rw-r--r--data/GrabberConfig/.wordpress.com.txt27
-rw-r--r--data/GrabberConfig/20min.ch.txt24
-rw-r--r--data/GrabberConfig/24.ae.txt8
-rw-r--r--data/GrabberConfig/24ways.org.txt6
-rw-r--r--data/GrabberConfig/36kr.com.txt8
-rw-r--r--data/GrabberConfig/37signals.com.txt6
-rw-r--r--data/GrabberConfig/3quarksdaily.com.txt9
-rw-r--r--data/GrabberConfig/3voor12.vpro.nl.txt11
-rw-r--r--data/GrabberConfig/43folders.com.txt4
-rw-r--r--data/GrabberConfig/500px.com.txt27
-rw-r--r--data/GrabberConfig/512pixels.net.txt2
-rw-r--r--data/GrabberConfig/5by5.tv.txt9
-rw-r--r--data/GrabberConfig/7newsbelize.com.txt7
-rw-r--r--data/GrabberConfig/9gag.com.txt6
-rw-r--r--data/GrabberConfig/README.md40
-rw-r--r--data/GrabberConfig/aachener-nachrichten.de.txt10
-rw-r--r--data/GrabberConfig/abc-luxe.com.txt4
-rw-r--r--data/GrabberConfig/abc.es.txt7
-rw-r--r--data/GrabberConfig/abc.net.au.txt18
-rw-r--r--data/GrabberConfig/abcnews.go.com.txt27
-rw-r--r--data/GrabberConfig/accesstoinsight.org.txt9
-rw-r--r--data/GrabberConfig/acidcow.com.txt3
-rw-r--r--data/GrabberConfig/aclu.org.txt5
-rw-r--r--data/GrabberConfig/acquia.com.txt9
-rw-r--r--data/GrabberConfig/acroswing.fr.txt5
-rw-r--r--data/GrabberConfig/ad.nl.txt7
-rw-r--r--data/GrabberConfig/adme.ru.txt6
-rw-r--r--data/GrabberConfig/aftenposten.no.txt5
-rw-r--r--data/GrabberConfig/aftonbladet.se.txt13
-rw-r--r--data/GrabberConfig/aht.seriouseats.com.txt15
-rw-r--r--data/GrabberConfig/aitnews.com.txt3
-rw-r--r--data/GrabberConfig/albayan.ae.txt8
-rw-r--r--data/GrabberConfig/alex.mullr.net.txt2
-rw-r--r--data/GrabberConfig/alexduner.com.txt4
-rw-r--r--data/GrabberConfig/alistapart.com.txt11
-rw-r--r--data/GrabberConfig/aljazeera.com.txt8
-rw-r--r--data/GrabberConfig/allafrica.com.txt3
-rw-r--r--data/GrabberConfig/allrecipes.com.txt14
-rw-r--r--data/GrabberConfig/allthingsd.com.txt13
-rw-r--r--data/GrabberConfig/allyou.com.txt8
-rw-r--r--data/GrabberConfig/alphabeta.argaam.com.txt11
-rw-r--r--data/GrabberConfig/alriyadh.com.txt9
-rw-r--r--data/GrabberConfig/alseraj.net.txt2
-rw-r--r--data/GrabberConfig/alternet.org.txt4
-rw-r--r--data/GrabberConfig/altfoto.com.txt2
-rw-r--r--data/GrabberConfig/alumni.stanford.edu.txt10
-rw-r--r--data/GrabberConfig/amandala.com.bz.txt6
-rw-r--r--data/GrabberConfig/amazon.com.txt19
-rw-r--r--data/GrabberConfig/americandrink.net.txt6
-rw-r--r--data/GrabberConfig/americastestkitchenfeed.com.txt5
-rw-r--r--data/GrabberConfig/amptoons.com.txt8
-rw-r--r--data/GrabberConfig/anandtech.com.txt16
-rw-r--r--data/GrabberConfig/androidandme.com.txt5
-rw-r--r--data/GrabberConfig/androidpolice.com.txt10
-rw-r--r--data/GrabberConfig/andyrutledge.com.txt9
-rw-r--r--data/GrabberConfig/annatravelling.wordpress.com.txt9
-rw-r--r--data/GrabberConfig/antirez.com.txt6
-rw-r--r--data/GrabberConfig/apotheke-adhoc.de.txt23
-rw-r--r--data/GrabberConfig/apple.com.txt7
-rw-r--r--data/GrabberConfig/appledaily.com.tw.txt4
-rw-r--r--data/GrabberConfig/appleinsider.com.txt23
-rw-r--r--data/GrabberConfig/appleweblog.com.txt2
-rw-r--r--data/GrabberConfig/archdaily.com.txt5
-rw-r--r--data/GrabberConfig/archiveofourown.org.txt22
-rw-r--r--data/GrabberConfig/arstechnica.co.uk.txt6
-rw-r--r--data/GrabberConfig/arstechnica.com.txt20
-rw-r--r--data/GrabberConfig/articles.boston.com.txt6
-rw-r--r--data/GrabberConfig/articles.courant.com.txt11
-rw-r--r--data/GrabberConfig/articles.washingtonpost.com.txt11
-rw-r--r--data/GrabberConfig/artofmanliness.com.txt6
-rw-r--r--data/GrabberConfig/ascarter.net.txt5
-rw-r--r--data/GrabberConfig/astronews.com.txt7
-rw-r--r--data/GrabberConfig/asymco.com.txt8
-rw-r--r--data/GrabberConfig/au.businessinsider.com.txt12
-rw-r--r--data/GrabberConfig/au.news.yahoo.com.txt5
-rw-r--r--data/GrabberConfig/autoblog.com.txt6
-rw-r--r--data/GrabberConfig/autocar.co.uk.txt13
-rw-r--r--data/GrabberConfig/avclub.com.txt4
-rw-r--r--data/GrabberConfig/baltimoresun.com.txt12
-rw-r--r--data/GrabberConfig/baseballprospectus.com.txt13
-rw-r--r--data/GrabberConfig/basicthinking.de.txt7
-rw-r--r--data/GrabberConfig/bastamag.net.txt10
-rw-r--r--data/GrabberConfig/baylon-industries.com.txt6
-rw-r--r--data/GrabberConfig/bb.is.txt13
-rw-r--r--data/GrabberConfig/bbc.co.uk.txt70
-rw-r--r--data/GrabberConfig/bbc.com.txt73
-rw-r--r--data/GrabberConfig/bbcgoodfood.com.txt16
-rw-r--r--data/GrabberConfig/bearmetal.eu.txt6
-rw-r--r--data/GrabberConfig/becomingminimalist.com.txt7
-rw-r--r--data/GrabberConfig/begeek.fr.txt17
-rw-r--r--data/GrabberConfig/benoitmaison.org.txt16
-rw-r--r--data/GrabberConfig/berlingske.dk.txt3
-rw-r--r--data/GrabberConfig/bernama.com.txt5
-rw-r--r--data/GrabberConfig/betabeat.com.txt2
-rw-r--r--data/GrabberConfig/betanews.com.txt7
-rw-r--r--data/GrabberConfig/bez.es.txt5
-rw-r--r--data/GrabberConfig/biography.com.txt8
-rw-r--r--data/GrabberConfig/bit-tech.net.txt19
-rw-r--r--data/GrabberConfig/bitelia.com.txt2
-rw-r--r--data/GrabberConfig/bizjournals.com.txt13
-rw-r--r--data/GrabberConfig/bjango.com.txt7
-rw-r--r--data/GrabberConfig/bleacherreport.com.txt16
-rw-r--r--data/GrabberConfig/blog.arsln.org.txt8
-rw-r--r--data/GrabberConfig/blog.asmartbear.com.txt7
-rw-r--r--data/GrabberConfig/blog.cloudflare.com.txt10
-rw-r--r--data/GrabberConfig/blog.fefe.de.txt5
-rw-r--r--data/GrabberConfig/blog.instagram.com.txt11
-rw-r--r--data/GrabberConfig/blog.instapaper.com.txt9
-rw-r--r--data/GrabberConfig/blog.kaelig.fr.txt5
-rw-r--r--data/GrabberConfig/blog.naver.com.txt6
-rw-r--r--data/GrabberConfig/blog.niqnutn.com.txt9
-rw-r--r--data/GrabberConfig/blog.pchome.net.txt12
-rw-r--r--data/GrabberConfig/blog.pinboard.in.txt6
-rw-r--r--data/GrabberConfig/blog.renren.com.txt11
-rw-r--r--data/GrabberConfig/blog.sina.com.cn.txt26
-rw-r--r--data/GrabberConfig/blog.spu.edu.txt2
-rw-r--r--data/GrabberConfig/blog.wells.ee.txt6
-rw-r--r--data/GrabberConfig/blog.xebia.fr.txt14
-rw-r--r--data/GrabberConfig/blogs.aljazeera.net.txt8
-rw-r--r--data/GrabberConfig/blogs.faz.net.txt45
-rw-r--r--data/GrabberConfig/blogs.forbes.com.txt2
-rw-r--r--data/GrabberConfig/blogs.hbr.org.txt4
-rw-r--r--data/GrabberConfig/blogs.msdn.com.txt6
-rw-r--r--data/GrabberConfig/blogs.reuters.com.txt3
-rw-r--r--data/GrabberConfig/blogs.scientificamerican.com.txt16
-rw-r--r--data/GrabberConfig/blogs.smithsonianmag.com.txt15
-rw-r--r--data/GrabberConfig/blogs.technet.com.txt9
-rw-r--r--data/GrabberConfig/bloomberg.com.txt11
-rw-r--r--data/GrabberConfig/bluetouff.com.txt4
-rw-r--r--data/GrabberConfig/boagworld.com.txt8
-rw-r--r--data/GrabberConfig/boingboing.net.txt11
-rw-r--r--data/GrabberConfig/book.douban.com.txt6
-rw-r--r--data/GrabberConfig/bookforum.com.txt19
-rw-r--r--data/GrabberConfig/borderhouseblog.com.txt7
-rw-r--r--data/GrabberConfig/bostonglobe.com.txt19
-rw-r--r--data/GrabberConfig/boundlessline.org.txt5
-rw-r--r--data/GrabberConfig/bowdoinorient.com.txt6
-rw-r--r--data/GrabberConfig/brainfacts.org.txt10
-rw-r--r--data/GrabberConfig/brainpickings.org.txt7
-rw-r--r--data/GrabberConfig/brandeins.de.txt9
-rw-r--r--data/GrabberConfig/brandingstrategyinsider.com.txt3
-rw-r--r--data/GrabberConfig/brasil.elpais.com.txt26
-rw-r--r--data/GrabberConfig/brettterpstra.com.txt5
-rw-r--r--data/GrabberConfig/brisbanetimes.com.au.txt2
-rw-r--r--data/GrabberConfig/brokernews.com.au.txt2
-rw-r--r--data/GrabberConfig/brookings.edu.txt13
-rw-r--r--data/GrabberConfig/brooksreview.net.txt6
-rw-r--r--data/GrabberConfig/bt.no.txt12
-rw-r--r--data/GrabberConfig/buffed.de.txt14
-rw-r--r--data/GrabberConfig/buquad.com.txt8
-rw-r--r--data/GrabberConfig/business.time.com.txt17
-rw-r--r--data/GrabberConfig/business2community.com.txt5
-rw-r--r--data/GrabberConfig/businessinsider.com.txt16
-rw-r--r--data/GrabberConfig/businessnews.com.tn.txt12
-rw-r--r--data/GrabberConfig/businessweek.com.txt17
-rw-r--r--data/GrabberConfig/buzzfeed.com.txt24
-rw-r--r--data/GrabberConfig/bygonebureau.com.txt6
-rw-r--r--data/GrabberConfig/cable.co.uk.txt11
-rw-r--r--data/GrabberConfig/caffereggio.net.txt3
-rwxr-xr-xdata/GrabberConfig/canonrumors.com.txt28
-rw-r--r--data/GrabberConfig/captaineconomics.fr.txt6
-rw-r--r--data/GrabberConfig/cardboardconnection.com.txt8
-rw-r--r--data/GrabberConfig/cars.com.txt7
-rw-r--r--data/GrabberConfig/catb.org.txt7
-rw-r--r--data/GrabberConfig/cbc.ca.txt5
-rw-r--r--data/GrabberConfig/cbn.com.txt8
-rw-r--r--data/GrabberConfig/cbsnews.com.txt15
-rw-r--r--data/GrabberConfig/chareidi.org.txt2
-rw-r--r--data/GrabberConfig/chinamining.org.txt10
-rw-r--r--data/GrabberConfig/choice.com.au.txt4
-rw-r--r--data/GrabberConfig/chomsky.info.txt6
-rw-r--r--data/GrabberConfig/chrisltd.com.txt6
-rw-r--r--data/GrabberConfig/christianitytoday.com.txt13
-rw-r--r--data/GrabberConfig/christies.com.txt6
-rw-r--r--data/GrabberConfig/chrome.google.com.txt9
-rw-r--r--data/GrabberConfig/chronicle.com.txt10
-rw-r--r--data/GrabberConfig/ciaosamin.com.txt4
-rw-r--r--data/GrabberConfig/cicero.de.txt33
-rw-r--r--data/GrabberConfig/cio.com.txt17
-rw-r--r--data/GrabberConfig/ciperchile.cl.txt4
-rw-r--r--data/GrabberConfig/cjr.org.txt6
-rw-r--r--data/GrabberConfig/classyllama.com.txt6
-rw-r--r--data/GrabberConfig/clientk.com.txt6
-rw-r--r--data/GrabberConfig/cloudacademy.com.txt6
-rw-r--r--data/GrabberConfig/clubic.com.txt15
-rw-r--r--data/GrabberConfig/cmswire.com.txt6
-rw-r--r--data/GrabberConfig/cn.engadget.com.txt5
-rwxr-xr-xdata/GrabberConfig/cn.reuters.com.txt9
-rw-r--r--data/GrabberConfig/cnet.com.au.txt17
-rw-r--r--data/GrabberConfig/cnet.com.txt20
-rw-r--r--data/GrabberConfig/cnn.com.txt23
-rw-r--r--data/GrabberConfig/code.activestate.com.txt10
-rw-r--r--data/GrabberConfig/code.fivefilters.org.txt3
-rw-r--r--data/GrabberConfig/code.google.com.txt5
-rw-r--r--data/GrabberConfig/codebase64.org.txt9
-rw-r--r--data/GrabberConfig/codeproject.com.txt3
-rw-r--r--data/GrabberConfig/codinghorror.com.txt15
-rw-r--r--data/GrabberConfig/collegehumor.com.txt14
-rw-r--r--data/GrabberConfig/commitstrip.com.txt5
-rw-r--r--data/GrabberConfig/communities-dominate.blogs.com.txt2
-rw-r--r--data/GrabberConfig/computer.org.txt5
-rw-r--r--data/GrabberConfig/computerbase.de.txt15
-rw-r--r--data/GrabberConfig/computerworld.com.txt19
-rw-r--r--data/GrabberConfig/computerworld.dk.txt5
-rw-r--r--data/GrabberConfig/contemporist.com.txt9
-rw-r--r--data/GrabberConfig/contrepoints.org.txt21
-rw-r--r--data/GrabberConfig/conversaciones.nokia.com.txt7
-rw-r--r--data/GrabberConfig/cooper.com.txt4
-rw-r--r--data/GrabberConfig/core77.com.txt7
-rw-r--r--data/GrabberConfig/counterpunch.org.txt7
-rw-r--r--data/GrabberConfig/crimemagazine.com.txt2
-rw-r--r--data/GrabberConfig/crimethinc.com.txt3
-rw-r--r--data/GrabberConfig/crn.de.txt3
-rw-r--r--data/GrabberConfig/csmonitor.com.txt18
-rw-r--r--data/GrabberConfig/csnphilly.com.txt22
-rw-r--r--data/GrabberConfig/csoonline.com.txt17
-rw-r--r--data/GrabberConfig/css-tricks.com.txt6
-rw-r--r--data/GrabberConfig/cucharasonica.com.txt2
-rw-r--r--data/GrabberConfig/cw.com.tw.txt14
-rw-r--r--data/GrabberConfig/cwnp.com.txt14
-rw-r--r--data/GrabberConfig/cyrille-borne.com.txt6
-rw-r--r--data/GrabberConfig/da.feedsportal.com.txt5
-rw-r--r--data/GrabberConfig/dagogtid.no.txt4
-rw-r--r--data/GrabberConfig/dailydot.com.txt4
-rw-r--r--data/GrabberConfig/dailykos.com.txt10
-rw-r--r--data/GrabberConfig/dailymail.co.uk.txt21
-rw-r--r--data/GrabberConfig/dailysabah.com.txt6
-rw-r--r--data/GrabberConfig/dailystar.com.lb.txt6
-rw-r--r--data/GrabberConfig/dailytelegraph.com.au.txt5
-rw-r--r--data/GrabberConfig/dansdata.com.txt5
-rw-r--r--data/GrabberConfig/dantri.com.vn.txt7
-rw-r--r--data/GrabberConfig/daringfireball.net.txt7
-rw-r--r--data/GrabberConfig/dcurt.is.txt8
-rw-r--r--data/GrabberConfig/deadline.com.txt11
-rw-r--r--data/GrabberConfig/deadspin.com.txt1
-rw-r--r--data/GrabberConfig/defomicron.net.txt9
-rw-r--r--data/GrabberConfig/deia.com.txt4
-rw-r--r--data/GrabberConfig/delong.typepad.com.txt4
-rw-r--r--data/GrabberConfig/democracynow.org.txt5
-rw-r--r--data/GrabberConfig/der-postillon.com.txt7
-rwxr-xr-xdata/GrabberConfig/derbund.ch.txt13
-rw-r--r--data/GrabberConfig/derstandard.at.txt27
-rw-r--r--data/GrabberConfig/des-livres-pour-changer-de-vie.fr.txt6
-rw-r--r--data/GrabberConfig/designbuildsource.com.au.txt2
-rw-r--r--data/GrabberConfig/designsponge.com.txt31
-rw-r--r--data/GrabberConfig/designtagebuch.de.txt11
-rw-r--r--data/GrabberConfig/details.com.txt8
-rw-r--r--data/GrabberConfig/deutsche-apotheker-zeitung.de.txt29
-rw-r--r--data/GrabberConfig/developers.facebook.com.txt3
-rw-r--r--data/GrabberConfig/devlinsangle.blogspot.co.at.txt6
-rw-r--r--data/GrabberConfig/diagonalperiodico.net.txt4
-rw-r--r--data/GrabberConfig/dictionary.reference.com.txt6
-rw-r--r--data/GrabberConfig/diepresse.com.txt6
-rw-r--r--data/GrabberConfig/digiphoto.techbang.com.txt8
-rw-r--r--data/GrabberConfig/digital-photography-school.com.txt6
-rw-r--r--data/GrabberConfig/digitalspy.co.uk.txt5
-rw-r--r--data/GrabberConfig/dilbert.com.txt9
-rw-r--r--data/GrabberConfig/dinamalar.com.txt19
-rw-r--r--data/GrabberConfig/distributistreview.com.txt8
-rwxr-xr-xdata/GrabberConfig/dn.pt.txt9
-rw-r--r--data/GrabberConfig/dn.se.txt42
-rw-r--r--data/GrabberConfig/dobreprogramy.pl.txt6
-rw-r--r--data/GrabberConfig/doctac.com.txt8
-rw-r--r--data/GrabberConfig/domusweb.it.txt21
-rw-r--r--data/GrabberConfig/dorkly.com.txt13
-rw-r--r--data/GrabberConfig/dou.ua.txt8
-rw-r--r--data/GrabberConfig/douban.com.txt21
-rw-r--r--data/GrabberConfig/doughellmann.com.txt1
-rw-r--r--data/GrabberConfig/dpreview.com.txt9
-rw-r--r--data/GrabberConfig/dr.dk.txt9
-rw-r--r--data/GrabberConfig/dramasonline.com.txt10
-rw-r--r--data/GrabberConfig/drdobbs.com.txt2
-rw-r--r--data/GrabberConfig/drgoulu.com.txt6
-rw-r--r--data/GrabberConfig/drive2.ru.txt12
-rw-r--r--data/GrabberConfig/droidgamers.com.txt7
-rw-r--r--data/GrabberConfig/dropbox.com.txt3
-rw-r--r--data/GrabberConfig/drupal.org.txt8
-rw-r--r--data/GrabberConfig/dushumashang.com.txt17
-rw-r--r--data/GrabberConfig/eandt.theiet.org.txt8
-rw-r--r--data/GrabberConfig/eastoftheweb.com.txt18
-rw-r--r--data/GrabberConfig/ebay.com.txt5
-rw-r--r--data/GrabberConfig/ecetia.com.txt2
-rw-r--r--data/GrabberConfig/echo-online.de.txt25
-rw-r--r--data/GrabberConfig/econlog.econlib.org.txt6
-rw-r--r--data/GrabberConfig/economia.estadao.com.br.txt7
-rw-r--r--data/GrabberConfig/economie.gouv.fr.txt4
-rw-r--r--data/GrabberConfig/economist.com.txt13
-rw-r--r--data/GrabberConfig/ecowatch.com.txt10
-rw-r--r--data/GrabberConfig/edge-online.com.txt13
-rw-r--r--data/GrabberConfig/edition.channel5belize.com.txt9
-rw-r--r--data/GrabberConfig/edition.cnn.com.txt18
-rw-r--r--data/GrabberConfig/eetimes.com.txt8
-rw-r--r--data/GrabberConfig/ekultura.hu.txt11
-rw-r--r--data/GrabberConfig/elance.com.txt3
-rw-r--r--data/GrabberConfig/elderscrollsonline.com.txt22
-rw-r--r--data/GrabberConfig/elektroniknet.de.txt10
-rw-r--r--data/GrabberConfig/elmalpensante.com.txt4
-rw-r--r--data/GrabberConfig/elpais.com.txt22
-rw-r--r--data/GrabberConfig/emaratalyoum.com.txt8
-rw-r--r--data/GrabberConfig/en.espnf1.com.txt10
-rw-r--r--data/GrabberConfig/engadget.com.txt6
-rw-r--r--data/GrabberConfig/engineering.tumblr.com.txt7
-rw-r--r--data/GrabberConfig/english.aljazeera.net.txt7
-rw-r--r--data/GrabberConfig/enikos.gr.txt9
-rw-r--r--data/GrabberConfig/entertainment.timesonline.co.uk.txt10
-rw-r--r--data/GrabberConfig/entwickler.de.txt7
-rw-r--r--data/GrabberConfig/ericsuh.com.txt4
-rw-r--r--data/GrabberConfig/es.hu.txt11
-rw-r--r--data/GrabberConfig/escapistmagazine.com.txt8
-rw-r--r--data/GrabberConfig/esglobal.org.txt3
-rw-r--r--data/GrabberConfig/espacepolitique.revues.org.txt10
-rw-r--r--data/GrabberConfig/espn.go.com.txt12
-rw-r--r--data/GrabberConfig/esquire.com.txt11
-rw-r--r--data/GrabberConfig/estadao.com.br.txt4
-rw-r--r--data/GrabberConfig/eternabuenosaires.com.txt2
-rw-r--r--data/GrabberConfig/eurogamer.net.txt9
-rw-r--r--data/GrabberConfig/evo.co.uk.txt11
-rw-r--r--data/GrabberConfig/explosm.net.txt4
-rw-r--r--data/GrabberConfig/expressen.se.txt10
-rw-r--r--data/GrabberConfig/extracine.com.txt2
-rw-r--r--data/GrabberConfig/f1actual.com.txt2
-rw-r--r--data/GrabberConfig/facebook.com.txt20
-rw-r--r--data/GrabberConfig/facta.co.jp.txt3
-rw-r--r--data/GrabberConfig/falter.at.txt14
-rw-r--r--data/GrabberConfig/fanfiction.net.txt6
-rw-r--r--data/GrabberConfig/fastcompany.com.txt20
-rw-r--r--data/GrabberConfig/faz.net.txt101
-rw-r--r--data/GrabberConfig/feeds.feedblitz.com.txt1
-rw-r--r--data/GrabberConfig/fertigung.de.txt23
-rw-r--r--data/GrabberConfig/fictionpress.com.txt5
-rw-r--r--data/GrabberConfig/ficwad.com.txt12
-rw-r--r--data/GrabberConfig/filmstarts.de.txt14
-rw-r--r--data/GrabberConfig/finance.yahoo.com.txt12
-rw-r--r--data/GrabberConfig/findtheswagger.tumblr.com.txt10
-rw-r--r--data/GrabberConfig/finexpert.e15.cz.txt3
-rw-r--r--data/GrabberConfig/firstthings.com.txt7
-rw-r--r--data/GrabberConfig/fivechapters.com.txt2
-rw-r--r--data/GrabberConfig/fivefilters.org.txt4
-rw-r--r--data/GrabberConfig/fivethirtyeight.com.txt7
-rw-r--r--data/GrabberConfig/flyingmachinestudios.com.txt2
-rw-r--r--data/GrabberConfig/fm4.orf.at.txt14
-rw-r--r--data/GrabberConfig/fnal.gov.txt15
-rw-r--r--data/GrabberConfig/focus-numerique.com.txt8
-rw-r--r--data/GrabberConfig/focus.de.txt19
-rw-r--r--data/GrabberConfig/fok.nl.txt4
-rw-r--r--data/GrabberConfig/foley.com.txt5
-rw-r--r--data/GrabberConfig/folklore.org.txt4
-rw-r--r--data/GrabberConfig/food.com.txt11
-rw-r--r--data/GrabberConfig/fool.com.txt11
-rw-r--r--data/GrabberConfig/forbes.com.txt29
-rw-r--r--data/GrabberConfig/foreignaffairs.com.txt34
-rw-r--r--data/GrabberConfig/foreignpolicy.com.txt14
-rw-r--r--data/GrabberConfig/forsvaret.no.txt10
-rw-r--r--data/GrabberConfig/foxnews.com.txt9
-rw-r--r--data/GrabberConfig/france24.com.txt14
-rw-r--r--data/GrabberConfig/frankdenneman.nl.txt2
-rw-r--r--data/GrabberConfig/freelancer.com.txt3
-rw-r--r--data/GrabberConfig/freytag-film.com.txt5
-rw-r--r--data/GrabberConfig/fria.nu.txt8
-rw-r--r--data/GrabberConfig/friatidningen.se.txt7
-rw-r--r--data/GrabberConfig/frontburner.dmagazine.com.txt6
-rw-r--r--data/GrabberConfig/ft.com.txt6
-rw-r--r--data/GrabberConfig/ftchinese.com.txt18
-rw-r--r--data/GrabberConfig/futura-sciences.com.txt16
-rw-r--r--data/GrabberConfig/futurezone.at.txt21
-rw-r--r--data/GrabberConfig/galwayindependent.com.txt3
-rw-r--r--data/GrabberConfig/gamasutra.com.txt22
-rw-r--r--data/GrabberConfig/gameblog.fr.txt12
-rw-r--r--data/GrabberConfig/gamechurch.com.txt10
-rw-r--r--data/GrabberConfig/gamekult.com.txt7
-rw-r--r--data/GrabberConfig/gamer.no.txt11
-rw-r--r--data/GrabberConfig/gamereactor.no.txt11
-rw-r--r--data/GrabberConfig/ganglia.info.txt2
-rw-r--r--data/GrabberConfig/gasteroprod.com.txt4
-rw-r--r--data/GrabberConfig/gatopardo.com.txt8
-rw-r--r--data/GrabberConfig/gawker.com.txt8
-rw-r--r--data/GrabberConfig/geeksofdoom.com.txt3
-rw-r--r--data/GrabberConfig/geenstijl.nl.txt3
-rw-r--r--data/GrabberConfig/getnews.jp.txt3
-rw-r--r--data/GrabberConfig/getpocket.com.txt1
-rw-r--r--data/GrabberConfig/giantbomb.com.txt11
-rw-r--r--data/GrabberConfig/giga.de.txt20
-rw-r--r--data/GrabberConfig/gigaom.com.txt12
-rw-r--r--data/GrabberConfig/gihyo.jp.txt3
-rw-r--r--data/GrabberConfig/gist.github.com.txt6
-rw-r--r--data/GrabberConfig/gizmodo.co.uk.txt7
-rw-r--r--data/GrabberConfig/gizmodo.com.au.txt9
-rw-r--r--data/GrabberConfig/gizmodo.com.txt13
-rw-r--r--data/GrabberConfig/gizmodo.uol.com.br.txt6
-rw-r--r--data/GrabberConfig/gizmologia.com.txt2
-rw-r--r--data/GrabberConfig/gizmovil.com.txt2
-rw-r--r--data/GrabberConfig/global.txt18
-rw-r--r--data/GrabberConfig/globalgrind.com.txt6
-rw-r--r--data/GrabberConfig/globalissues.org.txt15
-rw-r--r--data/GrabberConfig/globalresearch.ca.txt4
-rw-r--r--data/GrabberConfig/globoesporte.globo.com.txt25
-rw-r--r--data/GrabberConfig/gloswielkopolski.pl.txt8
-rw-r--r--data/GrabberConfig/goal.com.txt16
-rw-r--r--data/GrabberConfig/gocomics.com.txt5
-rw-r--r--data/GrabberConfig/gokulkrishh.github.io.txt6
-rw-r--r--data/GrabberConfig/golem.de.txt39
-rw-r--r--data/GrabberConfig/good.is.txt4
-rw-r--r--data/GrabberConfig/goodfil.ms.txt2
-rw-r--r--data/GrabberConfig/gossip-tv.gr.txt14
-rw-r--r--data/GrabberConfig/goteborgsfria.se.txt7
-rw-r--r--data/GrabberConfig/gothamist.com.txt7
-rw-r--r--data/GrabberConfig/gp.se.txt11
-rw-r--r--data/GrabberConfig/gq.com.txt9
-rw-r--r--data/GrabberConfig/grantland.com.txt20
-rw-r--r--data/GrabberConfig/greatergreaterwashington.org.txt11
-rw-r--r--data/GrabberConfig/groups.drupal.org.txt5
-rw-r--r--data/GrabberConfig/gsmarena.com.txt3
-rw-r--r--data/GrabberConfig/gulfnews.com.txt5
-rw-r--r--data/GrabberConfig/guokr.com.txt22
-rw-r--r--data/GrabberConfig/haberler.com.txt5
-rwxr-xr-xdata/GrabberConfig/habrahabr.ru.txt21
-rw-r--r--data/GrabberConfig/hackersrepublic.org.txt6
-rw-r--r--data/GrabberConfig/hackmake.org.txt7
-rw-r--r--data/GrabberConfig/halo.bungie.org.txt5
-rw-r--r--data/GrabberConfig/hammers.theoffside.com.txt7
-rw-r--r--data/GrabberConfig/handelsblatt.com.txt31
-rw-r--r--data/GrabberConfig/hanselman.com.txt4
-rw-r--r--data/GrabberConfig/hardware-infos.com.txt10
-rw-r--r--data/GrabberConfig/hardware.fr.txt6
-rw-r--r--data/GrabberConfig/hardware.no.txt16
-rw-r--r--data/GrabberConfig/hardwareluxx.de.txt19
-rw-r--r--data/GrabberConfig/hbr.org.txt7
-rw-r--r--data/GrabberConfig/headrush.typepad.com.txt14
-rw-r--r--data/GrabberConfig/healthland.time.com.txt10
-rw-r--r--data/GrabberConfig/heise-online.mobi.txt3
-rwxr-xr-xdata/GrabberConfig/heise.de.txt61
-rw-r--r--data/GrabberConfig/help.fivefilters.org.txt2
-rw-r--r--data/GrabberConfig/hemmings.com.txt9
-rw-r--r--data/GrabberConfig/heraldsun.com.au.txt12
-rw-r--r--data/GrabberConfig/hespress.com.txt7
-rw-r--r--data/GrabberConfig/hiamag.com.txt3
-rw-r--r--data/GrabberConfig/highscalability.com.txt3
-rw-r--r--data/GrabberConfig/hiiraan.com.txt10
-rw-r--r--data/GrabberConfig/hiperpop.com.txt2
-rwxr-xr-xdata/GrabberConfig/hipertextual.com.txt2
-rw-r--r--data/GrabberConfig/hiphopleeft.nl.txt4
-rw-r--r--data/GrabberConfig/histoire.presse.fr.txt6
-rw-r--r--data/GrabberConfig/historytoday.com.txt10
-rw-r--r--data/GrabberConfig/hmercer.com.txt5
-rw-r--r--data/GrabberConfig/hollywoodlife.com.txt22
-rw-r--r--data/GrabberConfig/hometheaterreview.com.txt4
-rw-r--r--data/GrabberConfig/hosted.ap.org.txt5
-rw-r--r--data/GrabberConfig/hosted2.ap.org.txt7
-rw-r--r--data/GrabberConfig/houstonchronicle.com.txt4
-rw-r--r--data/GrabberConfig/howtogeek.com.txt11
-rw-r--r--data/GrabberConfig/hs.fi.txt3
-rw-r--r--data/GrabberConfig/ht.ly.txt3
-rw-r--r--data/GrabberConfig/huffingtonpost.co.uk.txt5
-rw-r--r--data/GrabberConfig/huffingtonpost.com.txt21
-rw-r--r--data/GrabberConfig/humantransit.org.txt5
-rw-r--r--data/GrabberConfig/hurriyet.com.tr.txt7
-rw-r--r--data/GrabberConfig/hvg.hu.txt9
-rw-r--r--data/GrabberConfig/hypebeast.com.txt10
-rw-r--r--data/GrabberConfig/iansommerville.com.txt1
-rw-r--r--data/GrabberConfig/icannabis.tumblr.com.txt9
-rw-r--r--data/GrabberConfig/ici.radio-canada.ca.txt12
-rw-r--r--data/GrabberConfig/idealog.co.nz.txt12
-rw-r--r--data/GrabberConfig/idlewords.com.txt7
-rw-r--r--data/GrabberConfig/igen.fr.txt8
-rw-r--r--data/GrabberConfig/igeneration.fr.txt5
-rw-r--r--data/GrabberConfig/ignoredbydinosaurs.com.txt7
-rw-r--r--data/GrabberConfig/ilounge.com.txt13
-rw-r--r--data/GrabberConfig/ilyabirman.ru.txt5
-rw-r--r--data/GrabberConfig/imasters.com.br.txt5
-rw-r--r--data/GrabberConfig/imgcert.com.txt3
-rw-r--r--data/GrabberConfig/in.rbth.com.txt6
-rw-r--r--data/GrabberConfig/inc.com.txt21
-rw-r--r--data/GrabberConfig/indehekken.net.txt3
-rw-r--r--data/GrabberConfig/independent.co.uk.txt16
-rw-r--r--data/GrabberConfig/indiatimes.com.txt6
-rw-r--r--data/GrabberConfig/indiehackers.com.txt5
-rw-r--r--data/GrabberConfig/inessential.com.txt5
-rw-r--r--data/GrabberConfig/info.abril.com.br.txt4
-rw-r--r--data/GrabberConfig/infoq.com.txt14
-rw-r--r--data/GrabberConfig/informador.com.mx.txt9
-rw-r--r--data/GrabberConfig/information.dk.txt7
-rw-r--r--data/GrabberConfig/informationarchitects.net.txt10
-rw-r--r--data/GrabberConfig/informationclearinghouse.info.txt6
-rw-r--r--data/GrabberConfig/informit.com.txt7
-rw-r--r--data/GrabberConfig/infoworld.com.txt19
-rw-r--r--data/GrabberConfig/infzm.com.txt9
-rw-r--r--data/GrabberConfig/inhabitat.com.txt8
-rw-r--r--data/GrabberConfig/instagr.am.txt6
-rw-r--r--data/GrabberConfig/io9.com.txt1
-rw-r--r--data/GrabberConfig/ipadclub.nl.txt7
-rw-r--r--data/GrabberConfig/ipadplanet.nl.txt7
-rw-r--r--data/GrabberConfig/iphoneaddict.fr.txt6
-rw-r--r--data/GrabberConfig/iphoneclub.nl.txt7
-rw-r--r--data/GrabberConfig/iphonehacks.com.txt9
-rw-r--r--data/GrabberConfig/iphonetweak.fr.txt4
-rw-r--r--data/GrabberConfig/iplaysoft.com.txt2
-rw-r--r--data/GrabberConfig/ippmedia.com.txt4
-rw-r--r--data/GrabberConfig/iso.500px.com.txt6
-rw-r--r--data/GrabberConfig/isource.com.txt6
-rw-r--r--data/GrabberConfig/it-connect.fr.txt9
-rw-r--r--data/GrabberConfig/itavisen.no.txt4
-rw-r--r--data/GrabberConfig/itmedia.co.jp.txt8
-rw-r--r--data/GrabberConfig/itnews.com.au.txt7
-rw-r--r--data/GrabberConfig/itstactical.com.txt12
-rw-r--r--data/GrabberConfig/itunes.apple.com.txt14
-rw-r--r--data/GrabberConfig/itwire.com.txt5
-rw-r--r--data/GrabberConfig/itworld.com.txt19
-rw-r--r--data/GrabberConfig/izismile.com.txt4
-rw-r--r--data/GrabberConfig/jalopnik.com.txt5
-rw-r--r--data/GrabberConfig/jameslandrith.com.txt18
-rw-r--r--data/GrabberConfig/jandan.net.txt6
-rw-r--r--data/GrabberConfig/javaworld.com.txt17
-rw-r--r--data/GrabberConfig/jdubuzz.com.txt13
-rw-r--r--data/GrabberConfig/jetzt.de.txt16
-rw-r--r--data/GrabberConfig/jetzt.sueddeutsche.de.txt22
-rw-r--r--data/GrabberConfig/jezebel.com.txt1
-rw-r--r--data/GrabberConfig/jjahnke.net.txt4
-rw-r--r--data/GrabberConfig/jobbank.gc.ca.txt5
-rw-r--r--data/GrabberConfig/joelonsoftware.com.txt21
-rw-r--r--data/GrabberConfig/jouire.com.txt3
-rw-r--r--data/GrabberConfig/journaldugamer.com.txt12
-rw-r--r--data/GrabberConfig/journaldugeek.com.txt15
-rw-r--r--data/GrabberConfig/joystiq.com.txt8
-rw-r--r--data/GrabberConfig/jsforcats.com.txt6
-rw-r--r--data/GrabberConfig/juedische-allgemeine.de.txt19
-rw-r--r--data/GrabberConfig/jungle-world.com.txt3
-rw-r--r--data/GrabberConfig/juppy.org.txt8
-rw-r--r--data/GrabberConfig/kachestvo.ru.txt3
-rw-r--r--data/GrabberConfig/kathimerini.gr.txt4
-rw-r--r--data/GrabberConfig/kattascha.de.txt6
-rw-r--r--data/GrabberConfig/kenrockwell.com.txt7
-rw-r--r--data/GrabberConfig/keyboardmag.com.txt4
-rw-r--r--data/GrabberConfig/kicker.de.txt21
-rw-r--r--data/GrabberConfig/kickstarter.com.txt7
-rw-r--r--data/GrabberConfig/kingarthurflour.com.txt4
-rw-r--r--data/GrabberConfig/kotaku.com.txt5
-rw-r--r--data/GrabberConfig/kottke.org.txt6
-rw-r--r--data/GrabberConfig/kulturegeek.fr.txt13
-rw-r--r--data/GrabberConfig/kumailplus.com.txt3
-rw-r--r--data/GrabberConfig/kumb.com.txt10
-rw-r--r--data/GrabberConfig/kwerfeldein.de.txt9
-rw-r--r--data/GrabberConfig/lalibre.be.txt9
-rw-r--r--data/GrabberConfig/landetsfria.se.txt7
-rw-r--r--data/GrabberConfig/lapin-blanc.blogs.docteo.net.txt6
-rw-r--r--data/GrabberConfig/laprensagrafica.com.txt3
-rw-r--r--data/GrabberConfig/lapresse.ca.txt7
-rw-r--r--data/GrabberConfig/laquadrature.net.txt10
-rw-r--r--data/GrabberConfig/lareviewofbooks.org.txt12
-rw-r--r--data/GrabberConfig/latimes.com.txt11
-rw-r--r--data/GrabberConfig/laughingsquid.com.txt3
-rw-r--r--data/GrabberConfig/lawfareblog.com.txt4
-rw-r--r--data/GrabberConfig/leancrew.com.txt9
-rw-r--r--data/GrabberConfig/lececil.org.txt6
-rw-r--r--data/GrabberConfig/lefigaro.fr.txt9
-rw-r--r--data/GrabberConfig/lemonde.fr.txt20
-rw-r--r--data/GrabberConfig/lenta.ru.txt7
-rw-r--r--data/GrabberConfig/lesnumeriques.com.txt9
-rw-r--r--data/GrabberConfig/letraslibres.com.txt3
-rw-r--r--data/GrabberConfig/libcom.org.txt7
-rw-r--r--data/GrabberConfig/lifehacker.co.uk.txt7
-rw-r--r--data/GrabberConfig/lifehacker.com.txt53
-rw-r--r--data/GrabberConfig/lifestyle.inquirer.net.txt7
-rw-r--r--data/GrabberConfig/lifeweek.com.cn.txt23
-rw-r--r--data/GrabberConfig/linkedin.com.txt2
-rw-r--r--data/GrabberConfig/linuxjournal.com.txt6
-rw-r--r--data/GrabberConfig/linuxnix.com.txt8
-rw-r--r--data/GrabberConfig/lithub.com.txt4
-rw-r--r--data/GrabberConfig/livescience.com.txt20
-rw-r--r--data/GrabberConfig/longform.org.txt3
-rw-r--r--data/GrabberConfig/loopinsight.com.txt9
-rw-r--r--data/GrabberConfig/lostgarden.com.txt3
-rw-r--r--data/GrabberConfig/lowtechmagazine.com.txt6
-rw-r--r--data/GrabberConfig/lrb.co.uk.txt12
-rw-r--r--data/GrabberConfig/luminous-landscape.com.txt6
-rw-r--r--data/GrabberConfig/lupa.cz.txt3
-rw-r--r--data/GrabberConfig/luxuo.com.txt4
-rw-r--r--data/GrabberConfig/lwn.net.txt41
-rw-r--r--data/GrabberConfig/m.bbc.co.uk.txt14
-rw-r--r--data/GrabberConfig/m.douban.com.txt13
-rw-r--r--data/GrabberConfig/m.facebook.com.txt12
-rw-r--r--data/GrabberConfig/m.theregister.co.uk.txt4
-rw-r--r--data/GrabberConfig/m.vanityfair.com.txt11
-rw-r--r--data/GrabberConfig/m00natic.github.io.txt7
-rw-r--r--data/GrabberConfig/mac4ever.com.txt9
-rw-r--r--data/GrabberConfig/macdrifter.com.txt2
-rw-r--r--data/GrabberConfig/macg.co.txt11
-rw-r--r--data/GrabberConfig/macgeneration.com.txt5
-rw-r--r--data/GrabberConfig/macmagazine.com.br.txt21
-rw-r--r--data/GrabberConfig/macrumors.com.txt12
-rw-r--r--data/GrabberConfig/macstories.net.txt8
-rw-r--r--data/GrabberConfig/mactalk.com.au.txt4
-rw-r--r--data/GrabberConfig/mactechnews.de.txt3
-rw-r--r--data/GrabberConfig/macworld.com.txt24
-rw-r--r--data/GrabberConfig/mainpost.de.txt28
-rw-r--r--data/GrabberConfig/makeuseof.com.txt9
-rw-r--r--data/GrabberConfig/manager.co.th.txt26
-rw-r--r--data/GrabberConfig/manga-news.com.txt7
-rw-r--r--data/GrabberConfig/marco.org.txt8
-rw-r--r--data/GrabberConfig/marketingmag.com.au.txt1
-rw-r--r--data/GrabberConfig/marksdailyapple.com.txt2
-rw-r--r--data/GrabberConfig/martinfowler.com.txt8
-rw-r--r--data/GrabberConfig/mashable.com.txt11
-rw-r--r--data/GrabberConfig/matt.might.net.txt5
-rw-r--r--data/GrabberConfig/mattcutts.com.txt2
-rw-r--r--data/GrabberConfig/maxim.com.txt4
-rw-r--r--data/GrabberConfig/mbl.is.txt2
-rw-r--r--data/GrabberConfig/medialens.org.txt5
-rw-r--r--data/GrabberConfig/medium.com.txt17
-rw-r--r--data/GrabberConfig/megamp3.eu.txt8
-rw-r--r--data/GrabberConfig/menshealth.com.sg.txt7
-rw-r--r--data/GrabberConfig/menshealth.com.txt16
-rw-r--r--data/GrabberConfig/mesec.cz.txt4
-rw-r--r--data/GrabberConfig/metafilter.com.txt8
-rw-r--r--data/GrabberConfig/metrocop.net.txt6
-rw-r--r--data/GrabberConfig/mforum.cari.com.my.txt6
-rw-r--r--data/GrabberConfig/mikeash.com.txt5
-rw-r--r--data/GrabberConfig/mikeindustries.com.txt9
-rw-r--r--data/GrabberConfig/minnesota.publicradio.org.txt10
-rw-r--r--data/GrabberConfig/minnpost.com.txt5
-rw-r--r--data/GrabberConfig/mirrorfootball.co.uk.txt3
-rw-r--r--data/GrabberConfig/mises.org.txt5
-rw-r--r--data/GrabberConfig/mitchellrepublic.com.txt3
-rw-r--r--data/GrabberConfig/mlb.mlb.com.txt14
-rw-r--r--data/GrabberConfig/mlb.sbnation.com.txt14
-rw-r--r--data/GrabberConfig/mlssoccer.com.txt6
-rw-r--r--data/GrabberConfig/mmo-champion.com.txt5
-rw-r--r--data/GrabberConfig/mnn.com.txt11
-rw-r--r--data/GrabberConfig/mno.hu.txt14
-rw-r--r--data/GrabberConfig/mobile.nytimes.com.txt9
-rw-r--r--data/GrabberConfig/mobile.twitter.com.txt12
-rw-r--r--data/GrabberConfig/mobilenet.cz.txt3
-rw-r--r--data/GrabberConfig/mobileopportunity.blogspot.com.txt11
-rw-r--r--data/GrabberConfig/mobilmania.cz.txt7
-rw-r--r--data/GrabberConfig/modernghana.com.txt8
-rw-r--r--data/GrabberConfig/momentumsaga.com.txt5
-rw-r--r--data/GrabberConfig/money.cnn.com.txt24
-rw-r--r--data/GrabberConfig/moneymanagement.com.au.txt2
-rw-r--r--data/GrabberConfig/monkeyzen.com.txt2
-rw-r--r--data/GrabberConfig/moo.nac.uci.edu.txt9
-rw-r--r--data/GrabberConfig/moonsault.de.txt13
-rw-r--r--data/GrabberConfig/mostpleasent.com.txt7
-rw-r--r--data/GrabberConfig/motherboard.vice.com.txt5
-rw-r--r--data/GrabberConfig/mothering.com.txt7
-rw-r--r--data/GrabberConfig/motherjones.com.txt15
-rw-r--r--data/GrabberConfig/motorfull.com.txt2
-rw-r--r--data/GrabberConfig/movie.douban.com.txt12
-rw-r--r--data/GrabberConfig/msdn.microsoft.com.txt3
-rw-r--r--data/GrabberConfig/msnbc.msn.com.txt21
-rw-r--r--data/GrabberConfig/myfoxatlanta.com.txt5
-rw-r--r--data/GrabberConfig/myrecipes.com.txt12
-rw-r--r--data/GrabberConfig/n0where.net.txt5
-rw-r--r--data/GrabberConfig/nachrichten.at.txt8
-rw-r--r--data/GrabberConfig/naiz.eus.txt4
-rw-r--r--data/GrabberConfig/nakedsecurity.sophos.com.txt5
-rw-r--r--data/GrabberConfig/nasa.gov.txt8
-rw-r--r--data/GrabberConfig/nbnnews.com.au.txt3
-rw-r--r--data/GrabberConfig/nbweekly.com.txt10
-rw-r--r--data/GrabberConfig/neh.gov.txt17
-rw-r--r--data/GrabberConfig/net-security.org.txt7
-rw-r--r--data/GrabberConfig/netmagazine.com.txt16
-rw-r--r--data/GrabberConfig/networkworld.com.txt26
-rw-r--r--data/GrabberConfig/netzpolitik.org.txt6
-rw-r--r--data/GrabberConfig/neues-deutschland.de.txt9
-rw-r--r--data/GrabberConfig/newleftproject.org.txt3
-rw-r--r--data/GrabberConfig/newmatilda.com.txt9
-rw-r--r--data/GrabberConfig/newrepublic.com.txt8
-rw-r--r--data/GrabberConfig/news-gazette.com.txt8
-rw-r--r--data/GrabberConfig/news.cnet.com.txt12
-rw-r--r--data/GrabberConfig/news.com.au.txt3
-rw-r--r--data/GrabberConfig/news.detik.com.txt8
-rw-r--r--data/GrabberConfig/news.menshealth.com.txt1
-rw-r--r--data/GrabberConfig/news.mynavi.jp.txt11
-rw-r--r--data/GrabberConfig/news.ninemsn.com.au.txt3
-rw-r--r--data/GrabberConfig/news.pixelistes.com.txt12
-rw-r--r--data/GrabberConfig/news.rambler.ru.txt9
-rw-r--r--data/GrabberConfig/news.techmeme.com.txt4
-rw-r--r--data/GrabberConfig/news.yahoo.com.txt12
-rw-r--r--data/GrabberConfig/news.ycombinator.com.txt3
-rw-r--r--data/GrabberConfig/news.zing.vn.txt3
-rw-r--r--data/GrabberConfig/news247.gr.txt6
-rw-r--r--data/GrabberConfig/newsbomb.gr.txt9
-rw-r--r--data/GrabberConfig/newsunspun.org.txt10
-rw-r--r--data/GrabberConfig/newsweek.com.txt6
-rw-r--r--data/GrabberConfig/newswise.com.txt17
-rw-r--r--data/GrabberConfig/newyorker.com.txt11
-rw-r--r--data/GrabberConfig/nfl.com.txt11
-rw-r--r--data/GrabberConfig/ngm.nationalgeographic.com.txt7
-rw-r--r--data/GrabberConfig/nintendoworldreport.com.txt13
-rw-r--r--data/GrabberConfig/nojesguiden.se.txt5
-rw-r--r--data/GrabberConfig/northumberlandview.ca.txt11
-rw-r--r--data/GrabberConfig/nosalty.hu.txt6
-rw-r--r--data/GrabberConfig/notebookcheck.net.txt6
-rw-r--r--data/GrabberConfig/nplusonemag.com.txt6
-rw-r--r--data/GrabberConfig/npr.org.txt34
-rw-r--r--data/GrabberConfig/nrc.nl.txt5
-rw-r--r--data/GrabberConfig/numerama.com.txt1
-rw-r--r--data/GrabberConfig/nybooks.com.txt13
-rw-r--r--data/GrabberConfig/nymag.com.txt16
-rw-r--r--data/GrabberConfig/nyteknik.se.txt8
-rw-r--r--data/GrabberConfig/nytimes.com.txt53
-rw-r--r--data/GrabberConfig/nzz.ch.txt12
-rw-r--r--data/GrabberConfig/o6asan.com.txt6
-rw-r--r--data/GrabberConfig/off.net.mk.txt7
-rw-r--r--data/GrabberConfig/omaha.com.txt2
-rw-r--r--data/GrabberConfig/omgubuntu.co.uk.txt13
-rw-r--r--data/GrabberConfig/omiliya.org.txt9
-rw-r--r--data/GrabberConfig/onlinewelten.com.txt2
-rw-r--r--data/GrabberConfig/onstartups.com.txt2
-rw-r--r--data/GrabberConfig/ontologicalgeek.com.txt8
-rw-r--r--data/GrabberConfig/opensource.org.txt2
-rw-r--r--data/GrabberConfig/openthemagazine.com.txt4
-rw-r--r--data/GrabberConfig/openwebx.org.txt4
-rw-r--r--data/GrabberConfig/orf.at.txt32
-rw-r--r--data/GrabberConfig/origo.hu.txt18
-rw-r--r--data/GrabberConfig/oschina.net.txt3
-rw-r--r--data/GrabberConfig/outsideonline.com.txt6
-rw-r--r--data/GrabberConfig/pakmedia.tv.txt17
-rw-r--r--data/GrabberConfig/palmbeachpost.com.txt3
-rw-r--r--data/GrabberConfig/pandagon.net.txt5
-rw-r--r--data/GrabberConfig/pandodaily.com.txt5
-rw-r--r--data/GrabberConfig/panic.com.txt3
-rw-r--r--data/GrabberConfig/papodehomem.com.br.txt6
-rw-r--r--data/GrabberConfig/parislemon.com.txt6
-rw-r--r--data/GrabberConfig/parliament.uk.txt3
-rw-r--r--data/GrabberConfig/parool.nl.txt9
-rw-r--r--data/GrabberConfig/pastebin.com.txt6
-rw-r--r--data/GrabberConfig/pastepad.fivefilters.org.txt5
-rw-r--r--data/GrabberConfig/pathawks.com.txt8
-rw-r--r--data/GrabberConfig/pcmag.com.txt10
-rw-r--r--data/GrabberConfig/pcworld.com.txt19
-rw-r--r--data/GrabberConfig/penny-arcade.com.txt23
-rw-r--r--data/GrabberConfig/pentaxforums.com.txt2
-rw-r--r--data/GrabberConfig/perthnow.com.au.txt12
-rw-r--r--data/GrabberConfig/phastidio.net.txt6
-rw-r--r--data/GrabberConfig/philadelphiaeagles.com.txt6
-rw-r--r--data/GrabberConfig/philly.com.txt13
-rw-r--r--data/GrabberConfig/phonandroid.com.txt9
-rw-r--r--data/GrabberConfig/phoronix.com.txt8
-rw-r--r--data/GrabberConfig/photo.tutsplus.com.txt6
-rw-r--r--data/GrabberConfig/php.net.txt6
-rw-r--r--data/GrabberConfig/pieria.co.uk.txt3
-rw-r--r--data/GrabberConfig/pinterest.com.txt5
-rw-r--r--data/GrabberConfig/pitchfork.com.txt16
-rw-r--r--data/GrabberConfig/pittsburgh.pirates.mlb.com.txt15
-rw-r--r--data/GrabberConfig/pittsburghlive.com.txt7
-rw-r--r--data/GrabberConfig/pittsburghmagazine.com.txt8
-rw-r--r--data/GrabberConfig/pittsburghpanthers.com.txt4
-rw-r--r--data/GrabberConfig/pittscriptblog.com.txt8
-rw-r--r--data/GrabberConfig/pjmedia.com.txt7
-rw-r--r--data/GrabberConfig/planet3dnow.de.txt16
-rw-r--r--data/GrabberConfig/planetsave.com.txt1
-rw-r--r--data/GrabberConfig/planetvita.de.txt5
-rw-r--r--data/GrabberConfig/playboy.com.txt6
-rw-r--r--data/GrabberConfig/ploum.net.txt8
-rw-r--r--data/GrabberConfig/plus.google.com.txt14
-rw-r--r--data/GrabberConfig/plzkthxbai.com.txt4
-rw-r--r--data/GrabberConfig/pogue.blogs.nytimes.com.txt4
-rw-r--r--data/GrabberConfig/politico.com.txt13
-rw-r--r--data/GrabberConfig/politifact.com.txt4
-rw-r--r--data/GrabberConfig/politiken.dk.txt13
-rw-r--r--data/GrabberConfig/polygon.com.txt34
-rw-r--r--data/GrabberConfig/popehat.com.txt6
-rw-r--r--data/GrabberConfig/popsci.com.txt11
-rw-r--r--data/GrabberConfig/popularmechanics.com.txt8
-rw-r--r--data/GrabberConfig/portertech.ca.txt3
-rw-r--r--data/GrabberConfig/positioningmag.com.txt19
-rw-r--r--data/GrabberConfig/post-gazette.com.txt26
-rw-r--r--data/GrabberConfig/posta.com.tr.txt15
-rw-r--r--data/GrabberConfig/prb.org.txt8
-rw-r--r--data/GrabberConfig/presse-citron.net.txt9
-rw-r--r--data/GrabberConfig/presseportal.de.txt11
-rw-r--r--data/GrabberConfig/pro-linux.de.txt19
-rw-r--r--data/GrabberConfig/prog21.dadgum.com.txt9
-rw-r--r--data/GrabberConfig/prolost.com.txt4
-rw-r--r--data/GrabberConfig/propublica.org.txt11
-rw-r--r--data/GrabberConfig/prosa.dk.txt4
-rw-r--r--data/GrabberConfig/prospectmagazine.co.uk.txt26
-rw-r--r--data/GrabberConfig/protothema.gr.txt6
-rw-r--r--data/GrabberConfig/psychologytoday.com.txt9
-rw-r--r--data/GrabberConfig/publications.parliament.uk.txt4
-rw-r--r--data/GrabberConfig/publico.pt.txt12
-rw-r--r--data/GrabberConfig/purpleplanetmedia.com.txt4
-rw-r--r--data/GrabberConfig/putaindecode.io.txt6
-rw-r--r--data/GrabberConfig/pymotw.com.txt5
-rw-r--r--data/GrabberConfig/pérotin.com.txt6
-rw-r--r--data/GrabberConfig/qctimes.com.txt5
-rw-r--r--data/GrabberConfig/quantumdiaries.org.txt14
-rw-r--r--data/GrabberConfig/quechoisir.org.txt10
-rw-r--r--data/GrabberConfig/queerty.com.txt3
-rw-r--r--data/GrabberConfig/quora.com.txt28
-rw-r--r--data/GrabberConfig/racjonalista.pl.txt5
-rw-r--r--data/GrabberConfig/radar.oreilly.com.txt3
-rw-r--r--data/GrabberConfig/radionz.co.nz.txt3
-rw-r--r--data/GrabberConfig/randsinrepose.com.txt11
-rw-r--r--data/GrabberConfig/rasgolatente.es.txt6
-rw-r--r--data/GrabberConfig/readability.com.txt3
-rw-r--r--data/GrabberConfig/readwriteweb.com.txt8
-rw-r--r--data/GrabberConfig/real.gr.txt5
-rw-r--r--data/GrabberConfig/rebooti.com.txt10
-rw-r--r--data/GrabberConfig/recipe.com.txt10
-rw-r--r--data/GrabberConfig/reddit.com.txt22
-rw-r--r--data/GrabberConfig/redmondpie.com.txt13
-rw-r--r--data/GrabberConfig/reflets.info.txt6
-rw-r--r--data/GrabberConfig/renenekuda.cz.txt3
-rw-r--r--data/GrabberConfig/resume.se.txt7
-rw-r--r--data/GrabberConfig/reuters.com.txt10
-rw-r--r--data/GrabberConfig/revistapiaui.estadao.com.br.txt10
-rw-r--r--data/GrabberConfig/rezeptwelt.de.txt5
-rw-r--r--data/GrabberConfig/rhenus.com.txt5
-rw-r--r--data/GrabberConfig/robertsspaceindustries.com.txt4
-rw-r--r--data/GrabberConfig/robots.thoughtbot.com.txt5
-rw-r--r--data/GrabberConfig/rockpapershotgun.com.txt10
-rw-r--r--data/GrabberConfig/rodrigo.sharpcube.com.txt7
-rw-r--r--data/GrabberConfig/rogerebert.com.txt8
-rw-r--r--data/GrabberConfig/rollingstone.com.txt10
-rw-r--r--data/GrabberConfig/root.cz.txt6
-rw-r--r--data/GrabberConfig/rottentomatoes.com.txt11
-rw-r--r--data/GrabberConfig/roughtype.com.txt5
-rw-r--r--data/GrabberConfig/roy.gbiv.com.txt2
-rw-r--r--data/GrabberConfig/rpgsite.net.txt4
-rw-r--r--data/GrabberConfig/rubysfera.pl.txt9
-rw-r--r--data/GrabberConfig/ruhlman.com.txt6
-rw-r--r--data/GrabberConfig/saadaalnews.net.txt11
-rw-r--r--data/GrabberConfig/salon.com.txt11
-rw-r--r--data/GrabberConfig/salzburg.com.txt6
-rw-r--r--data/GrabberConfig/sanpedrosun.com.txt10
-rw-r--r--data/GrabberConfig/saveyourself.ca.txt25
-rw-r--r--data/GrabberConfig/sayidaty.net.txt4
-rw-r--r--data/GrabberConfig/sbnation.com.txt28
-rw-r--r--data/GrabberConfig/schneier.com.txt25
-rw-r--r--data/GrabberConfig/scienceblogs.de.txt12
-rw-r--r--data/GrabberConfig/scienceticker.info.txt11
-rw-r--r--data/GrabberConfig/scientificamerican.com.txt25
-rw-r--r--data/GrabberConfig/scilogs.de.txt15
-rw-r--r--data/GrabberConfig/scotusblog.com.txt8
-rw-r--r--data/GrabberConfig/scripting.com.txt8
-rw-r--r--data/GrabberConfig/searchenginejournal.com.txt5
-rw-r--r--data/GrabberConfig/searchengineland.com.txt20
-rw-r--r--data/GrabberConfig/seattletransitblog.com.txt5
-rw-r--r--data/GrabberConfig/secushare.com.txt12
-rw-r--r--data/GrabberConfig/select.yeeyan.org.txt18
-rw-r--r--data/GrabberConfig/semiaccurate.com.txt13
-rw-r--r--data/GrabberConfig/seriouseats.com.txt15
-rw-r--r--data/GrabberConfig/servethehome.com.txt6
-rw-r--r--data/GrabberConfig/sf.curbed.com.txt7
-rw-r--r--data/GrabberConfig/sf.eater.com.txt7
-rw-r--r--data/GrabberConfig/sfgate.com.txt12
-rw-r--r--data/GrabberConfig/sfweekly.com.txt3
-rw-r--r--data/GrabberConfig/shabayek.com.txt3
-rw-r--r--data/GrabberConfig/shawnblanc.net.txt11
-rw-r--r--data/GrabberConfig/shifteleven.com.txt6
-rw-r--r--data/GrabberConfig/siasat.pk.txt11
-rw-r--r--data/GrabberConfig/signalscv.com.txt10
-rw-r--r--data/GrabberConfig/singaporeanstocksinvestor.blogspot.com.txt5
-rw-r--r--data/GrabberConfig/singularityhub.com.txt2
-rw-r--r--data/GrabberConfig/sintagoulis.gr.txt6
-rw-r--r--data/GrabberConfig/skanesfria.se.txt7
-rw-r--r--data/GrabberConfig/slashfilm.com.txt15
-rw-r--r--data/GrabberConfig/slate.com.txt19
-rw-r--r--data/GrabberConfig/slate.fr.txt11
-rw-r--r--data/GrabberConfig/slice.seriouseats.com.txt15
-rw-r--r--data/GrabberConfig/slog.thestranger.com.txt4
-rw-r--r--data/GrabberConfig/smartmania.cz.txt6
-rw-r--r--data/GrabberConfig/smbc-comics.com.txt12
-rw-r--r--data/GrabberConfig/sme.sk.txt3
-rw-r--r--data/GrabberConfig/smh.com.au.txt14
-rw-r--r--data/GrabberConfig/smh.drive.com.au.txt13
-rw-r--r--data/GrabberConfig/smithsonianmag.com.txt23
-rw-r--r--data/GrabberConfig/snip.ly.txt3
-rw-r--r--data/GrabberConfig/somethingawful.com.txt17
-rw-r--r--data/GrabberConfig/songshuhui.net.txt7
-rw-r--r--data/GrabberConfig/soundcity.tv.txt3
-rw-r--r--data/GrabberConfig/sourcebooks.com.txt4
-rw-r--r--data/GrabberConfig/spectrum.ieee.org.txt3
-rw-r--r--data/GrabberConfig/speirs.org.txt2
-rw-r--r--data/GrabberConfig/spiegel.de.txt96
-rw-r--r--data/GrabberConfig/spiil.org.txt6
-rw-r--r--data/GrabberConfig/spiked-online.com.txt7
-rw-r--r--data/GrabberConfig/spin.com.txt5
-rw-r--r--data/GrabberConfig/splatf.com.txt5
-rw-r--r--data/GrabberConfig/splitsider.com.txt4
-rw-r--r--data/GrabberConfig/sport.detik.com.txt8
-rw-r--r--data/GrabberConfig/sport365.fr.txt8
-rw-r--r--data/GrabberConfig/sports.espn.go.com.txt12
-rw-r--r--data/GrabberConfig/sports.yahoo.com.txt9
-rw-r--r--data/GrabberConfig/sprengsatz.de.txt5
-rw-r--r--data/GrabberConfig/sqlite.org.txt7
-rw-r--r--data/GrabberConfig/squashed.tumblr.com.txt4
-rwxr-xr-xdata/GrabberConfig/srf.ch.txt24
-rw-r--r--data/GrabberConfig/stackoverflow.com.txt14
-rw-r--r--data/GrabberConfig/stalbansreview.co.uk.txt14
-rw-r--r--data/GrabberConfig/standard.co.uk.txt16
-rw-r--r--data/GrabberConfig/stephenfry.com.txt8
-rw-r--r--data/GrabberConfig/stlbeacon.org.txt5
-rwxr-xr-xdata/GrabberConfig/stockholm.etc.se.txt5
-rwxr-xr-xdata/GrabberConfig/stockholmsfria.se.txt7
-rw-r--r--data/GrabberConfig/straightdope.com.txt6
-rw-r--r--data/GrabberConfig/streetsblog.net.txt7
-rw-r--r--data/GrabberConfig/stuff.co.nz.txt22
-rw-r--r--data/GrabberConfig/stumbleupon.com.txt3
-rw-r--r--data/GrabberConfig/subtraction.com.txt17
-rw-r--r--data/GrabberConfig/sueddeutsche.de.txt33
-rw-r--r--data/GrabberConfig/sunshinecoastdaily.com.au.txt10
-rw-r--r--data/GrabberConfig/suntimes.com.txt14
-rw-r--r--data/GrabberConfig/svd.se.txt14
-rw-r--r--data/GrabberConfig/svt.se.txt16
-rw-r--r--data/GrabberConfig/sydsvenskan.se.txt18
-rw-r--r--data/GrabberConfig/symmetrymagazine.org.txt12
-rw-r--r--data/GrabberConfig/sz-magazin.sueddeutsche.de.txt15
-rw-r--r--data/GrabberConfig/sz.de.txt11
-rw-r--r--data/GrabberConfig/tabletmag.com.txt5
-rwxr-xr-xdata/GrabberConfig/tagesanzeiger.ch.txt14
-rw-r--r--data/GrabberConfig/tagesschau.de.txt15
-rw-r--r--data/GrabberConfig/tagesspiegel.de.txt60
-rw-r--r--data/GrabberConfig/tampabay.com.txt5
-rw-r--r--data/GrabberConfig/taptaptap.com.txt4
-rw-r--r--data/GrabberConfig/tasteofhome.com.txt11
-rw-r--r--data/GrabberConfig/taz.de.txt9
-rw-r--r--data/GrabberConfig/tbray.org.txt5
-rw-r--r--data/GrabberConfig/teamliquid.net.txt21
-rw-r--r--data/GrabberConfig/tech.fortune.cnn.com.txt4
-rw-r--r--data/GrabberConfig/tech.sina.com.cn.txt11
-rw-r--r--data/GrabberConfig/techcrunch.com.txt19
-rw-r--r--data/GrabberConfig/techdirt.com.txt12
-rw-r--r--data/GrabberConfig/techhive.com.txt18
-rw-r--r--data/GrabberConfig/techmeme.com.txt3
-rw-r--r--data/GrabberConfig/techno-science.net.txt3
-rw-r--r--data/GrabberConfig/technologizer.com.txt5
-rw-r--r--data/GrabberConfig/technologyreview.com.txt17
-rw-r--r--data/GrabberConfig/techpinions.com.txt7
-rw-r--r--data/GrabberConfig/techradar.com.txt12
-rw-r--r--data/GrabberConfig/telegraaf.nl.txt9
-rw-r--r--data/GrabberConfig/telegraph.co.uk.txt10
-rw-r--r--data/GrabberConfig/thanhnien.com.vn.txt4
-rw-r--r--data/GrabberConfig/the-magazine.org.txt3
-rw-r--r--data/GrabberConfig/theage.com.au.txt5
-rw-r--r--data/GrabberConfig/theamericanscholar.org.txt13
-rw-r--r--data/GrabberConfig/theatlantic.com.txt30
-rw-r--r--data/GrabberConfig/theatlanticcities.com.txt17
-rw-r--r--data/GrabberConfig/theaustralian.com.au.txt6
-rw-r--r--data/GrabberConfig/thebostonchannel.com.txt7
-rw-r--r--data/GrabberConfig/thedailybeast.com.txt7
-rw-r--r--data/GrabberConfig/thedailymash.co.uk.txt14
-rw-r--r--data/GrabberConfig/thedisneyblog.com.txt7
-rw-r--r--data/GrabberConfig/thefilmexperience.net.txt2
-rw-r--r--data/GrabberConfig/thegamedesignforum.com.txt14
-rw-r--r--data/GrabberConfig/thegap.at.txt41
-rw-r--r--data/GrabberConfig/theglobalmail.org.txt41
-rw-r--r--data/GrabberConfig/theglobeandmail.com.txt10
-rw-r--r--data/GrabberConfig/thegreatdiscontent.com.txt6
-rw-r--r--data/GrabberConfig/theguardian.com.txt43
-rw-r--r--data/GrabberConfig/theindychannel.com.txt13
-rw-r--r--data/GrabberConfig/theintercept.com.txt4
-rw-r--r--data/GrabberConfig/themarker.com.txt11
-rw-r--r--data/GrabberConfig/themillions.com.txt10
-rw-r--r--data/GrabberConfig/thenation.com.txt13
-rw-r--r--data/GrabberConfig/thenetworkgarden.blogs.com.txt4
-rw-r--r--data/GrabberConfig/thenews.coop.txt3
-rw-r--r--data/GrabberConfig/thenextgeneration.org.txt8
-rw-r--r--data/GrabberConfig/thenextweb.com.txt16
-rw-r--r--data/GrabberConfig/theoaklandpress.com.txt3
-rw-r--r--data/GrabberConfig/theonion.com.txt11
-rw-r--r--data/GrabberConfig/thepioneerwoman.com.txt11
-rw-r--r--data/GrabberConfig/thepointmag.com.txt5
-rw-r--r--data/GrabberConfig/theregister.co.uk.txt9
-rw-r--r--data/GrabberConfig/theroot.com.txt3
-rw-r--r--data/GrabberConfig/therumpus.net.txt4
-rw-r--r--data/GrabberConfig/thesimpledollar.com.txt4
-rw-r--r--data/GrabberConfig/thespoiler.co.uk.txt3
-rw-r--r--data/GrabberConfig/thespoof.com.txt9
-rw-r--r--data/GrabberConfig/thestranger.com.txt12
-rw-r--r--data/GrabberConfig/thestreet.com.txt25
-rw-r--r--data/GrabberConfig/thethaovanhoa.vn.txt2
-rw-r--r--data/GrabberConfig/theverge.com.txt62
-rw-r--r--data/GrabberConfig/theweek.com.txt8
-rw-r--r--data/GrabberConfig/thinkprogress.org.txt4
-rw-r--r--data/GrabberConfig/thisdaylive.com.txt2
-rw-r--r--data/GrabberConfig/thisiscolossal.com.txt25
-rw-r--r--data/GrabberConfig/tidbits.com.txt3
-rw-r--r--data/GrabberConfig/time.com.txt12
-rw-r--r--data/GrabberConfig/timeshighereducation.co.uk.txt6
-rw-r--r--data/GrabberConfig/timeshighereducation.com.txt3
-rw-r--r--data/GrabberConfig/tipb.com.txt9
-rw-r--r--data/GrabberConfig/titanic-magazin.de.txt8
-rw-r--r--data/GrabberConfig/tnr.com.txt17
-rw-r--r--data/GrabberConfig/tofugu.com.txt3
-rw-r--r--data/GrabberConfig/tomdispatch.com.txt6
-rw-r--r--data/GrabberConfig/tomshardware.com.txt8
-rw-r--r--data/GrabberConfig/tomshardware.de.txt12
-rwxr-xr-xdata/GrabberConfig/toolinux.com.txt5
-rw-r--r--data/GrabberConfig/toolsandtoys.net.txt6
-rw-r--r--data/GrabberConfig/towerofthehand.com.txt10
-rw-r--r--data/GrabberConfig/tracks.ranea.org.txt14
-rw-r--r--data/GrabberConfig/trailer.web-view.net.txt2
-rw-r--r--data/GrabberConfig/trailers.apple.com.txt9
-rw-r--r--data/GrabberConfig/trailerzone.de.txt9
-rw-r--r--data/GrabberConfig/traningslara.se.txt8
-rw-r--r--data/GrabberConfig/triblive.com.txt13
-rw-r--r--data/GrabberConfig/truongtx.me.txt9
-rw-r--r--data/GrabberConfig/truthdig.com.txt12
-rw-r--r--data/GrabberConfig/tthfanfic.org.txt4
-rw-r--r--data/GrabberConfig/tuaw.com.txt6
-rw-r--r--data/GrabberConfig/tuhdo.github.io.txt7
-rw-r--r--data/GrabberConfig/tvtropes.org.txt20
-rw-r--r--data/GrabberConfig/tweakers.net.txt9
-rw-r--r--data/GrabberConfig/twitter.com.txt16
-rw-r--r--data/GrabberConfig/ubuntugeek.com.txt9
-rw-r--r--data/GrabberConfig/uefa.com.txt6
-rw-r--r--data/GrabberConfig/uk.xbox360.ign.com.txt23
-rw-r--r--data/GrabberConfig/uni-watch.com.txt17
-rw-r--r--data/GrabberConfig/unwinnable.com.txt9
-rw-r--r--data/GrabberConfig/uppsalafria.se.txt7
-rw-r--r--data/GrabberConfig/urbandictionary.com.txt3
-rw-r--r--data/GrabberConfig/usatoday.com.txt8
-rw-r--r--data/GrabberConfig/usccb.org.txt6
-rw-r--r--data/GrabberConfig/useit.com.txt8
-rw-r--r--data/GrabberConfig/usfirst.org.txt6
-rw-r--r--data/GrabberConfig/utdailybeacon.com.txt2
-rw-r--r--data/GrabberConfig/ux.artu.tv.txt7
-rw-r--r--data/GrabberConfig/vanityfair.com.txt10
-rw-r--r--data/GrabberConfig/variety.com.txt11
-rw-r--r--data/GrabberConfig/varsity.co.uk.txt4
-rw-r--r--data/GrabberConfig/vea.gov.vn.txt7
-rw-r--r--data/GrabberConfig/vedomosti.ru.txt3
-rw-r--r--data/GrabberConfig/veggbilder.no.txt5
-rw-r--r--data/GrabberConfig/venturebeat.com.txt6
-rw-r--r--data/GrabberConfig/version2.dk.txt12
-rw-r--r--data/GrabberConfig/verybestbaking.com.txt7
-rw-r--r--data/GrabberConfig/vg.no.txt3
-rw-r--r--data/GrabberConfig/video.forbes.com.txt9
-rw-r--r--data/GrabberConfig/videogum.com.txt6
-rw-r--r--data/GrabberConfig/villagevoice.com.txt9
-rw-r--r--data/GrabberConfig/vimeo.com.txt17
-rw-r--r--data/GrabberConfig/viply.de.txt12
-rw-r--r--data/GrabberConfig/visir.is.txt14
-rw-r--r--data/GrabberConfig/vitispr.com.txt6
-rw-r--r--data/GrabberConfig/vivirmexico.com.txt2
-rw-r--r--data/GrabberConfig/vnexpress.net.txt8
-rw-r--r--data/GrabberConfig/voices.washingtonpost.com.txt3
-rw-r--r--data/GrabberConfig/volkskrant.nl.txt19
-rw-r--r--data/GrabberConfig/vox.com.txt8
-rw-r--r--data/GrabberConfig/vr-zone.com.txt14
-rw-r--r--data/GrabberConfig/vworker.com.txt3
-rw-r--r--data/GrabberConfig/waffle.wootest.net.txt4
-rw-r--r--data/GrabberConfig/warnerbros.fr.txt2
-rw-r--r--data/GrabberConfig/washingtoninstitute.org.txt6
-rw-r--r--data/GrabberConfig/washingtonmonthly.com.txt10
-rw-r--r--data/GrabberConfig/washingtonpost.com.txt38
-rw-r--r--data/GrabberConfig/watoday.com.au.txt7
-rw-r--r--data/GrabberConfig/web-libre.org.txt6
-rw-r--r--data/GrabberConfig/weblogs.asp.net.txt9
-rw-r--r--data/GrabberConfig/webmasters.googleblog.com.txt9
-rw-r--r--data/GrabberConfig/webupd8.org.txt12
-rw-r--r--data/GrabberConfig/webwereld.nl.txt8
-rw-r--r--data/GrabberConfig/weeklytimesnow.com.au.txt4
-rw-r--r--data/GrabberConfig/welt.de.txt22
-rw-r--r--data/GrabberConfig/westernadvocate.com.au.txt11
-rw-r--r--data/GrabberConfig/what-if.xkcd.com.txt2
-rw-r--r--data/GrabberConfig/whatever.scalzi.com.txt7
-rw-r--r--data/GrabberConfig/wiki.guildwars.com.txt8
-rw-r--r--data/GrabberConfig/wiki.guildwars2.com.txt8
-rw-r--r--data/GrabberConfig/wikihow.com.txt15
-rw-r--r--data/GrabberConfig/wikitravel.org.txt14
-rw-r--r--data/GrabberConfig/will-self.com.txt4
-rw-r--r--data/GrabberConfig/winfuture.de.txt12
-rw-r--r--data/GrabberConfig/winrumors.com.txt6
-rw-r--r--data/GrabberConfig/wired.com.txt29
-rw-r--r--data/GrabberConfig/wired.de.txt7
-rw-r--r--data/GrabberConfig/wmpoweruser.com.txt4
-rw-r--r--data/GrabberConfig/wn.de.txt18
-rw-r--r--data/GrabberConfig/wordyard.com.txt8
-rw-r--r--data/GrabberConfig/worldpoultry.net.txt5
-rw-r--r--data/GrabberConfig/worldwidewords.org.txt4
-rw-r--r--data/GrabberConfig/wow.joystiq.com.txt6
-rw-r--r--data/GrabberConfig/wpmayor.com.txt8
-rw-r--r--data/GrabberConfig/wsj.com.txt31
-rw-r--r--data/GrabberConfig/wtatennis.com.txt7
-rw-r--r--data/GrabberConfig/www1.folha.uol.com.br.txt15
-rw-r--r--data/GrabberConfig/www3.imperial.ac.uk.txt2
-rw-r--r--data/GrabberConfig/wyborcza.pl.txt9
-rw-r--r--data/GrabberConfig/wz-newsline.de.txt5
-rw-r--r--data/GrabberConfig/xoeb.us.txt4
-rw-r--r--data/GrabberConfig/yated.com.txt2
-rw-r--r--data/GrabberConfig/ynet.co.il.txt26
-rw-r--r--data/GrabberConfig/yosko.net.txt6
-rw-r--r--data/GrabberConfig/yostivanich.com.txt5
-rw-r--r--data/GrabberConfig/yourerie.com.txt2
-rw-r--r--data/GrabberConfig/zdnet.com.txt10
-rw-r--r--data/GrabberConfig/ze.tt.txt16
-rw-r--r--data/GrabberConfig/zeit.de.txt62
-rw-r--r--data/GrabberConfig/zerodistraction.com.txt4
-rw-r--r--data/GrabberConfig/zerohedge.com.txt10
-rw-r--r--data/GrabberConfig/zerokspot.com.txt3
-rw-r--r--data/GrabberConfig/zhihu.com.txt19
-rw-r--r--data/GrabberConfig/zive.cz.txt9
-rw-r--r--data/application-icons/meson.build4
-rw-r--r--data/gtk-css/basics.css70
-rw-r--r--data/gtk-css/dark.css38
-rw-r--r--data/gtk-css/elementary.css78
-rw-r--r--data/gtk-css/gtk.css42
-rw-r--r--data/meson.build56
-rwxr-xr-xdata/org.gnome.FeedReader-autostart.desktop.in2
-rw-r--r--data/org.gnome.FeedReader.Daemon.service.in3
-rw-r--r--data/org.gnome.FeedReader.appdata.xml.in188
-rwxr-xr-xdata/org.gnome.FeedReader.desktop.in2
-rw-r--r--data/org.gnome.FeedReader.gresource.xml11
-rw-r--r--data/tt-rss-feedreader-plugin/api_feedreader/init.php43
-rw-r--r--debian/control29
-rw-r--r--docker/Dockerfile52
-rwxr-xr-xdocker/update_image.sh5
-rw-r--r--flatpak/Makefile44
-rw-r--r--flatpak/Makefile.config19
-rw-r--r--flatpak/feedreader.flatpakref.in12
-rw-r--r--flatpak/feedreader.flatpakrepo.in6
-rw-r--r--flatpak/org.gnome.FeedReader.json.in100
-rw-r--r--gtester-to-junit-4.xsl120
-rw-r--r--libVilistextum/CMakeLists.txt24
-rw-r--r--libgd/CMakeLists.txt6
-rw-r--r--libgtkimageview/CMakeLists.txt3
-rw-r--r--libraries/WebExtension/meson.build18
-rw-r--r--libraries/WebExtension/webextension.vala188
-rw-r--r--libraries/libIvy/Extractor.vala422
-rw-r--r--libraries/libIvy/Frame.vala102
-rw-r--r--libraries/libIvy/Printer.vala242
-rw-r--r--libraries/libIvy/Stacktrace.vala401
-rw-r--r--libraries/libIvy/meson.build16
-rw-r--r--libraries/libVilistextum/charset.c (renamed from libVilistextum/charset.c)48
-rw-r--r--libraries/libVilistextum/charset.h (renamed from libVilistextum/charset.h)0
-rw-r--r--libraries/libVilistextum/fileio.c (renamed from libVilistextum/fileio.c)40
-rw-r--r--libraries/libVilistextum/fileio.h (renamed from libVilistextum/fileio.h)2
-rw-r--r--libraries/libVilistextum/html.c (renamed from libVilistextum/html.c)0
-rw-r--r--libraries/libVilistextum/html.h (renamed from libVilistextum/html.h)0
-rw-r--r--libraries/libVilistextum/html_tag.c (renamed from libVilistextum/html_tag.c)0
-rw-r--r--libraries/libVilistextum/html_tag.h (renamed from libVilistextum/html_tag.h)0
-rw-r--r--libraries/libVilistextum/latin1.c (renamed from libVilistextum/latin1.c)0
-rw-r--r--libraries/libVilistextum/latin1.h (renamed from libVilistextum/latin1.h)0
-rw-r--r--libraries/libVilistextum/lists.c (renamed from libVilistextum/lists.c)0
-rw-r--r--libraries/libVilistextum/lists.h (renamed from libVilistextum/lists.h)0
-rw-r--r--libraries/libVilistextum/meson.build18
-rw-r--r--libraries/libVilistextum/microsoft.c (renamed from libVilistextum/microsoft.c)0
-rw-r--r--libraries/libVilistextum/microsoft.h (renamed from libVilistextum/microsoft.h)0
-rw-r--r--libraries/libVilistextum/multibyte.h (renamed from libVilistextum/multibyte.h)0
-rw-r--r--libraries/libVilistextum/text.c (renamed from libVilistextum/text.c)0
-rw-r--r--libraries/libVilistextum/text.h (renamed from libVilistextum/text.h)0
-rw-r--r--libraries/libVilistextum/unicode_entities.c (renamed from libVilistextum/unicode_entities.c)0
-rw-r--r--libraries/libVilistextum/unicode_entities.h (renamed from libVilistextum/unicode_entities.h)0
-rw-r--r--libraries/libVilistextum/util.c (renamed from libVilistextum/util.c)0
-rw-r--r--libraries/libVilistextum/util.h (renamed from libVilistextum/util.h)0
-rw-r--r--libraries/libVilistextum/vilistextum.c (renamed from libVilistextum/vilistextum.c)27
-rw-r--r--libraries/libVilistextum/vilistextum.h (renamed from libVilistextum/vilistextum.h)0
-rw-r--r--libraries/libgd/gd-notification.c (renamed from libgd/gd-notification.c)442
-rw-r--r--libraries/libgd/gd-notification.h (renamed from libgd/gd-notification.h)4
-rw-r--r--libraries/libgd/gd-types-catalog.c (renamed from libgd/gd-types-catalog.c)0
-rw-r--r--libraries/libgd/gd-types-catalog.h (renamed from libgd/gd-types-catalog.h)0
-rw-r--r--libraries/libgd/gd.h (renamed from libgd/gd.h)0
-rw-r--r--libraries/libgd/meson.build12
-rw-r--r--libraries/libgtkimageview/gtkimageview.c (renamed from libgtkimageview/gtkimageview.c)1518
-rw-r--r--libraries/libgtkimageview/gtkimageview.h (renamed from libgtkimageview/gtkimageview.h)52
-rw-r--r--libraries/libgtkimageview/meson.build10
-rw-r--r--meson.build296
-rw-r--r--meson_options.txt12
-rwxr-xr-xmeson_post_install.py18
-rw-r--r--org.gnome.FeedReader.json81
-rw-r--r--plugins/CMakeLists.txt2
-rw-r--r--plugins/backend/CMakeLists.txt50
-rw-r--r--plugins/backend/bazqux/bazqux.gresource.xml7
-rw-r--r--plugins/backend/bazqux/bazqux.plugin (renamed from plugins/backend/oldreader/oldreaderUI.plugin)7
-rw-r--r--plugins/backend/bazqux/bazquxAPI.vala474
-rw-r--r--plugins/backend/bazqux/bazquxConnection.vala142
-rw-r--r--plugins/backend/bazqux/bazquxInterface.vala457
-rw-r--r--plugins/backend/bazqux/bazquxUtils.vala100
-rw-r--r--plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux-symbolic.svg63
-rw-r--r--plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux.svg100
-rw-r--r--plugins/backend/bazqux/meson.build49
-rw-r--r--plugins/backend/bazqux/org.gnome.feedreader.bazqux.gschema.xml24
-rw-r--r--plugins/backend/demo/CMakeLists.txt79
-rw-r--r--plugins/backend/demo/demo.plugin1
-rw-r--r--plugins/backend/demo/demoInterface.vala144
-rw-r--r--plugins/backend/demo/demoLoginWidget.vala156
-rw-r--r--plugins/backend/demo/demoUI.plugin8
-rw-r--r--plugins/backend/demo/meson.build41
-rw-r--r--plugins/backend/demo/org.gnome.feedreader.demo.gschema.xml2
-rw-r--r--plugins/backend/feedbin/CMakeLists.txt83
-rw-r--r--plugins/backend/feedbin/TestFeedbin.vala246
-rw-r--r--plugins/backend/feedbin/feedbin.plugin1
-rw-r--r--plugins/backend/feedbin/feedbinAPI.vala541
-rw-r--r--plugins/backend/feedbin/feedbinConnection.vala84
-rw-r--r--plugins/backend/feedbin/feedbinInterface.vala678
-rw-r--r--plugins/backend/feedbin/feedbinLoginWidget.vala154
-rw-r--r--plugins/backend/feedbin/feedbinUI.plugin8
-rw-r--r--plugins/backend/feedbin/feedbinUtils.vala128
-rw-r--r--plugins/backend/feedbin/meson.build106
-rw-r--r--plugins/backend/feedbin/org.gnome.feedreader.feedbin.gschema.xml6
-rw-r--r--plugins/backend/feedhq/feedhq.gresource.xml7
-rw-r--r--plugins/backend/feedhq/feedhq.plugin9
-rw-r--r--plugins/backend/feedhq/feedhqAPI.vala472
-rw-r--r--plugins/backend/feedhq/feedhqConnection.vala165
-rw-r--r--plugins/backend/feedhq/feedhqInterface.vala443
-rw-r--r--plugins/backend/feedhq/feedhqUtils.vala119
-rw-r--r--plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq-symbolic.svg80
-rw-r--r--plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq.svg80
-rw-r--r--plugins/backend/feedhq/meson.build49
-rw-r--r--plugins/backend/feedhq/org.gnome.feedreader.feedhq.gschema.xml30
-rw-r--r--plugins/backend/feedly/CMakeLists.txt83
-rw-r--r--plugins/backend/feedly/feedly.plugin1
-rw-r--r--plugins/backend/feedly/feedlyAPI.vala246
-rw-r--r--plugins/backend/feedly/feedlyConnection.vala95
-rw-r--r--plugins/backend/feedly/feedlyInterface.vala161
-rw-r--r--plugins/backend/feedly/feedlyLoginWidget.vala108
-rw-r--r--plugins/backend/feedly/feedlyUI.plugin8
-rw-r--r--plugins/backend/feedly/feedlyUtils.vala73
-rw-r--r--plugins/backend/feedly/meson.build49
-rw-r--r--plugins/backend/feedly/org.gnome.feedreader.feedly.gschema.xml6
-rw-r--r--plugins/backend/fresh/CMakeLists.txt84
-rw-r--r--plugins/backend/fresh/fresh.plugin1
-rw-r--r--plugins/backend/fresh/freshAPI.vala157
-rw-r--r--plugins/backend/fresh/freshConnection.vala63
-rw-r--r--plugins/backend/fresh/freshInterface.vala231
-rw-r--r--plugins/backend/fresh/freshLoginWidget.vala211
-rw-r--r--plugins/backend/fresh/freshUI.plugin8
-rw-r--r--plugins/backend/fresh/freshUtils.vala211
-rw-r--r--plugins/backend/fresh/meson.build49
-rw-r--r--plugins/backend/fresh/org.gnome.feedreader.fresh.gschema.xml6
-rw-r--r--plugins/backend/inoreader/CMakeLists.txt82
-rw-r--r--plugins/backend/inoreader/InoReaderAPI.vala150
-rw-r--r--plugins/backend/inoreader/InoReaderConnection.vala43
-rw-r--r--plugins/backend/inoreader/InoReaderInterface.vala178
-rw-r--r--plugins/backend/inoreader/InoReaderLoginWidget.vala126
-rw-r--r--plugins/backend/inoreader/InoReaderUtils.vala92
-rw-r--r--plugins/backend/inoreader/inoreader.plugin1
-rw-r--r--plugins/backend/inoreader/inoreaderUI.plugin8
-rw-r--r--plugins/backend/inoreader/meson.build49
-rw-r--r--plugins/backend/inoreader/org.gnome.feedreader.inoreader.gschema.xml10
-rw-r--r--plugins/backend/local/CMakeLists.txt94
-rw-r--r--plugins/backend/local/Rfc822.vala144
-rw-r--r--plugins/backend/local/SuggestedFeedRow.vala111
-rw-r--r--plugins/backend/local/TestLocalRSS.vala109
-rw-r--r--plugins/backend/local/libmrss/CMakeLists.txt14
-rw-r--r--plugins/backend/local/libmrss/meson.build16
-rw-r--r--plugins/backend/local/libmrss/mrss_parser.c28
-rw-r--r--plugins/backend/local/libnxml/CMakeLists.txt17
-rw-r--r--plugins/backend/local/libnxml/meson.build19
-rw-r--r--plugins/backend/local/libnxml/nxml.h502
-rw-r--r--plugins/backend/local/libnxml/nxml_download.c169
-rw-r--r--plugins/backend/local/libnxml/nxml_easy.c466
-rw-r--r--plugins/backend/local/libnxml/nxml_edit.c219
-rw-r--r--plugins/backend/local/libnxml/nxml_error.c56
-rw-r--r--plugins/backend/local/libnxml/nxml_free.c267
-rw-r--r--plugins/backend/local/libnxml/nxml_init.c482
-rw-r--r--plugins/backend/local/libnxml/nxml_internal.h79
-rw-r--r--plugins/backend/local/libnxml/nxml_namespace.c493
-rw-r--r--plugins/backend/local/libnxml/nxml_parser.c2125
-rw-r--r--plugins/backend/local/libnxml/nxml_string.c142
-rw-r--r--plugins/backend/local/libnxml/nxml_tools.c135
-rw-r--r--plugins/backend/local/libnxml/nxml_utf.c785
-rw-r--r--plugins/backend/local/libnxml/nxml_write.c580
-rw-r--r--plugins/backend/local/local.gresource.xml2
-rw-r--r--plugins/backend/local/local.plugin1
-rw-r--r--plugins/backend/local/localInterface.vala522
-rw-r--r--plugins/backend/local/localLoginWidget.vala248
-rw-r--r--plugins/backend/local/localUI.plugin8
-rw-r--r--plugins/backend/local/localUtils.vala172
-rw-r--r--plugins/backend/local/meson.build95
-rw-r--r--plugins/backend/local/recommendedFeeds.json205
-rw-r--r--plugins/backend/local/rss-glib/CMakeLists.txt19
-rw-r--r--plugins/backend/local/rss-glib/meson.build12
-rw-r--r--plugins/backend/meson.build22
-rw-r--r--plugins/backend/oldreader/CMakeLists.txt83
-rw-r--r--plugins/backend/oldreader/meson.build49
-rw-r--r--plugins/backend/oldreader/oldreader.plugin1
-rw-r--r--plugins/backend/oldreader/oldreaderAPI.vala159
-rw-r--r--plugins/backend/oldreader/oldreaderConnection.vala37
-rw-r--r--plugins/backend/oldreader/oldreaderInterface.vala197
-rw-r--r--plugins/backend/oldreader/oldreaderLoginWidget.vala148
-rw-r--r--plugins/backend/oldreader/oldreaderUtils.vala123
-rw-r--r--plugins/backend/owncloud/CMakeLists.txt83
-rw-r--r--plugins/backend/owncloud/OwncloudNewsAPI.vala795
-rw-r--r--plugins/backend/owncloud/OwncloudNewsInterface.vala244
-rw-r--r--plugins/backend/owncloud/OwncloudNewsLoginWidget.vala210
-rw-r--r--plugins/backend/owncloud/OwncloudNewsMessage.vala161
-rw-r--r--plugins/backend/owncloud/OwncloudNewsUtils.vala280
-rw-r--r--plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud-symbolic.svg70
-rw-r--r--plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud.svg69
-rw-r--r--plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud-symbolic.svg47
-rw-r--r--plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud.svg55
-rw-r--r--plugins/backend/owncloud/meson.build49
-rw-r--r--plugins/backend/owncloud/org.gnome.feedreader.owncloud.gschema.xml16
-rw-r--r--plugins/backend/owncloud/owncloud.gresource.xml4
-rw-r--r--plugins/backend/owncloud/owncloud.plugin5
-rw-r--r--plugins/backend/owncloud/owncloudUI.plugin8
-rw-r--r--plugins/backend/ttrss/CMakeLists.txt83
-rw-r--r--plugins/backend/ttrss/meson.build49
-rw-r--r--plugins/backend/ttrss/org.gnome.feedreader.ttrss.gschema.xml4
-rw-r--r--plugins/backend/ttrss/ttrss.plugin1
-rw-r--r--plugins/backend/ttrss/ttrssAPI.vala290
-rw-r--r--plugins/backend/ttrss/ttrssInterface.vala281
-rw-r--r--plugins/backend/ttrss/ttrssLoginWidget.vala211
-rw-r--r--plugins/backend/ttrss/ttrssMessage.vala56
-rw-r--r--plugins/backend/ttrss/ttrssUI.plugin8
-rw-r--r--plugins/backend/ttrss/ttrssUtils.vala216
-rw-r--r--plugins/meson.build2
-rw-r--r--plugins/share/Browser/Browser.vala36
-rw-r--r--plugins/share/Browser/CMakeLists.txt37
-rw-r--r--plugins/share/Browser/meson.build38
-rw-r--r--plugins/share/CMakeLists.txt44
-rw-r--r--plugins/share/Email/CMakeLists.txt38
-rw-r--r--plugins/share/Email/Email.vala36
-rw-r--r--plugins/share/Email/EmailForm.vala2
-rw-r--r--plugins/share/Email/meson.build39
-rw-r--r--plugins/share/Instapaper/CMakeLists.txt41
-rw-r--r--plugins/share/Instapaper/InstapaperAPI.vala368
-rw-r--r--plugins/share/Instapaper/InstapaperSetup.vala12
-rw-r--r--plugins/share/Instapaper/meson.build48
-rw-r--r--plugins/share/Instapaper/org.gnome.feedreader.share.instapaper.gschema.xml18
-rw-r--r--plugins/share/Pocket/CMakeLists.txt47
-rw-r--r--plugins/share/Pocket/PocketAPI.vala190
-rw-r--r--plugins/share/Pocket/meson.build49
-rw-r--r--plugins/share/Pocket/org.gnome.feedreader.share.pocket.gschema.xml18
-rw-r--r--plugins/share/Telegram/CMakeLists.txt40
-rw-r--r--plugins/share/Telegram/Telegram.vala30
-rw-r--r--plugins/share/Telegram/TelegramForm.vala2
-rw-r--r--plugins/share/Telegram/meson.build47
-rw-r--r--plugins/share/Telegram/org.gnome.feedreader.share.telegram.gschema.xml18
-rw-r--r--plugins/share/Twitter/CMakeLists.txt42
-rw-r--r--plugins/share/Twitter/TwitterAPI.vala198
-rw-r--r--plugins/share/Twitter/meson.build49
-rw-r--r--plugins/share/Twitter/org.gnome.feedreader.share.twitter.gschema.xml18
-rw-r--r--plugins/share/Wallabag/CMakeLists.txt41
-rw-r--r--plugins/share/Wallabag/WallabagAPI.vala242
-rw-r--r--plugins/share/Wallabag/WallabagSetup.vala12
-rw-r--r--plugins/share/Wallabag/meson.build48
-rw-r--r--plugins/share/Wallabag/org.gnome.feedreader.share.wallabag.gschema.xml18
-rw-r--r--plugins/share/meson.build20
-rw-r--r--po/CMakeLists.txt5
-rw-r--r--po/FeedReader.pot1003
-rw-r--r--po/LINGUAS72
-rw-r--r--po/POTFILES54
-rw-r--r--po/af.po998
-rw-r--r--po/am.po998
-rw-r--r--po/ar.po998
-rw-r--r--po/ast.po998
-rw-r--r--po/az.po998
-rw-r--r--po/be.po998
-rw-r--r--po/bg.po998
-rw-r--r--po/bn.po998
-rw-r--r--po/bs.po998
-rw-r--r--po/ca.po1202
-rw-r--r--po/ckb.po998
-rw-r--r--po/cs.po1309
-rw-r--r--po/da.po998
-rw-r--r--po/de.po1501
-rw-r--r--po/el.po998
-rw-r--r--po/en_AU.po998
-rw-r--r--po/en_CA.po998
-rw-r--r--po/en_GB.po1273
-rw-r--r--po/eo.po1128
-rw-r--r--po/es.po1469
-rw-r--r--po/et.po1052
-rw-r--r--po/eu.po998
-rw-r--r--po/fa.po998
-rw-r--r--po/fi.po1312
-rw-r--r--po/fr.po1508
-rw-r--r--po/fr_CA.po998
-rw-r--r--po/gl.po998
-rw-r--r--po/he.po998
-rw-r--r--po/hi.po998
-rw-r--r--po/hr.po998
-rw-r--r--po/hu.po998
-rw-r--r--po/hy.po998
-rw-r--r--po/id.po1253
-rw-r--r--po/it.po1370
-rw-r--r--po/ja.po1228
-rw-r--r--po/ka.po998
-rw-r--r--po/ko.po1405
-rw-r--r--po/ky.po998
-rw-r--r--po/lb.po998
-rw-r--r--po/lo.po998
-rw-r--r--po/lt.po1426
-rw-r--r--po/lv.po998
-rw-r--r--po/meson.build1
-rw-r--r--po/ml.po998
-rw-r--r--po/mr.po998
-rw-r--r--po/ms.po998
-rw-r--r--po/nb.po1493
-rw-r--r--po/nl.po1501
-rw-r--r--po/nn.po998
-rw-r--r--po/pl.po1393
-rw-r--r--po/pt.po1294
-rw-r--r--po/pt_BR.po1414
-rw-r--r--po/ro.po1401
-rw-r--r--po/ro_RO.po1401
-rw-r--r--po/ru.po1459
-rw-r--r--po/rue.po998
-rw-r--r--po/si.po998
-rw-r--r--po/sk.po998
-rw-r--r--po/sl.po998
-rw-r--r--po/sma.po998
-rw-r--r--po/sq.po1213
-rw-r--r--po/sr.po998
-rw-r--r--po/sv.po1407
-rw-r--r--po/sw.po998
-rw-r--r--po/ta.po998
-rw-r--r--po/te.po998
-rw-r--r--po/th.po998
-rw-r--r--po/tr.po1425
-rw-r--r--po/uk.po1419
-rw-r--r--po/vi.po998
-rw-r--r--po/zh_CN.po1418
-rw-r--r--po/zh_HK.po998
-rw-r--r--po/zh_TW.po1008
-rw-r--r--schemas/CMakeLists.txt6
-rw-r--r--schemas/meson.build9
-rw-r--r--schemas/org.gnome.feedreader.gschema.xml49
-rw-r--r--schemas/org.gnome.feedreader.keybindings.gschema.xml28
-rw-r--r--schemas/org.gnome.feedreader.saved-state.gschema.xml316
-rw-r--r--schemas/org.gnome.feedreader.share.gschema.xml90
-rw-r--r--schemas/org.gnome.feedreader.tweaks.gschema.xml23
-rw-r--r--scripts/install_ubuntu.sh13
-rw-r--r--src/ActionCache.vala330
-rw-r--r--src/Backend/Backend.vala787
-rw-r--r--src/Backend/FeedServer.vala641
-rw-r--r--src/Backend/FeedServerInterface.vala48
-rw-r--r--src/Backend/OPMLparser.vala19
-rw-r--r--src/CachedActionManager.vala14
-rw-r--r--src/Constants.vala93
-rw-r--r--src/ContentGrabber/grabber.vala1084
-rw-r--r--src/ContentGrabber/grabberConfig.vala598
-rw-r--r--src/ContentGrabber/grabberUtils.vala1387
-rw-r--r--src/ContentGrabber/stringPair.vala30
-rw-r--r--src/DBusConnection.vala233
-rw-r--r--src/Daemon.vala941
-rw-r--r--src/DataBaseReadOnly.vala1054
-rw-r--r--src/DataBaseWriteAccess.vala799
-rw-r--r--src/Enums.vala94
-rw-r--r--src/FavIcon.vala382
-rw-r--r--src/FavIconCache.vala115
-rw-r--r--src/FeedReader.vala245
-rw-r--r--src/FeedReaderMain.vala122
-rw-r--r--src/FuncUtils.vala28
-rw-r--r--src/ListUtils.vala23
-rw-r--r--src/Logger.vala181
-rw-r--r--src/LoginInterface.vala46
-rw-r--r--src/Model/Article.vala207
-rw-r--r--src/Model/Category.vala9
-rw-r--r--src/Model/Enclosure.vala38
-rw-r--r--src/Model/Feed.vala78
-rw-r--r--src/Model/InterfaceState.vala377
-rw-r--r--src/Model/Tag.vala14
-rw-r--r--src/Notification.vala90
-rw-r--r--src/Password.vala110
-rw-r--r--src/QueryBuilder.vala664
-rw-r--r--src/SQLite.vala142
-rw-r--r--src/Share/ServiceSetup.vala14
-rw-r--r--src/Share/ShareAccountInterface.vala2
-rw-r--r--src/Share/share.vala8
-rw-r--r--src/StringUtils.vala49
-rw-r--r--src/Structs.vala147
-rw-r--r--src/Utils.vala720
-rw-r--r--src/UtilsDaemon.vala130
-rw-r--r--src/UtilsUI.vala452
-rw-r--r--src/Widgets/AddPopover.vala24
-rw-r--r--src/Widgets/ArticleList/ArticleList.vala196
-rw-r--r--src/Widgets/ArticleList/ArticleListBox.vala324
-rw-r--r--src/Widgets/ArticleList/ArticleListEmptyLabel.vala11
-rw-r--r--src/Widgets/ArticleList/ArticleListScroll.vala54
-rw-r--r--src/Widgets/ArticleRow.vala225
-rw-r--r--src/Widgets/ArticleView.vala181
-rw-r--r--src/Widgets/ArticleViewHeader.vala145
-rw-r--r--src/Widgets/ArticleViewLoadProgress.vala93
-rw-r--r--src/Widgets/ArticleViewUrlOverlay.vala60
-rw-r--r--src/Widgets/BackendInfoPopover.vala29
-rw-r--r--src/Widgets/CategorieRow.vala238
-rw-r--r--src/Widgets/ColumnView.vala102
-rw-r--r--src/Widgets/ColumnViewHeader.vala49
-rw-r--r--src/Widgets/FeedList.vala332
-rw-r--r--src/Widgets/FeedListFooter.vala49
-rw-r--r--src/Widgets/FeedRow.vala269
-rw-r--r--src/Widgets/FullscreenHeader.vala8
-rw-r--r--src/Widgets/HoverButton.vala174
-rw-r--r--src/Widgets/ImagePopup.vala20
-rw-r--r--src/Widgets/InfoBar.vala44
-rw-r--r--src/Widgets/LoginPage.vala181
-rw-r--r--src/Widgets/LoginRow.vala23
-rw-r--r--src/Widgets/MainWindow.vala141
-rw-r--r--src/Widgets/MediaButton.vala131
-rw-r--r--src/Widgets/MediaPlayer.vala18
-rw-r--r--src/Widgets/MediaPopover.vala70
-rw-r--r--src/Widgets/MediaRow.vala52
-rw-r--r--src/Widgets/ModeButton.vala496
-rw-r--r--src/Widgets/RemovePopover.vala34
-rw-r--r--src/Widgets/ResetPage.vala36
-rw-r--r--src/Widgets/ServiceInfo.vala139
-rw-r--r--src/Widgets/ServiceSettingsPopover.vala56
-rw-r--r--src/Widgets/Setting.vala65
-rw-r--r--src/Widgets/SettingsDialog.vala500
-rw-r--r--src/Widgets/SharePopover.vala85
-rw-r--r--src/Widgets/ShareRow.vala42
-rw-r--r--src/Widgets/ShortcutsWindow.vala4
-rw-r--r--src/Widgets/TagPopover.vala82
-rw-r--r--src/Widgets/TagPopoverRow.vala110
-rw-r--r--src/Widgets/TagRow.vala172
-rw-r--r--src/Widgets/UpdateButton.vala57
-rw-r--r--src/Widgets/WebLoginPage.vala13
-rw-r--r--src/dbBase.vala1555
-rw-r--r--src/dbDaemon.vala1025
-rw-r--r--src/dbUI.vala70
-rwxr-xr-xupdate_pot.sh54
-rw-r--r--vapi/gtkimageview.vapi36
-rw-r--r--vapi/libvilistextum.vapi4
-rw-r--r--vapi/sqlite3.vapi460
1583 files changed, 64968 insertions, 80657 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..cd5a6f3d
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+root = true
+
+[*]
+indent_style = tab
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.yml]
+indent_style = space
+indent_size = 2
diff --git a/.gitignore b/.gitignore
index 921875a0..92dd251b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
build/
+builddir/
feedreader.service
feedreader.desktop
feedreader-autostart.desktop
@@ -8,4 +9,4 @@ data/org.gnome.FeedReader-autostart.desktop
data/org.gnome.FeedReader.desktop
data/org.gnome.FeedReader.Daemon.service
data/org.gnome.FeedReader.appdata.xml
-*.po~
+*.po~ \ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..f6797cdd
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "data/GrabberConfig"]
+ path = data/GrabberConfig
+ url = https://github.com/fivefilters/ftr-site-config
+ branch = master
diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index 9c59cfbe..00000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,301 +0,0 @@
-project (FeedReader)
-cmake_minimum_required (VERSION 2.6)
-list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
-include_directories(${CMAKE_SOURCE_DIR}/libVilistextum)
-include_directories(${CMAKE_SOURCE_DIR}/libgtkimageview)
-include_directories(${CMAKE_SOURCE_DIR})
-
-add_definitions("-w")
-
-include(GNUInstallDirs)
-set (DATADIR "${CMAKE_INSTALL_PREFIX}/share")
-set (PKGDATADIR "${DATADIR}/FeedReader")
-set (PKGLIBDIR "${CMAKE_INSTALL_LIBDIR}/FeedReader")
-set (GETTEXT_PACKAGE ${CMAKE_PROJECT_NAME})
-set (UI_NAME "feedreader")
-set (DAEMON_NAME ${UI_NAME}-daemon)
-set (WEBEXTENSION_NAME webextension)
-set (RELEASE_NAME "FeedReader")
-set (VERSION "2.0.2")
-set (GLIB_VERSION 2.40)
-
-find_package(PkgConfig)
-find_package(Vala REQUIRED)
-include(ValaVersion)
-include(ValaPrecompile)
-include(GResource)
-ensure_vala_version("0.30" MINIMUM)
-
-pkg_check_modules(LIBUNITY QUIET unity)
-
-add_definitions (-DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\")
-add_subdirectory (po)
-add_subdirectory (schemas)
-add_subdirectory (libVilistextum)
-
-include(GetGitRevisionDescription)
-get_git_head_revision(GIT_REFSPEC GIT_SHA1)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Constants.vala.in" "${CMAKE_SOURCE_DIR}/Constants.vala" @ONLY)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader.Daemon.service.in" "${CMAKE_SOURCE_DIR}/data/org.gnome.FeedReader.Daemon.service" @ONLY)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader.appdata.xml.in" "${CMAKE_SOURCE_DIR}/data/org.gnome.FeedReader.appdata.xml" @ONLY)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader.desktop.in" "${CMAKE_SOURCE_DIR}/data/org.gnome.FeedReader.desktop" @ONLY)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader-autostart.desktop.in" "${CMAKE_SOURCE_DIR}/data/org.gnome.FeedReader-autostart.desktop" @ONLY)
-
-set(MODULES
- gtk+-3.0>=3.22
- json-glib-1.0
- gee-0.8
- libsoup-2.4
- sqlite3
- libsecret-1
- libnotify
- libxml-2.0
- rest-0.7
- webkit2gtk-4.0
- gstreamer-1.0
- gstreamer-pbutils-1.0
- libpeas-1.0
- libcurl
- goa-1.0)
-
-if(LIBUNITY_FOUND)
- list(APPEND MODULES unity)
- message(STATUS "libunity: ON")
-endif(LIBUNITY_FOUND)
-
-pkg_check_modules(DEPS REQUIRED ${MODULES})
-
-add_definitions(${DEPS_CFLAGS} -DGOA_API_IS_SUBJECT_TO_CHANGE)
-link_libraries(${DEPS_LIBRARIES} -lm)
-link_directories(${DEPS_LIBRARY_DIRS})
-
-add_subdirectory(WebExtension)
-add_subdirectory(libgtkimageview)
-add_subdirectory(libgd)
-
-
-################################################################################
-
-
-vala_precompile(LIBFR libFeedReader
- src/Logger.vala
- src/Enums.vala
- src/dbBase.vala
- src/Settings.vala
- src/Utils.vala
- src/QueryBuilder.vala
- src/ContentGrabber/stringPair.vala
- src/Model/Feed.vala
- src/Model/Category.vala
- src/Model/Article.vala
- src/Model/Tag.vala
- src/Model/CachedAction.vala
- src/Model/InterfaceState.vala
- src/Model/ShareAccount.vala
- Constants.vala
-
-PACKAGES
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
-
-OPTIONS
- --target-glib=${GLIB_VERSION}
- --vapi=FeedReaderCommon.vapi
- --header=FeedReaderCommon.h
-
-CUSTOM_VAPIS
- vapi/libvilistextum.vapi
-)
-
-add_library(FeedReaderCommon STATIC ${LIBFR})
-target_link_libraries(FeedReaderCommon vilistextum)
-
-
-################################################################################
-
-set(UI_PACKAGES
- glib-2.0>=2.32
- gtk+-3.0
- json-glib-1.0
- libsoup-2.4
- sqlite3
- gee-0.8
- libsecret-1
- libnotify
- rest-0.7
- WebKit2-4.0
- gstreamer-1.0
- gstreamer-pbutils-1.0
- libpeas-1.0
- goa-1.0)
-
-vala_precompile(UI ${UI_NAME}
- src/DBusConnection.vala
- src/FavIconCache.vala
- src/FeedReader.vala
- src/LoginInterface.vala
- src/dbUI.vala
- src/UtilsUI.vala
- src/Widgets/AddPopover.vala
- src/Widgets/ArticleRow.vala
- src/Widgets/ArticleView.vala
- src/Widgets/ArticleViewHeader.vala
- src/Widgets/ArticleViewLoadProgress.vala
- src/Widgets/ArticleViewUrlOverlay.vala
- src/Widgets/BackendInfoPopover.vala
- src/Widgets/CategorieRow.vala
- src/Widgets/ColorCircle.vala
- src/Widgets/ColorPopover.vala
- src/Widgets/ColumnView.vala
- src/Widgets/ColumnViewHeader.vala
- src/Widgets/FeedList.vala
- src/Widgets/FeedListFooter.vala
- src/Widgets/FeedRow.vala
- src/Widgets/FullscreenButton.vala
- src/Widgets/FullscreenHeader.vala
- src/Widgets/HoverButton.vala
- src/Widgets/ImagePopup.vala
- src/Widgets/InAppNotification.vala
- src/Widgets/InfoBar.vala
- src/Widgets/LoginPage.vala
- src/Widgets/LoginRow.vala
- src/Widgets/MainWindow.vala
- src/Widgets/MediaPlayer.vala
- src/Widgets/MediaPopover.vala
- src/Widgets/MediaRow.vala
- src/Widgets/ModeButton.vala
- src/Widgets/RemovePopover.vala
- src/Widgets/ResetPage.vala
- src/Widgets/ServiceSettingsPopover.vala
- src/Widgets/ShareRow.vala
- src/Widgets/ShortcutsWindow.vala
- src/Widgets/ServiceInfo.vala
- src/Widgets/Setting.vala
- src/Widgets/SettingsDialog.vala
- src/Widgets/SharePopover.vala
- src/Widgets/SimpleHeader.vala
- src/Widgets/SpringCleanPage.vala
- src/Widgets/TagRow.vala
- src/Widgets/TagPopover.vala
- src/Widgets/TagPopoverRow.vala
- src/Widgets/UpdateButton.vala
- src/Widgets/WebLoginPage.vala
- src/Widgets/ArticleList/ArticleList.vala
- src/Widgets/ArticleList/ArticleListBox.vala
- src/Widgets/ArticleList/ArticleListEmptyLabel.vala
- src/Widgets/ArticleList/ArticleListScroll.vala
- src/Share/share.vala
- src/Share/ServiceSetup.vala
- src/Share/ShareAccountInterface.vala
-
-PACKAGES
- ${UI_PACKAGES}
-
-OPTIONS
- --target-glib=${GLIB_VERSION}
- --header=FeedReaderUI.h
- --vapi=FeedReaderUI.vapi
- --enable-experimental
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- vapi/libvilistextum.vapi
- vapi/gtkimageview.vapi
- vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE data/org.gnome.FeedReader.gresource.xml)
-
-add_executable(${UI_NAME} ${UI} ${GRESOURCES})
-target_link_libraries(${UI_NAME} vilistextum gtkimageview gd FeedReaderCommon)
-
-
-################################################################################
-
-
-set(DAEMON_OPTIONS
- --target-glib=${GLIB_VERSION}
- --header=FeedReader.h
- --vapi=FeedReader.vapi)
-set(DAEMON_PACKAGES
- glib-2.0>=2.32
- gio-2.0
- sqlite3
- gee-0.8
- libsoup-2.4
- json-glib-1.0
- libnotify
- libsecret-1
- libxml-2.0
- rest-0.7
- libpeas-1.0)
-
-if(LIBUNITY_FOUND)
- list(APPEND DAEMON_OPTIONS --define WITH_LIBUNITY)
- list(APPEND DAEMON_PACKAGES unity)
-endif(LIBUNITY_FOUND)
-
-vala_precompile(daemon ${DAEMON_NAME}
- src/ActionCache.vala
- src/Daemon.vala
- src/dbDaemon.vala
- src/UtilsDaemon.vala
- src/Notification.vala
- src/CachedActionManager.vala
- src/Backend/FeedServer.vala
- src/Backend/FeedServerInterface.vala
- src/Backend/OPMLparser.vala
- src/ContentGrabber/grabberConfig.vala
- src/ContentGrabber/grabber.vala
- src/ContentGrabber/grabberUtils.vala
-
-
-PACKAGES
- ${DAEMON_PACKAGES}
-
-OPTIONS
- ${DAEMON_OPTIONS}
-
-CUSTOM_VAPIS
- vapi/libvilistextum.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_executable(${DAEMON_NAME} ${daemon})
-target_link_libraries(${DAEMON_NAME} vilistextum FeedReaderCommon)
-
-
-################################################################################
-
-
-add_dependencies(${DAEMON_NAME} FeedReaderCommon)
-add_dependencies(${UI_NAME} FeedReaderCommon)
-
-
-# build plugins
-add_subdirectory(plugins)
-
-
-################################################################################
-
-
-# uninstall target
-configure_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/uninstall.cmake"
- "${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake"
- IMMEDIATE @ONLY)
-
-add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake)
-
-install (TARGETS ${UI_NAME} RUNTIME DESTINATION bin)
-install (TARGETS ${DAEMON_NAME} RUNTIME DESTINATION bin)
-install (FILES ${PROJECT_BINARY_DIR}/WebExtension/libwebextension.so DESTINATION ${PKGLIBDIR})
-install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader.desktop DESTINATION ${DATADIR}/applications/)
-install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader-autostart.desktop DESTINATION ${PKGDATADIR})
-install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader.appdata.xml DESTINATION ${DATADIR}/appdata/)
-install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/org.gnome.FeedReader.Daemon.service DESTINATION ${DATADIR}/dbus-1/services/)
-install (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/application-icons/hicolor DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons)
-install (CODE "execute_process (COMMAND gtk-update-icon-cache -t ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor)")
-install (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/GrabberConfig DESTINATION ${PKGDATADIR})
diff --git a/COPYING b/COPYING
deleted file mode 100644
index 10926e87..00000000
--- a/COPYING
+++ /dev/null
@@ -1,675 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-
diff --git a/Constants.vala.in b/Constants.vala.in
index 94cf7679..ec9fc376 100644
--- a/Constants.vala.in
+++ b/Constants.vala.in
@@ -21,7 +21,7 @@ namespace FeedReader {
public class AboutInfo : GLib.Object {
public const string programmName = "FeedReader";
- public const string copyright = "Copyright © 2016 Jan Lukas Gernert";
+ public const string copyright = "Copyright © 2014-2017 Jan Lukas Gernert";
public const string version = "@VERSION@";
public const string comments = N_("Desktop Client for various RSS Services");
public const string[] authors = { "Jan Lukas Gernert", "Bilal Elmoussaoui", "Anwesh Reddy" , "Jason Scurtu", null };
@@ -43,20 +43,22 @@ namespace FeedReader {
}
public class MediaButton : GLib.Object {
- public const string PLAY = N_("Play");
- public const string PAUSE = N_("Pause");
- public const string MUTE = N_("Mute");
- public const string UNMUTE = N_("Unmute");
- public const string CLOSE = N_("Close");
+ public const string PLAY = "Play";
+ public const string PAUSE = "Pause";
+ public const string MUTE = "Mute";
+ public const string UNMUTE = "Unmute";
+ public const string CLOSE = "Close";
}
public class Constants : GLib.Object {
- public const string INSTALL_PREFIX = "@CMAKE_INSTALL_PREFIX@";
- public const string INSTALL_LIBDIR = "@PKGLIBDIR@";
- public const string GIT_SHA1 = "@GIT_SHA1@";
+ public const string INSTALL_PREFIX = "@PREFIX@";
+ public const string INSTALL_LIBDIR = "@PKGLIBDIR@";
+ public const string LOCALE_DIR = "@LOCALE_DIR@";
+ public const string GIT_SHA1 = "#GIT_SHA1#";
public const string USER_AGENT = "FeedReader @VERSION@";
- public const int DBusAPIVersion = 17;
+ public const int DB_SCHEMA_VERSION = 7;
+ public const int REDOWNLOAD_FAVICONS_AFTER_DAYS = 7;
// tango colors
public const string[] COLORS = {
diff --git a/INSTALL.md b/INSTALL.md
index 81781ae2..f91fedae 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,28 +1,29 @@
## Dependencies (package names may differ depending on distribution)
-- build-essential
-- cmake
-- vala (>=0.26)
-- pkg-config
-- libgirepository1.0-dev
-- libgtk-3-dev (>= 3.20)
-- libsoup2.4-dev
-- libjson-glib-dev
-- libwebkit2gtk-4.0-dev
-- libsqlite3-dev
-- libsecret-1-dev
-- libnotify-dev
-- libxml2-dev
-- libunity-dev (optional)
-- librest-dev
-- libgee-0.8-dev
-- libgstreamer1.0-dev
-- libgstreamer-plugins-base1.0-dev (gstreamer-pbutils-1.0)
-- libgoa-1.0-dev (>= 3.20)
-- libcurl-dev
-- libpeas-dev
+- `build-essential`
+- `meson`
+- `ninja-build`
+- `vala (>=0.38)`
+- `pkg-config`
+- `libgirepository1.0-dev`
+- `libgtk-3-dev (>= 3.22)`
+- `libsoup2.4-dev`
+- `libjson-glib-dev`
+- `libwebkit2gtk-4.0-dev (>=2.18)`
+- `libsqlite3-dev`
+- `libsecret-1-dev`
+- `libnotify-dev`
+- `libxml2-dev`
+- `libunity-dev (optional)`
+- `librest-dev`
+- `libgee-0.8-dev`
+- `libgstreamer1.0-dev`
+- `libgstreamer-plugins-base1.0-dev (gstreamer-pbutils-1.0)`
+- `libgoa-1.0-dev (>= 3.20)`
+- `libcurl-dev`
+- `libpeas-dev`
-## Fedora dependencies install
+## Fedora dependencies install
```
dnf install gtk3-devel gtk2-devel vala make automake gcc gcc-c++ cmake json-glib-devel libsoup-devel sqlite-devel libgee-devel libsecret-devel libxml-devel rest-devel gstreamer1-devel gstreamer1-plugins-base-devel libpeas-devel webkitgtk4-devel gnome-online-accounts-devel libcurl-devel
```
@@ -30,11 +31,8 @@ dnf install gtk3-devel gtk2-devel vala make automake gcc gcc-c++ cmake json-glib
## Compiling
```
-git clone https://github.com/jangernert/FeedReader
+git clone --recursive https://github.com/jangernert/FeedReader
cd ./FeedReader
-mkdir build
-cd build
-cmake ..
-make
-sudo make install
+meson builddir --prefix=/usr
+sudo ninja -C builddir install
```
diff --git a/README.md b/README.md
index e8bd38fe..1f8c88df 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[![Bountysource](https://img.shields.io/bountysource/team/jangernert-feedreader/activity.svg)](https://www.bountysource.com/teams/jangernert-feedreader/issues)
+[![Translation status](https://hosted.weblate.org/widgets/feedreader/-/svg-badge.svg)](https://hosted.weblate.org/engage/feedreader/?utm_source=widget) [![CircleCI](https://circleci.com/gh/jangernert/FeedReader.svg?style=shield)](https://circleci.com/gh/jangernert/FeedReader) [![Bountysource](https://img.shields.io/bountysource/team/jangernert-feedreader/activity.svg)](https://www.bountysource.com/teams/jangernert-feedreader/issues) [![Join the chat at https://gitter.im/Feedreader-dev/Lobby](https://badges.gitter.im/Feedreader-dev/Lobby.svg)](https://gitter.im/Feedreader-dev/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
# [FeedReader](http://jangernert.github.io/FeedReader/)
@@ -9,47 +9,62 @@ FeedReader is a modern desktop application designed to complement existing web-b
<div style="text-align:center"><img src ="https://raw.githubusercontent.com/jangernert/feedreader/gh-pages/images/gallery/Screenshot4.png" /></div>
Website : http://jangernert.github.io/FeedReader/<br/>
-For translators : https://www.transifex.com/dev-feedreader/feedreader
-
-
-
-### Dependencies
-- build-essential
-- cmake
-- vala (>=0.26)
-- pkg-config
-- libgirepository1.0-dev
-- libgtk-3-dev (>= 3.22)
-- libsoup2.4-dev
-- libjson-glib-dev
-- libwebkit2gtk-4.0-dev
-- libsqlite3-dev
-- libsecret-1-dev
-- libnotify-dev
-- libxml2-dev
-- libunity-dev (optional)
-- librest-dev
-- libgee-0.8-dev
-- libgstreamer1.0-dev
-- libgstreamer-plugins-base1.0-dev (gstreamer-pbutils-1.0)
-- libgoa-1.0-dev (>= 3.20)
-- libcurl-dev
-- libpeas-dev
-
-
-### How to install
- - Arch : <br/>
- <pre>
- yaourt -S feedreader
- </pre>
- - Fedora : <br/>
- <pre>
- sudo dnf install feedreader
- </per>
- - Solus OS : <br/>
- <pre>
- sudo eopkg install feedreader
- </pre>
+For translators : https://hosted.weblate.org/projects/feedreader/
+
+
+
+## Dependencies
+- `build-essential`
+- `meson`
+- `ninja-build`
+- `vala (>=0.38)`
+- `pkg-config`
+- `libgirepository1.0-dev`
+- `libgtk-3-dev (>= 3.22)`
+- `libsoup2.4-dev`
+- `libjson-glib-dev`
+- `libwebkit2gtk-4.0-dev (>=2.18)`
+- `libsqlite3-dev`
+- `libsecret-1-dev`
+- `libnotify-dev`
+- `libxml2-dev`
+- `libunity-dev (optional)`
+- `librest-dev`
+- `libgee-0.8-dev`
+- `libgstreamer1.0-dev`
+- `libgstreamer-plugins-base1.0-dev (gstreamer-pbutils-1.0)`
+- `libgoa-1.0-dev (>= 3.20)`
+- `libcurl-dev`
+- `libpeas-dev`
+
+
+## How to install
+### Arch Linux : <br/>
+```bash
+yaourt -S feedreader
+```
+### Fedora : <br/>
+```bash
+sudo dnf install feedreader
+```
+### Solus OS : <br/>
+```bash
+sudo eopkg install feedreader
+```
+
+### openSUSE : <br/>
+```bash
+sudo zypper install feedreader
+```
+
+### Ubuntu : <br/>
+
+The easiest way to install the latest FeedReader right now is to build from source,
+which you can do with this script:
+
+```bash
+curl https://raw.githubusercontent.com/jangernert/FeedReader/master/scripts/install_ubuntu.sh | bash
+```
### Flatpak
@@ -57,13 +72,12 @@ FeedReader is now availble as Flatpak and should be installable on all major Lin
For more information about Flatpak and how to use or install it for your distribution see the [Flatpak webpage](http://flatpak.org).
-Besides installing the Flatpak Framework, you should also install the following portal packages using your distributions paket manager:
-(names can differ depending on the distribution)
-<pre>xdg-desktop-portal</pre>
-<pre>xdg-desktop-portal-gtk</pre>
+Besides installing the Flatpak Framework, you should also install the following portal packages using your distributions package manager:
+- `xdg-desktop-portal`
+- `xdg-desktop-portal-gtk`
-####Install FeedReader Flatpak via repository, this enables OTA updates and is the recommended way:
-Defaults to the stable branch.
+#### Via repository
+This enables OTA updates and is the recommended way. Defaults to the stable branch.
<pre>
flatpak install http://feedreader.xarbit.net/feedreader-repo/feedreader.flatpakref
</pre>
@@ -71,15 +85,11 @@ flatpak install http://feedreader.xarbit.net/feedreader-repo/feedreader.flatpakr
You can also create your own Flatpak bundle running `make bundle` command in the `flatpak/` sub-directory.
-### How to build the latest version
+### Manual installation
```
-git clone https://github.com/jangernert/FeedReader
+git clone --recursive https://github.com/jangernert/FeedReader
cd ./FeedReader
-mkdir build
-cd ./build
-cmake ..
-make
-sudo make install
+meson builddir --prefix=/usr
+sudo ninja -C builddir install
```
-Arch users can build the latest version using `yaourt -S feedreader-git`
-
+Arch Linux users can build the latest version using `yaourt -S feedreader-git`
diff --git a/WebExtension/CMakeLists.txt b/WebExtension/CMakeLists.txt
deleted file mode 100644
index 81d8e5f8..00000000
--- a/WebExtension/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-vala_precompile(webext webextension
- webextension.vala
-
-PACKAGES
- libsoup-2.4
- gtk+-3.0
- webkit2gtk-web-extension-4.0
-
-OPTIONS
- --vapidir=${CMAKE_SOURCE_DIR}/vapi/
-)
-
-add_library(webextension SHARED ${webext})
diff --git a/WebExtension/webextension.vala b/WebExtension/webextension.vala
deleted file mode 100644
index 3d7c9142..00000000
--- a/WebExtension/webextension.vala
+++ /dev/null
@@ -1,179 +0,0 @@
-[DBus (name = "org.gnome.FeedReader.ArticleView")]
-public class FeedReaderWebExtension : Object {
-
- private WebKit.DOM.Document m_doc;
- public signal void onClick(string path, int width, int height, string url);
- public signal void message(string message);
-
- [DBus (visible = false)]
- public void on_bus_aquired(DBusConnection connection)
- {
- try
- {
- connection.register_object("/org/gnome/FeedReader/ArticleView", this);
- }
- catch(GLib.IOError e)
- {
- warning("Could not register object");
- }
- }
-
- [DBus (visible = false)]
- public void on_page_created(WebKit.WebExtension extension, WebKit.WebPage page)
- {
- page.document_loaded.connect(() => {
- onDocLoaded(page);
- });
- message("on_page_created");
- }
-
- private void onDocLoaded(WebKit.WebPage page)
- {
- m_doc = page.get_dom_document();
- message("onDocLoaded");
- }
-
- public void recalculate()
- {
- message("recalculate");
- var images = m_doc.get_images();
- ulong count = images.get_length();
-
- for(ulong i = 0; i < count; i++)
- {
- var image = (WebKit.DOM.HTMLImageElement)images.item(i);
-
- // if image was so huge it had to be replaced with a downscaled version
- if(image.has_attribute("FR_huge"))
- {
- addListener(image);
- continue;
- }
- else if(image.has_attribute("FR_parent"))
- {
- addListener(image);
- continue;
- }
-
- long nHeight = image.get_natural_height();
- long nWidth = image.get_natural_width();
- long height = image.get_height();
- long width = image.get_width();
-
- if(nHeight > 250 || nWidth > 250)
- {
- double hRatio = (double)height / (double)nHeight;
- double wRatio = (double)width / (double)nWidth;
- double threshold = 0.8;
-
- if(hRatio <= threshold
- || wRatio <= threshold)
- addListener(image);
- else
- removeListener(image);
- }
- }
- }
-
- [DBus (visible = false)]
- private void addListener(WebKit.DOM.HTMLImageElement image)
- {
- ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("mouseover", on_enter, false);
- ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("mousemove", on_enter, false);
- ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("mouseout", on_leave, false);
- ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("click", on_click, false);
- }
-
- [DBus (visible = false)]
- private void removeListener(WebKit.DOM.HTMLImageElement image)
- {
- ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("mouseover", on_enter, false);
- ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("mousemove", on_enter, false);
- ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("mouseout", on_leave, false);
- ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("click", on_click, false);
-
- try
- {
- image.set_attribute("class", "");
- }
- catch(GLib.Error e)
- {
- stderr.printf("WebExtension.recalculate: %s", e.message);
- }
- }
-
- [DBus (visible = false)]
- private void on_enter(WebKit.DOM.EventTarget target, WebKit.DOM.Event event)
- {
- try
- {
- var image = (WebKit.DOM.HTMLImageElement)target;
- image.set_attribute("class", "clickable-img-hover");
- }
- catch(GLib.Error e)
- {
-
- }
- }
-
- [DBus (visible = false)]
- private void on_leave(WebKit.DOM.EventTarget target, WebKit.DOM.Event event)
- {
- try
- {
- var image = (WebKit.DOM.HTMLImageElement)target;
- image.set_attribute("class", "");
- }
- catch(GLib.Error e)
- {
-
- }
- }
-
- [DBus (visible = false)]
- public void on_click(WebKit.DOM.EventTarget target, WebKit.DOM.Event event)
- {
- event.prevent_default();
- var image = (WebKit.DOM.HTMLImageElement)target;
-
- string url = "";
- var parent = image.get_parent_element();
- if(parent.tag_name == "A")
- url = parent.get_attribute("href");
-
-
- int height = (int)image.natural_height;
- int width = (int)image.natural_width;
- string src = image.src;
- if(src.has_prefix("file://"))
- src = src.substring("file://".length);
-
- if(image.has_attribute("FR_huge"))
- {
- src = image.get_attribute("FR_huge");
- Gdk.Pixbuf.get_file_info(src, out width, out height);
- }
- else if(image.has_attribute("FR_parent"))
- {
- src = image.get_attribute("FR_parent");
- Gdk.Pixbuf.get_file_info(src, out width, out height);
- }
-
- onClick(src, width, height, url);
- }
-}
-
-[DBus (name = "org.gnome.FeedReader.ArticleView")]
-public errordomain FeedReaderWebExtensionError
-{
- ERROR
-}
-
-[CCode (cname = "G_MODULE_EXPORT webkit_web_extension_initialize", instance_pos = -1)]
-void webkit_web_extension_initialize(WebKit.WebExtension extension)
-{
- var server = new FeedReaderWebExtension();
- extension.page_created.connect(server.on_page_created);
- Bus.own_name(BusType.SESSION, "org.gnome.FeedReader.ArticleView", BusNameOwnerFlags.NONE,
- server.on_bus_aquired, null, () => { warning("Could not aquire name"); });
-}
diff --git a/circle.yml b/circle.yml
new file mode 100644
index 00000000..c92c3a4f
--- /dev/null
+++ b/circle.yml
@@ -0,0 +1,60 @@
+version: 2
+jobs:
+ build:
+ docker:
+ # See docker/Dockerfile
+ - image: feedreader/fedora-feedreader-devel
+ environment:
+ ELASTICSEARCH_URL: http://127.0.0.1:9200
+ # Note: The Feedbin API has to run on subdomain "api"
+ FEEDBIN_TEST_HOST: http://api.x.localhost:9292
+ POSTGRES_USERNAME: postgres
+ POSTGRES_HOST: 127.0.0.1
+ DATABASE_URL: postgres://postgres@127.0.0.1:5432/feedbin_db
+ REDIS_URL: redis://127.0.0.1:6379
+ # Feedbin uses an ancient version of ElasticSearch
+ # https://github.com/feedbin/feedbin/blob/master/.travis.yml
+ - image: elasticsearch:2.3.3
+ environment:
+ 'discovery.type': single-node
+ - image: postgres:9.6.5-alpine
+ - image: redis:3.2.11-alpine
+
+ working_directory: ~/FeedReader
+ steps:
+ - run:
+ name: Setup Feedbin
+ # Wait a few seconds for postgres to startup
+ command: sleep 5 && cd /feedbin && rake db:setup
+ - run:
+ name: Run Feedbin background processes
+ command: cd /feedbin && bundle exec foreman start
+ background: true
+ - run:
+ name: Run Feedbin
+ command: cd /feedbin && rackup
+ background: true
+ - checkout
+ - run:
+ name: Configure
+ command: meson builddir -DBAZQUX=ON -DFEEDHQ=ON
+ - run:
+ name: Build
+ command: cd builddir && ninja -j4
+ - run:
+ name: Test
+ command: cd builddir && ninja test
+ - run:
+ name: Generate JUnit XML
+ command: |
+ mkdir -p /tmp/test-results/junit/
+ cd builddir
+ for f in *.gtester.log; do
+ xsltproc -o /tmp/test-results/junit/$(basename $f .gtester.log).xml ../gtester-to-junit-4.xsl $f;
+ done
+ when: always
+ - store_test_results:
+ path: /tmp/test-results
+ - store_artifacts:
+ path: /tmp/test-results/junit
+ destination: test-results
diff --git a/cmake/FindCurl.cmake b/cmake/FindCurl.cmake
deleted file mode 100644
index 6773ff92..00000000
--- a/cmake/FindCurl.cmake
+++ /dev/null
@@ -1,29 +0,0 @@
-# - Try to find the libesmtp library
-# Once done this will define
-#
-# CURL_FOUND - system has the libesmtp library
-# CURL_CONFIG
-# CURL_INCLUDE_DIR - the libesmtp include directory
-# CURL_LIBRARIES - The libraries needed to use libesmtp
-#
-# Based on FindESMTP.cmake
-# Distributed under the BSD license.
-
-if (CURL_LIBRARIES)
- # Already in cache, be silent
- set(CURL_FIND_QUIETLY TRUE)
-endif (CURL_LIBRARIES)
-
-FIND_PROGRAM(CURL_CONFIG curl-config)
-
-IF (CURL_CONFIG)
- EXEC_PROGRAM(${CURL_CONFIG} ARGS --libs OUTPUT_VARIABLE _CURL_LIBRARIES)
- string(REGEX REPLACE "[\r\n]" " " _CURL_LIBRARIES "${_CURL_LIBRARIES}")
- set (CURL_LIBRARIES ${_CURL_LIBRARIES} CACHE STRING "The libraries needed for Curl")
-ENDIF (CURL_CONFIG)
-
-include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(CURL DEFAULT_MSG CURL_LIBRARIES )
-
-MARK_AS_ADVANCED(CURL_LIBRARIES)
-
diff --git a/cmake/FindGLIB.cmake b/cmake/FindGLIB.cmake
deleted file mode 100644
index 7262b92e..00000000
--- a/cmake/FindGLIB.cmake
+++ /dev/null
@@ -1,123 +0,0 @@
-# - Try to find Glib and its components (gio, gobject etc)
-# Once done, this will define
-#
-# GLIB_FOUND - system has Glib
-# GLIB_INCLUDE_DIRS - the Glib include directories
-# GLIB_LIBRARIES - link these to use Glib
-#
-# Optionally, the COMPONENTS keyword can be passed to find_package()
-# and Glib components can be looked for. Currently, the following
-# components can be used, and they define the following variables if
-# found:
-#
-# gio: GLIB_GIO_LIBRARIES
-# gobject: GLIB_GOBJECT_LIBRARIES
-# gmodule: GLIB_GMODULE_LIBRARIES
-# gthread: GLIB_GTHREAD_LIBRARIES
-#
-# Note that the respective _INCLUDE_DIR variables are not set, since
-# all headers are in the same directory as GLIB_INCLUDE_DIRS.
-#
-# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
-# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
-# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-find_package(PkgConfig)
-pkg_check_modules(PC_GLIB QUIET glib-2.0)
-
-find_library(GLIB_LIBRARIES
- NAMES glib-2.0
- HINTS ${PC_GLIB_LIBDIR}
- ${PC_GLIB_LIBRARY_DIRS}
-)
-
-# Files in glib's main include path may include glibconfig.h, which,
-# for some odd reason, is normally in $LIBDIR/glib-2.0/include.
-get_filename_component(_GLIB_LIBRARY_DIR ${GLIB_LIBRARIES} PATH)
-find_path(GLIBCONFIG_INCLUDE_DIR
- NAMES glibconfig.h
- HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${_GLIB_LIBRARY_DIR}
- ${PC_GLIB_INCLUDEDIR} ${PC_GLIB_INCLUDE_DIRS}
- PATH_SUFFIXES glib-2.0/include
-)
-
-find_path(GLIB_INCLUDE_DIR
- NAMES glib.h
- HINTS ${PC_GLIB_INCLUDEDIR}
- ${PC_GLIB_INCLUDE_DIRS}
- PATH_SUFFIXES glib-2.0
-)
-
-set(GLIB_INCLUDE_DIRS ${GLIB_INCLUDE_DIR} ${GLIBCONFIG_INCLUDE_DIR})
-
-# Version detection
-if (EXISTS "${GLIBCONFIG_INCLUDE_DIR}/glibconfig.h")
- file(READ "${GLIBCONFIG_INCLUDE_DIR}/glibconfig.h" GLIBCONFIG_H_CONTENTS)
- string(REGEX MATCH "#define GLIB_MAJOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
- set(GLIB_VERSION_MAJOR "${CMAKE_MATCH_1}")
- string(REGEX MATCH "#define GLIB_MINOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
- set(GLIB_VERSION_MINOR "${CMAKE_MATCH_1}")
- string(REGEX MATCH "#define GLIB_MICRO_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
- set(GLIB_VERSION_MICRO "${CMAKE_MATCH_1}")
- set(GLIB_VERSION "${GLIB_VERSION_MAJOR}.${GLIB_VERSION_MINOR}.${GLIB_VERSION_MICRO}")
-endif ()
-
-# Additional Glib components. We only look for libraries, as not all of them
-# have corresponding headers and all headers are installed alongside the main
-# glib ones.
-foreach (_component ${GLIB_FIND_COMPONENTS})
- if (${_component} STREQUAL "gio")
- find_library(GLIB_GIO_LIBRARIES NAMES gio-2.0 HINTS ${_GLIB_LIBRARY_DIR})
- set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GIO_LIBRARIES)
- elseif (${_component} STREQUAL "gobject")
- find_library(GLIB_GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${_GLIB_LIBRARY_DIR})
- set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GOBJECT_LIBRARIES)
- elseif (${_component} STREQUAL "gmodule")
- find_library(GLIB_GMODULE_LIBRARIES NAMES gmodule-2.0 HINTS ${_GLIB_LIBRARY_DIR})
- set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GMODULE_LIBRARIES)
- elseif (${_component} STREQUAL "gthread")
- find_library(GLIB_GTHREAD_LIBRARIES NAMES gthread-2.0 HINTS ${_GLIB_LIBRARY_DIR})
- set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GTHREAD_LIBRARIES)
- elseif (${_component} STREQUAL "gio-unix")
- # gio-unix is compiled as part of the gio library, but the include paths
- # are separate from the shared glib ones. Since this is currently only used
- # by WebKitGTK+ we don't go to extraordinary measures beyond pkg-config.
- pkg_check_modules(GIO_UNIX QUIET gio-unix-2.0)
- endif ()
-endforeach ()
-
-include(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLIB REQUIRED_VARS GLIB_INCLUDE_DIRS GLIB_LIBRARIES ${ADDITIONAL_REQUIRED_VARS}
- VERSION_VAR GLIB_VERSION)
-
-mark_as_advanced(
- GLIBCONFIG_INCLUDE_DIR
- GLIB_GIO_LIBRARIES
- GLIB_GIO_UNIX_LIBRARIES
- GLIB_GMODULE_LIBRARIES
- GLIB_GOBJECT_LIBRARIES
- GLIB_GTHREAD_LIBRARIES
- GLIB_INCLUDE_DIR
- GLIB_INCLUDE_DIRS
- GLIB_LIBRARIES
-)
-
diff --git a/cmake/FindGirCompiler.cmake b/cmake/FindGirCompiler.cmake
deleted file mode 100644
index ccec563a..00000000
--- a/cmake/FindGirCompiler.cmake
+++ /dev/null
@@ -1,56 +0,0 @@
-##
-# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and documentation are those
-# of the authors and should not be interpreted as representing official policies,
-# either expressed or implied, of Jakob Westhoff
-##
-
-##
-# Find module for the Gir compiler (g-ir-compiler)
-#
-# This module determines wheter a Gir compiler is installed on the current
-# system and where its executable is.
-#
-# Call the module using "find_package(GirCompiler) from within your CMakeLists.txt.
-#
-# The following variables will be set after an invocation:
-#
-# G_IR_COMPILER_FOUND Whether the g-ir-compiler compiler has been found or not
-# G_IR_COMPILER_EXECUTABLE Full path to the g-ir-compiler executable if it has been found
-##
-
-
-# Search for the g-ir-compiler executable in the usual system paths.
-find_program (G_IR_COMPILER_EXECUTABLE
- NAMES g-ir-compiler)
-
-# Handle the QUIETLY and REQUIRED arguments, which may be given to the find call.
-# Furthermore set G_IR_COMPILER_FOUND to TRUE if the g-ir-compiler has been found (aka.
-# G_IR_COMPILER_EXECUTABLE is set)
-
-include (FindPackageHandleStandardArgs)
-find_package_handle_standard_args (GirCompiler DEFAULT_MSG G_IR_COMPILER_EXECUTABLE)
-
-mark_as_advanced (G_IR_COMPILER_EXECUTABLE)
diff --git a/cmake/FindVala.cmake b/cmake/FindVala.cmake
deleted file mode 100644
index aa3a6e7d..00000000
--- a/cmake/FindVala.cmake
+++ /dev/null
@@ -1,65 +0,0 @@
-##
-# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and documentation are those
-# of the authors and should not be interpreted as representing official policies,
-# either expressed or implied, of Jakob Westhoff
-##
-
-##
-# Find module for the Vala compiler (valac)
-#
-# This module determines wheter a Vala compiler is installed on the current
-# system and where its executable is.
-#
-# Call the module using "find_package(Vala) from within your CMakeLists.txt.
-#
-# The following variables will be set after an invocation:
-#
-# VALA_FOUND Whether the vala compiler has been found or not
-# VALA_EXECUTABLE Full path to the valac executable if it has been found
-# VALA_VERSION Version number of the available valac
-##
-
-
-# Search for the valac executable in the usual system paths.
-find_program(VALA_EXECUTABLE
- NAMES valac)
-
-# Handle the QUIETLY and REQUIRED arguments, which may be given to the find call.
-# Furthermore set VALA_FOUND to TRUE if Vala has been found (aka.
-# VALA_EXECUTABLE is set)
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Vala DEFAULT_MSG VALA_EXECUTABLE)
-
-mark_as_advanced(VALA_EXECUTABLE)
-
-# Determine the valac version
-if(VALA_FOUND)
- execute_process(COMMAND ${VALA_EXECUTABLE} "--version"
- OUTPUT_VARIABLE "VALA_VERSION")
- string(REPLACE "Vala" "" "VALA_VERSION" ${VALA_VERSION})
- string(STRIP ${VALA_VERSION} "VALA_VERSION")
-endif(VALA_FOUND)
diff --git a/cmake/GObjectIntrospectionMacros.cmake b/cmake/GObjectIntrospectionMacros.cmake
deleted file mode 100644
index 6a0dc0ba..00000000
--- a/cmake/GObjectIntrospectionMacros.cmake
+++ /dev/null
@@ -1,34 +0,0 @@
-macro(add_target_gir TARGET_NAME GIR_NAME HEADER CFLAGS GRANITE_VERSION)
- set(PACKAGES "")
- foreach(PKG ${ARGN})
- set(PACKAGES ${PACKAGES} --include=${PKG})
- endforeach()
- install(CODE "set(ENV{LD_LIBRARY_PATH} \"${CMAKE_CURRENT_BINARY_DIR}:\$ENV{LD_LIBRARY_PATH}\")
- execute_process(COMMAND g-ir-scanner ${CFLAGS} -n ${GIR_NAME}
- --quiet
- --library ${TARGET_NAME} ${PACKAGES}
- -o ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.gir
- -L${CMAKE_CURRENT_BINARY_DIR}
- --nsversion=${GRANITE_VERSION} ${HEADER})")
- install(CODE "execute_process(COMMAND g-ir-compiler ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.gir -o ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.typelib)")
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.gir DESTINATION share/gir-1.0/)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.typelib DESTINATION lib/girepository-1.0/)
-endmacro()
-
-macro(add_target_gir_with_executable TARGET_NAME EXE_NAME GIR_NAME HEADER EXE_HEADER CFLAGS GRANITE_VERSION)
- set(PACKAGES "")
- foreach(PKG ${ARGN})
- set(PACKAGES ${PACKAGES} --include=${PKG})
- endforeach()
- install(CODE "set(ENV{LD_LIBRARY_PATH} \"${CMAKE_CURRENT_BINARY_DIR}:\$ENV{LD_LIBRARY_PATH}\")
- execute_process(COMMAND g-ir-scanner ${CFLAGS} -n ${GIR_NAME}
- --quiet
- --library ${TARGET_NAME} --program ${EXE_NAME} ${PACKAGES}
- -o ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.gir
- -L${CMAKE_CURRENT_BINARY_DIR}
- -I${CMAKE_CURRENT_BINARY_DIR}
- --nsversion=${GRANITE_VERSION} ${HEADER} ${EXE_HEADER})")
- install(CODE "execute_process(COMMAND g-ir-compiler ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.gir -o ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.typelib)")
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.gir DESTINATION share/gir-1.0/)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${GIR_NAME}-${GRANITE_VERSION}.typelib DESTINATION lib/girepository-1.0/)
-endmacro()
diff --git a/cmake/GResource.cmake b/cmake/GResource.cmake
deleted file mode 100644
index e4a6aecd..00000000
--- a/cmake/GResource.cmake
+++ /dev/null
@@ -1,68 +0,0 @@
-#
-# Copyright (C) 2013 Venom authors and contributors
-#
-# This file is part of Venom.
-#
-# Venom is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Venom is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Venom. If not, see <http://www.gnu.org/licenses/>.
-#
-
-FIND_PROGRAM(GLIB_COMPILE_RESOURCES_EXECUTABLE NAMES glib-compile-resources)
-MARK_AS_ADVANCED(GLIB_COMPILE_RESOURCES_EXECUTABLE)
-
-INCLUDE(CMakeParseArguments)
-
-FUNCTION(GLIB_COMPILE_RESOURCES output)
- cmake_parse_arguments(ARGS "" "SOURCE" "" ${ARGN})
- SET(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
- SET(out_files "")
-
- FOREACH(src ${ARGS_SOURCE} ${ARGS_UNPARSED_ARGUMENTS})
- SET(in_file "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
- GET_FILENAME_COMPONENT(WORKING_DIR ${in_file} PATH)
- STRING(REPLACE ".xml" ".c" src ${src})
- SET(out_file "${DIRECTORY}/${src}")
- GET_FILENAME_COMPONENT(OUPUT_DIR ${out_file} PATH)
- FILE(MAKE_DIRECTORY ${OUPUT_DIR})
- LIST(APPEND out_files "${DIRECTORY}/${src}")
-
- #FIXME implicit depends currently not working
- EXECUTE_PROCESS(
- COMMAND
- ${GLIB_COMPILE_RESOURCES_EXECUTABLE}
- "--generate-dependencies"
- ${in_file}
- WORKING_DIRECTORY ${WORKING_DIR}
- OUTPUT_VARIABLE in_file_dep
- )
- STRING(REGEX REPLACE "(\r?\n)" ";" in_file_dep "${in_file_dep}")
- SET(in_file_dep_path "")
- FOREACH(dep ${in_file_dep})
- LIST(APPEND in_file_dep_path "${WORKING_DIR}/${dep}")
- ENDFOREACH(dep ${in_file_dep})
- ADD_CUSTOM_COMMAND(
- OUTPUT ${out_file}
- WORKING_DIRECTORY ${WORKING_DIR}
- COMMAND
- ${GLIB_COMPILE_RESOURCES_EXECUTABLE}
- ARGS
- "--generate-source"
- "--target=${out_file}"
- ${in_file}
- DEPENDS
- ${in_file};${in_file_dep_path}
- )
- ENDFOREACH(src ${ARGS_SOURCES} ${ARGS_UNPARSED_ARGUMENTS})
- SET(${output} ${out_files} PARENT_SCOPE)
-ENDFUNCTION(GLIB_COMPILE_RESOURCES)
-
diff --git a/cmake/GSettings.cmake b/cmake/GSettings.cmake
deleted file mode 100644
index 8fd745c3..00000000
--- a/cmake/GSettings.cmake
+++ /dev/null
@@ -1,42 +0,0 @@
-# GSettings.cmake, CMake macros written for Marlin, feel free to re-use them.
-
-option (GSETTINGS_LOCALINSTALL "Install GSettings Schemas locally instead of to the GLib prefix" ON)
-
-option (GSETTINGS_COMPILE "Compile GSettings Schemas after installation" ${GSETTINGS_LOCALINSTALL})
-
-if(GSETTINGS_LOCALINSTALL)
- message(STATUS "GSettings schemas will be installed locally.")
-endif()
-
-if(GSETTINGS_COMPILE)
- message(STATUS "GSettings shemas will be compiled.")
-endif()
-
-macro(add_schema SCHEMA_NAME)
-
- set(PKG_CONFIG_EXECUTABLE pkg-config)
- # Have an option to not install the schema into where GLib is
- if (GSETTINGS_LOCALINSTALL)
- SET (GSETTINGS_DIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/")
- else (GSETTINGS_LOCALINSTALL)
- execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} glib-2.0 --variable prefix OUTPUT_VARIABLE _glib_prefix OUTPUT_STRIP_TRAILING_WHITESPACE)
- SET (GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/")
- endif (GSETTINGS_LOCALINSTALL)
-
- # Run the validator and error if it fails
- execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE _glib_comple_schemas OUTPUT_STRIP_TRAILING_WHITESPACE)
- execute_process (COMMAND ${_glib_comple_schemas} --dry-run --schema-file=${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} ERROR_VARIABLE _schemas_invalid OUTPUT_STRIP_TRAILING_WHITESPACE)
-
- if (_schemas_invalid)
- message (SEND_ERROR "Schema validation error: ${_schemas_invalid}")
- endif (_schemas_invalid)
-
- # Actually install and recomple schemas
- message (STATUS "GSettings schemas will be installed into ${GSETTINGS_DIR}")
- install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} DESTINATION ${GSETTINGS_DIR} OPTIONAL)
-
- if (GSETTINGS_COMPILE)
- install (CODE "message (STATUS \"Compiling GSettings schemas\")")
- install (CODE "execute_process (COMMAND ${_glib_comple_schemas} ${GSETTINGS_DIR})")
- endif ()
-endmacro()
diff --git a/cmake/GetGitRevisionDescription.cmake b/cmake/GetGitRevisionDescription.cmake
deleted file mode 100644
index 058928cd..00000000
--- a/cmake/GetGitRevisionDescription.cmake
+++ /dev/null
@@ -1,131 +0,0 @@
-# - Returns a version string from Git
-#
-# These functions force a re-configure on each git commit so that you can
-# trust the values of the variables in your build system.
-#
-# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
-#
-# Returns the refspec and sha hash of the current head revision
-#
-# git_describe(<var> [<additional arguments to git describe> ...])
-#
-# Returns the results of git describe on the source tree, and adjusting
-# the output so that it tests false if an error occurs.
-#
-# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
-#
-# Returns the results of git describe --exact-match on the source tree,
-# and adjusting the output so that it tests false if there was no exact
-# matching tag.
-#
-# Requires CMake 2.6 or newer (uses the 'function' command)
-#
-# Original Author:
-# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
-# http://academic.cleardefinition.com
-# Iowa State University HCI Graduate Program/VRAC
-#
-# Copyright Iowa State University 2009-2010.
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or copy at
-# http://www.boost.org/LICENSE_1_0.txt)
-
-if(__get_git_revision_description)
- return()
-endif()
-set(__get_git_revision_description YES)
-
-# We must run the following at "include" time, not at function call time,
-# to find the path to this module rather than the path to a calling list file
-get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
-
-function(get_git_head_revision _refspecvar _hashvar)
- set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
- set(GIT_DIR "${GIT_PARENT_DIR}/.git")
- while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
- set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
- get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
- if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
- # We have reached the root directory, we are not in git
- set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
- set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
- return()
- endif()
- set(GIT_DIR "${GIT_PARENT_DIR}/.git")
- endwhile()
- # check if this is a submodule
- if(NOT IS_DIRECTORY ${GIT_DIR})
- file(READ ${GIT_DIR} submodule)
- string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
- get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
- get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
- endif()
- set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
- if(NOT EXISTS "${GIT_DATA}")
- file(MAKE_DIRECTORY "${GIT_DATA}")
- endif()
-
- if(NOT EXISTS "${GIT_DIR}/HEAD")
- return()
- endif()
- set(HEAD_FILE "${GIT_DATA}/HEAD")
- configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
-
- configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
- "${GIT_DATA}/grabRef.cmake"
- @ONLY)
- include("${GIT_DATA}/grabRef.cmake")
-
- set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
- set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
-endfunction()
-
-function(git_describe _var)
- if(NOT GIT_FOUND)
- find_package(Git QUIET)
- endif()
- get_git_head_revision(refspec hash)
- if(NOT GIT_FOUND)
- set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
- return()
- endif()
- if(NOT hash)
- set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
- return()
- endif()
-
- # TODO sanitize
- #if((${ARGN}" MATCHES "&&") OR
- # (ARGN MATCHES "||") OR
- # (ARGN MATCHES "\\;"))
- # message("Please report the following error to the project!")
- # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
- #endif()
-
- #message(STATUS "Arguments to execute_process: ${ARGN}")
-
- execute_process(COMMAND
- "${GIT_EXECUTABLE}"
- describe
- ${hash}
- ${ARGN}
- WORKING_DIRECTORY
- "${CMAKE_CURRENT_SOURCE_DIR}"
- RESULT_VARIABLE
- res
- OUTPUT_VARIABLE
- out
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- if(NOT res EQUAL 0)
- set(out "${out}-${res}-NOTFOUND")
- endif()
-
- set(${_var} "${out}" PARENT_SCOPE)
-endfunction()
-
-function(git_get_exact_tag _var)
- git_describe(out --exact-match ${ARGN})
- set(${_var} "${out}" PARENT_SCOPE)
-endfunction()
-
diff --git a/cmake/GetGitRevisionDescription.cmake.in b/cmake/GetGitRevisionDescription.cmake.in
deleted file mode 100644
index 21090201..00000000
--- a/cmake/GetGitRevisionDescription.cmake.in
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# Internal file for GetGitRevisionDescription.cmake
-#
-# Requires CMake 2.6 or newer (uses the 'function' command)
-#
-# Original Author:
-# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
-# http://academic.cleardefinition.com
-# Iowa State University HCI Graduate Program/VRAC
-#
-# Copyright Iowa State University 2009-2010.
-# Distributed under the Boost Software License, Version 1.0.
-# (See accompanying file LICENSE_1_0.txt or copy at
-# http://www.boost.org/LICENSE_1_0.txt)
-
-set(HEAD_HASH)
-
-file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
-
-string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
-if(HEAD_CONTENTS MATCHES "ref")
- # named branch
- string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
- if(EXISTS "@GIT_DIR@/${HEAD_REF}")
- configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
- else()
- configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
- file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
- if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
- set(HEAD_HASH "${CMAKE_MATCH_1}")
- endif()
- endif()
-else()
- # detached HEAD
- configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
-endif()
-
-if(NOT HEAD_HASH)
- file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
- string(STRIP "${HEAD_HASH}" HEAD_HASH)
-endif()
-
diff --git a/cmake/ParseArguments.cmake b/cmake/ParseArguments.cmake
deleted file mode 100644
index 717c0f56..00000000
--- a/cmake/ParseArguments.cmake
+++ /dev/null
@@ -1,36 +0,0 @@
-##
-# This is a helper Macro to parse optional arguments in Macros/Functions
-# It has been taken from the public CMake wiki.
-# See http://www.cmake.org/Wiki/CMakeMacroParseArguments for documentation and
-# licensing.
-##
-macro(parse_arguments prefix arg_names option_names)
- set(DEFAULT_ARGS)
- foreach(arg_name ${arg_names})
- set(${prefix}_${arg_name})
- endforeach(arg_name)
- foreach(option ${option_names})
- set(${prefix}_${option} FALSE)
- endforeach(option)
-
- set(current_arg_name DEFAULT_ARGS)
- set(current_arg_list)
- foreach(arg ${ARGN})
- set(larg_names ${arg_names})
- list(FIND larg_names "${arg}" is_arg_name)
- if(is_arg_name GREATER -1)
- set(${prefix}_${current_arg_name} ${current_arg_list})
- set(current_arg_name ${arg})
- set(current_arg_list)
- else(is_arg_name GREATER -1)
- set(loption_names ${option_names})
- list(FIND loption_names "${arg}" is_option)
- if(is_option GREATER -1)
- set(${prefix}_${arg} TRUE)
- else(is_option GREATER -1)
- set(current_arg_list ${current_arg_list} ${arg})
- endif(is_option GREATER -1)
- endif(is_arg_name GREATER -1)
- endforeach(arg)
- set(${prefix}_${current_arg_name} ${current_arg_list})
-endmacro(parse_arguments)
diff --git a/cmake/README b/cmake/README
deleted file mode 100644
index 9d45b32f..00000000
--- a/cmake/README
+++ /dev/null
@@ -1,10 +0,0 @@
- Elementary CMake modules
-
-This is a set of CMake modules: Translations, GSettings, and Vala modules.
-
-For all the Vala related modules see README.Vala.rst:
- - ParseArguments.cmake
- - ValaPrecompile.cmake
- - ValaVersion.cmake
- - FindVala.cmake
-
diff --git a/cmake/README.Vala.rst b/cmake/README.Vala.rst
deleted file mode 100644
index bcc59b76..00000000
--- a/cmake/README.Vala.rst
+++ /dev/null
@@ -1,173 +0,0 @@
-==========
-Vala CMake
-==========
-:Author:
- Jakob Westhoff
-:Version:
- Draft
-
-
-Overview
-========
-
-Vala CMake is a collection of macros for the CMake_ build system to allow the
-creation and management of projects developed using the Vala_ programming
-language or its "Genie" flavor (less tested).
-
-
-Installation
-============
-
-To use the Vala macros in your own project you need to copy the macro files to
-an arbitrary folder in your projects directory and reference them in your
-``CMakeLists.txt`` file.
-
-Assuming the macros are stored under ``cmake/vala`` in your projects folder you
-need to add the following information to your base ``CMakeLists.txt``::
-
- list(APPEND CMAKE_MODULE_PATH
- ${CMAKE_SOURCE_DIR}/cmake/vala
- )
-
-After the new module path as been added you can simply include the provided
-modules or use the provided find routines.
-
-
-Finding Vala
-============
-
-The find module for vala works like any other Find module in CMake.
-You can use it by simply calling the usual ``find_package`` function. Default
-parameters like ``REQUIRED`` and ``QUIETLY`` are supported.
-
-::
-
- find_package(Vala REQUIRED)
-
-After a successful call to the find_package function the following variables
-will be set:
-
-VALA_FOUND
- Whether the vala compiler has been found or not
-
-VALA_EXECUTABLE
- Full path to the valac executable if it has been found
-
-VALA_VERSION
- Version number of the available valac
-
-
-Precompiling Vala sources
-=========================
-
-CMake is mainly supposed to handle c or c++ based projects. Luckily every vala
-program is translated into plain c code using the vala compiler, followed by
-normal compilation of the generated c program using gcc.
-
-The macro ``vala_precompile`` uses that fact to create c files from your .vala
-sources for further CMake processing.
-
-The first parameter provided is a variable, which will be filled with a list of
-c files outputted by the vala compiler. This list can than be used in
-conjunction with functions like ``add_executable`` or others to create the
-necessary compile rules with CMake.
-
-The initial variable is followed by a list of .vala files to be compiled.
-Please take care to add every vala file belonging to the currently compiled
-project or library as Vala will otherwise not be able to resolve all
-dependencies.
-
-The following sections may be specified afterwards to provide certain options
-to the vala compiler:
-
-PACKAGES
- A list of vala packages/libraries to be used during the compile cycle. The
- package names are exactly the same, as they would be passed to the valac
- "--pkg=" option.
-
-OPTIONS
- A list of optional options to be passed to the valac executable. This can be
- used to pass "--thread" for example to enable multi-threading support.
-
-DIRECTORY
- Specify the directory where the output source files will be stored. If
- ommitted, the source files will be stored in CMAKE_CURRENT_BINARY_DIR.
-
-CUSTOM_VAPIS
- A list of custom vapi files to be included for compilation. This can be
- useful to include freshly created vala libraries without having to install
- them in the system.
-
-GENERATE_VAPI
- Pass all the needed flags to the compiler to create an internal vapi for
- the compiled library. The provided name will be used for this and a
- <provided_name>.vapi file will be created.
-
-GENERATE_HEADER
- Let the compiler generate a header file for the compiled code. There will
- be a header file as well as an internal header file being generated called
- <provided_name>.h and <provided_name>_internal.h
-
-The following call is a simple example to the vala_precompile macro showing an
-example to every of the optional sections::
-
- vala_precompile(VALA_C
- source1.vala
- source2.vala
- source3.vala
- PACKAGES
- gtk+-2.0
- gio-1.0
- posix
- OPTIONS
- --thread
- CUSTOM_VAPIS
- some_vapi.vapi
- GENERATE_VAPI
- myvapi
- GENERATE_HEADER
- myheader
- )
-
-Most important is the variable VALA_C which will contain all the generated c
-file names after the call. The easiest way to use this information is to tell
-CMake to create an executable out of it.
-
-::
-
- add_executable(myexecutable ${VALA_C})
-
-
-Further reading
-===============
-
-The `Pdf Presenter Console`__ , which is a vala based project of mine, makes
-heavy usage of the here described macros. To look at a real world example of
-these macros the mentioned project is the right place to take a look. The svn
-trunk of it can be found at::
-
- svn://pureenergy.cc/pdf_presenter_console/trunk
-
-
-__ http://westhoffswelt.de/projects/pdf_presenter_console.html
-
-
-Acknowledgments
-===============
-
-Thanks go out to Florian Sowade, a fellow local PHP-Usergroupie, who helped me
-a lot with the initial version of this macros and always answered my mostly
-dumb CMake questions.
-
-.. _CMake: http://cmake.org
-.. _Vala: http://live.gnome.org/Vala
-.. _Genie: http://live.gnome.org/Genie
-
-
-
-..
- Local Variables:
- mode: rst
- fill-column: 79
- End:
- vim: et syn=rst tw=79
diff --git a/cmake/Translations.cmake b/cmake/Translations.cmake
deleted file mode 100644
index 4442ff03..00000000
--- a/cmake/Translations.cmake
+++ /dev/null
@@ -1,79 +0,0 @@
-# Translations.cmake, CMake macros written for Marlin, feel free to re-use them
-
-macro(add_translations_directory NLS_PACKAGE)
- add_custom_target (i18n ALL COMMENT “Building i18n messages.”)
- find_program (MSGFMT_EXECUTABLE msgfmt)
- # be sure that all languages are present
- set (LANGUAGES_NEEDED af am ar ast az be bg bn bs ca ckb cs da de el en_AU en_CA en_GB eo es et eu fa fi fr fr_CA gl he hi hr hu hy id it ja ka ko ky lb lo lt lv ml mr ms nb nl nn pl pt pt_BR ro ru rue si sk sl sma sq sr sv sw ta te th tr uk vi zh_CN zh_HK zh_TW)
- foreach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
- if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po)
- file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "msgid \"\"\n")
- file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "msgstr \"\"\n")
- file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "\"MIME-Version: 1.0\\n\"\n")
- file (APPEND ${CMAKE_CURRENT_SOURCE_DIR}/${LANGUAGE_NEEDED}.po "\"Content-Type: text/plain; charset=UTF-8\\n\"\n")
- endif ()
- endforeach (LANGUAGE_NEEDED ${LANGUAGES_NEEDED})
- # generate .mo from .po
- file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po)
- foreach (PO_INPUT ${PO_FILES})
- get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME_WE)
- set (MO_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PO_INPUT_BASE}.mo)
- add_custom_command (TARGET i18n COMMAND ${MSGFMT_EXECUTABLE} -o ${MO_OUTPUT} ${PO_INPUT})
-
- install (FILES ${MO_OUTPUT} DESTINATION
- share/locale/${PO_INPUT_BASE}/LC_MESSAGES
- RENAME ${NLS_PACKAGE}.mo)
- endforeach (PO_INPUT ${PO_FILES})
-endmacro(add_translations_directory)
-
-macro(add_translations_catalog NLS_PACKAGE)
- add_custom_target (pot COMMENT “Building translation catalog.”)
- find_program (XGETTEXT_EXECUTABLE xgettext)
-
- set(C_SOURCE "")
- set(VALA_SOURCE "")
- set(GLADE_SOURCE "")
-
- foreach(FILES_INPUT ${ARGN})
- set(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT})
-
-
- file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.c)
- foreach(C_FILE ${SOURCE_FILES})
- set(C_SOURCE ${C_SOURCE} ${C_FILE})
- endforeach()
-
- file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.vala)
- foreach(VALA_C_FILE ${SOURCE_FILES})
- set(VALA_SOURCE ${VALA_SOURCE} ${VALA_C_FILE})
- endforeach()
-
- file (GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/ ${BASE_DIRECTORY}/*.ui)
- foreach(GLADE_C_FILE ${SOURCE_FILES})
- set(GLADE_SOURCE ${GLADE_SOURCE} ${GLADE_C_FILE})
- endforeach()
- endforeach()
-
- set(BASE_XGETTEXT_COMMAND
- ${XGETTEXT_EXECUTABLE} -d ${NLS_PACKAGE}
- -o ${CMAKE_CURRENT_SOURCE_DIR}/${NLS_PACKAGE}.pot
- --add-comments="/" --keyword="_" --keyword="N_" --keyword="C_:1c,2" --keyword="NC_:1c,2" --keyword="ngettext:1,2" --keyword="Q_:1g" --from-code=UTF-8)
-
-
- set(CONTINUE_FLAG "")
-
- IF(NOT "${C_SOURCE}" STREQUAL "")
- add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${C_SOURCE})
- set(CONTINUE_FLAG "-j")
- ENDIF()
-
- IF(NOT "${VALA_SOURCE}" STREQUAL "")
- add_custom_command(TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${CONTINUE_FLAG} -LC\# ${VALA_SOURCE})
- message(${CMAKE_CURRENT_SOURCE_DIR})
- set(CONTINUE_FLAG "-j")
- ENDIF()
-
- IF(NOT "${GLADE_SOURCE}" STREQUAL "")
- add_custom_command (TARGET pot WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ${BASE_XGETTEXT_COMMAND} ${CONTINUE_FLAG} -LGlade ${GLADE_SOURCE})
- ENDIF()
-endmacro()
diff --git a/cmake/ValaPrecompile.cmake b/cmake/ValaPrecompile.cmake
deleted file mode 100644
index 97aa97ce..00000000
--- a/cmake/ValaPrecompile.cmake
+++ /dev/null
@@ -1,250 +0,0 @@
-##
-# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
-# Copyright 2012 elementary.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and documentation are those
-# of the authors and should not be interpreted as representing official policies,
-# either expressed or implied, of Jakob Westhoff
-##
-
-include(ParseArguments)
-find_package(Vala REQUIRED)
-
-##
-# Compile vala files to their c equivalents for further processing.
-#
-# The "vala_precompile" macro takes care of calling the valac executable on the
-# given source to produce c files which can then be processed further using
-# default cmake functions.
-#
-# The first parameter provided is a variable, which will be filled with a list
-# of c files outputted by the vala compiler. This list can than be used in
-# conjuction with functions like "add_executable" or others to create the
-# neccessary compile rules with CMake.
-#
-# The initial variable is followed by a list of .vala files to be compiled.
-# Please take care to add every vala file belonging to the currently compiled
-# project or library as Vala will otherwise not be able to resolve all
-# dependencies.
-#
-# The following sections may be specified afterwards to provide certain options
-# to the vala compiler:
-#
-# PACKAGES
-# A list of vala packages/libraries to be used during the compile cycle. The
-# package names are exactly the same, as they would be passed to the valac
-# "--pkg=" option.
-#
-# OPTIONS
-# A list of optional options to be passed to the valac executable. This can be
-# used to pass "--thread" for example to enable multi-threading support.
-#
-# CUSTOM_VAPIS
-# A list of custom vapi files to be included for compilation. This can be
-# useful to include freshly created vala libraries without having to install
-# them in the system.
-#
-# GENERATE_VAPI
-# Pass all the needed flags to the compiler to create an internal vapi for
-# the compiled library. The provided name will be used for this and a
-# <provided_name>.vapi file will be created.
-#
-# GENERATE_HEADER
-# Let the compiler generate a header file for the compiled code. There will
-# be a header file as well as an internal header file being generated called
-# <provided_name>.h and <provided_name>_internal.h
-#
-# GENERATE_GIR
-# Have the compiler generate a GObject-Introspection repository file with
-# name: <provided_name>.gir. This can be later used to create a binary typelib
-# using the GI compiler.
-#
-# GENERATE_SYMBOLS
-# Output a <provided_name>.symbols file containing all the exported symbols.
-#
-# The following call is a simple example to the vala_precompile macro showing
-# an example to every of the optional sections:
-#
-# vala_precompile(VALA_C mytargetname
-# source1.vala
-# source2.vala
-# source3.vala
-# PACKAGES
-# gtk+-2.0
-# gio-1.0
-# posix
-# DIRECTORY
-# gen
-# OPTIONS
-# --thread
-# CUSTOM_VAPIS
-# some_vapi.vapi
-# GENERATE_VAPI
-# myvapi
-# GENERATE_HEADER
-# myheader
-# GENERATE_GIR
-# mygir
-# GENERATE_SYMBOLS
-# mysymbols
-# )
-#
-# Most important is the variable VALA_C which will contain all the generated c
-# file names after the call.
-##
-
-macro(vala_precompile output target_name)
- parse_arguments(ARGS "TARGET;PACKAGES;OPTIONS;DIRECTORY;GENERATE_GIR;GENERATE_SYMBOLS;GENERATE_HEADER;GENERATE_VAPI;CUSTOM_VAPIS" "" ${ARGN})
-
- if(ARGS_DIRECTORY)
- set(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_DIRECTORY})
- else(ARGS_DIRECTORY)
- set(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
- endif(ARGS_DIRECTORY)
- include_directories(${DIRECTORY})
- set(vala_pkg_opts "")
- foreach(pkg ${ARGS_PACKAGES})
- list(APPEND vala_pkg_opts "--pkg=${pkg}")
- endforeach(pkg ${ARGS_PACKAGES})
- set(in_files "")
- set(out_files "")
- set(out_files_display "")
- set(${output} "")
-
- foreach(src ${ARGS_DEFAULT_ARGS})
- string(REGEX MATCH "^/" IS_MATCHED ${src})
- if(${IS_MATCHED} MATCHES "/")
- set(src_file_path ${src})
- else()
- set(src_file_path ${CMAKE_CURRENT_SOURCE_DIR}/${src})
- endif()
- list(APPEND in_files ${src_file_path})
- string(REPLACE ".vala" ".c" src ${src})
- string(REPLACE ".gs" ".c" src ${src})
- if(${IS_MATCHED} MATCHES "/")
- get_filename_component(VALA_FILE_NAME ${src} NAME)
- set(out_file "${CMAKE_CURRENT_BINARY_DIR}/${VALA_FILE_NAME}")
- list(APPEND out_files "${CMAKE_CURRENT_BINARY_DIR}/${VALA_FILE_NAME}")
- else()
- set(out_file "${DIRECTORY}/${src}")
- list(APPEND out_files "${DIRECTORY}/${src}")
- endif()
- list(APPEND ${output} ${out_file})
- list(APPEND out_files_display "${src}")
- endforeach(src ${ARGS_DEFAULT_ARGS})
-
- set(custom_vapi_arguments "")
- if(ARGS_CUSTOM_VAPIS)
- foreach(vapi ${ARGS_CUSTOM_VAPIS})
- if(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR})
- list(APPEND custom_vapi_arguments ${vapi})
- else (${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR})
- list(APPEND custom_vapi_arguments ${CMAKE_CURRENT_SOURCE_DIR}/${vapi})
- endif(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR})
- endforeach(vapi ${ARGS_CUSTOM_VAPIS})
- endif(ARGS_CUSTOM_VAPIS)
-
- set(vapi_arguments "")
- if(ARGS_GENERATE_VAPI)
- list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi")
- list(APPEND out_files_display "${ARGS_GENERATE_VAPI}.vapi")
- set(vapi_arguments "--library=${ARGS_GENERATE_VAPI}" "--vapi=${ARGS_GENERATE_VAPI}.vapi")
-
- # Header and internal header is needed to generate internal vapi
- if (NOT ARGS_GENERATE_HEADER)
- set(ARGS_GENERATE_HEADER ${ARGS_GENERATE_VAPI})
- endif(NOT ARGS_GENERATE_HEADER)
- endif(ARGS_GENERATE_VAPI)
-
- set(header_arguments "")
- if(ARGS_GENERATE_HEADER)
- list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}.h")
- list(APPEND out_files_display "${ARGS_GENERATE_HEADER}.h")
- list(APPEND header_arguments "--header=${ARGS_GENERATE_HEADER}.h")
- endif(ARGS_GENERATE_HEADER)
-
- set(gir_arguments "")
- set(gircomp_command "")
- if(ARGS_GENERATE_GIR)
- list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_GIR}.gir")
- list(APPEND out_files_display "${ARGS_GENERATE_GIR}.gir")
- set(gir_arguments "--gir=${ARGS_GENERATE_GIR}.gir")
-
- include (FindGirCompiler)
- find_package(GirCompiler REQUIRED)
-
- set(gircomp_command
- COMMAND
- ${G_IR_COMPILER_EXECUTABLE}
- ARGS
- "${DIRECTORY}/${ARGS_GENERATE_GIR}.gir"
- -o "${DIRECTORY}/${ARGS_GENERATE_GIR}.typelib")
- endif(ARGS_GENERATE_GIR)
-
- set(symbols_arguments "")
- if(ARGS_GENERATE_SYMBOLS)
- list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_SYMBOLS}.symbols")
- list(APPEND out_files_display "${ARGS_GENERATE_SYMBOLS}.symbols")
- set(symbols_arguments "--symbols=${ARGS_GENERATE_SYMBOLS}.symbols")
- endif(ARGS_GENERATE_SYMBOLS)
-
- # Workaround for a bug that would make valac run twice. This file is written
- # after the vala compiler generates C source code.
- set(OUTPUT_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${target_name}_valac.stamp)
-
- add_custom_command(
- OUTPUT
- ${OUTPUT_STAMP}
- COMMAND
- ${VALA_EXECUTABLE}
- ARGS
- "-C"
- ${header_arguments}
- ${vapi_arguments}
- ${gir_arguments}
- ${symbols_arguments}
- "-b" ${CMAKE_CURRENT_SOURCE_DIR}
- "-d" ${DIRECTORY}
- ${vala_pkg_opts}
- ${ARGS_OPTIONS}
- "-g"
- #"--save-temps"
- ${in_files}
- ${custom_vapi_arguments}
- COMMAND
- touch
- ARGS
- ${OUTPUT_STAMP}
- DEPENDS
- ${in_files}
- ${ARGS_CUSTOM_VAPIS}
- COMMENT
- "Generating ${out_files_display}"
- ${gircomp_command}
- )
-
- # This command will be run twice for some reason (pass a non-empty string to COMMENT
- # in order to see it). Since valac is not executed from here, this won't be a problem.
- add_custom_command(OUTPUT ${out_files} DEPENDS ${OUTPUT_STAMP} COMMENT "")
-endmacro(vala_precompile)
diff --git a/cmake/ValaVersion.cmake b/cmake/ValaVersion.cmake
deleted file mode 100644
index 3fff193f..00000000
--- a/cmake/ValaVersion.cmake
+++ /dev/null
@@ -1,96 +0,0 @@
-##
-# Copyright 2009-2010 Jakob Westhoff. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# The views and conclusions contained in the software and documentation are those
-# of the authors and should not be interpreted as representing official policies,
-# either expressed or implied, of Jakob Westhoff
-##
-
-include(ParseArguments)
-find_package(Vala REQUIRED)
-
-##
-# Ensure a certain valac version is available
-#
-# The initial argument is the version to check for
-#
-# It may be followed by a optional parameter to specifiy a version range. The
-# following options are valid:
-#
-# EXACT
-# Vala needs to be available in the exact version given
-#
-# MINIMUM
-# The provided version is the minimum version. Therefore Vala needs to be
-# available in the given version or any higher version
-#
-# MAXIMUM
-# The provided version is the maximum. Therefore Vala needs to be available
-# in the given version or any version older than this
-#
-# If no option is specified the version will be treated as a minimal version.
-##
-macro(ensure_vala_version version)
- parse_arguments(ARGS "" "MINIMUM;MAXIMUM;EXACT" ${ARGN})
- set(compare_message "")
- set(error_message "")
- if(ARGS_MINIMUM)
- set(compare_message "a minimum ")
- set(error_message "or greater ")
- elseif(ARGS_MAXIMUM)
- set(compare_message "a maximum ")
- set(error_message "or less ")
- endif(ARGS_MINIMUM)
-
- message(STATUS
- "checking for ${compare_message}Vala version of ${version}"
- )
-
- unset(version_accepted)
-
- # MINIMUM is the default if no option is specified
- if(ARGS_EXACT)
- if(${VALA_VERSION} VERSION_EQUAL ${version} )
- set(version_accepted TRUE)
- endif(${VALA_VERSION} VERSION_EQUAL ${version})
- elseif(ARGS_MAXIMUM)
- if(${VALA_VERSION} VERSION_LESS ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version})
- set(version_accepted TRUE)
- endif(${VALA_VERSION} VERSION_LESS ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version})
- else(ARGS_MAXIMUM)
- if(${VALA_VERSION} VERSION_GREATER ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version})
- set(version_accepted TRUE)
- endif(${VALA_VERSION} VERSION_GREATER ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version})
- endif(ARGS_EXACT)
-
- if (NOT version_accepted)
- message(FATAL_ERROR
- "Vala version ${version} ${error_message}is required."
- )
- endif(NOT version_accepted)
-
- message(STATUS
- " found Vala, version ${VALA_VERSION}"
- )
-endmacro(ensure_vala_version)
diff --git a/cmake/uninstall.cmake b/cmake/uninstall.cmake
deleted file mode 100644
index 2037e365..00000000
--- a/cmake/uninstall.cmake
+++ /dev/null
@@ -1,21 +0,0 @@
-if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
- message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
-endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
-
-file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
-string(REGEX REPLACE "\n" ";" files "${files}")
-foreach(file ${files})
- message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
- if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
- exec_program(
- "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
- OUTPUT_VARIABLE rm_out
- RETURN_VALUE rm_retval
- )
- if(NOT "${rm_retval}" STREQUAL 0)
- message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
- endif(NOT "${rm_retval}" STREQUAL 0)
- else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
- message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
- endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
-endforeach(file)
diff --git a/data/ArticleView/article.html b/data/ArticleView/article.html
index 7c7e3786..d8af75de 100644
--- a/data/ArticleView/article.html
+++ b/data/ArticleView/article.html
@@ -10,19 +10,18 @@
</style>
</head>
-<body style="font-size:$FONTSIZE;">
- <div class="$THEME">
+<body style="font-size:$FONTSIZEpt;font-family:$FONTFAMILY;" class="$THEME">
+ <div>
<header class="post unselectable">
- <span class="source" style="font-size:$SOURCEFONTSIZE;">$FEED</span>
- <h1><a href="$URL" target="_blank">$TITLE</a></h1>
- <span class="author" style="font-size:$SOURCEFONTSIZE;">$AUTHOR</span>
+ <span class="source" style="font-size:$SMALLSIZEpt;">$FEED</span>
+ <h1><a href="$URL" target="_blank" style="font-size:$LARGESIZEpt;">$TITLE</a></h1>
+ <span class="author" style="font-size:$SMALLSIZEpt;">$AUTHOR</span>
</header>
- <div class="content $UNSELECTABLE">
+ <div class="frcontent $UNSELECTABLE">
$HTML
</div>
</div>
</body>
</html>
-
diff --git a/data/ArticleView/style.css b/data/ArticleView/style.css
index 90b34439..fcb0199b 100644
--- a/data/ArticleView/style.css
+++ b/data/ArticleView/style.css
@@ -123,18 +123,17 @@ section {
div.pw {
width: 90%;
- max-width: 1100px;
margin: 0 auto;
padding: 5% 0;
}
body {
- padding: 3rem;
cursor: default;
- font-family: 'Droid Sans', 'Open Sans';
- font-weight: 300;
- max-width: 1200px;
- margin: auto;
+ font-weight: normal;
+ max-width: 50em;
+ margin: auto;
+ text-rendering: optimizeLegibility;
+ margin-top: 1rem;
}
.tlblue {
@@ -152,42 +151,52 @@ h3,
h4,
h5,
h6 {
- color: #318c34;
font-weight: 500;
- font-family: 'Open Sans', Arial, sans-serif, sans;
text-align: left;
line-height: 120%;
}
+h1 a,
+h2 a,
+h3 a,
+h4 a,
+h5 a,
+h6 a {
+ color: #1d1f1c;
+}
+
+h1 {
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+ font-size: 2rem;
+ font-weight: normal;
+}
+
h2 {
margin-top: 2rem;
margin-bottom: 1rem;
- padding-bottom: 0.75rem;
- border-bottom: 2px solid #318c34;
- font-size: 2.5rem;
- font-weight: 300;
+ font-size: 1.5rem;
+ font-weight: normal;
}
h3 {
- font-size: 1.5rem;
+ font-size: 1.25rem;
margin-bottom: 0.5rem;
}
h4 {
- font-size: 1.5rem;
+ font-size: 1.25rem;
margin-bottom: 0.5rem;
text-transform: uppercase;
- font-weight: 300;
+ font-weight: normal;
}
h5 {
- color: #000;
font-size: 1.2rem;
margin-bottom: 0.25rem;
}
h6 {
- color: #000;
font-size: 1rem;
margin-bottom: 0.25rem;
text-transform: uppercase;
@@ -243,7 +252,6 @@ a :not(img){
}
a {
- color: #318c34;
text-overflow: ellipsis;
}
@@ -273,7 +281,7 @@ img {
figure {
display: inline-block;
margin: 2rem auto;
- padding: 1rem;
+ margin: 1rem;
border: 1px solid rgba(0, 0, 0, 0.05);
}
@@ -297,8 +305,7 @@ figure:first-child {
}
header.post {
- padding: 2rem;
- background: rgba(0, 0, 0, 0.05);
+ padding: 1rem 2rem;
}
div.introtext {
@@ -306,8 +313,9 @@ div.introtext {
}
header.post h1 {
- color: #000;
font-weight: 600;
+ margin-top: 0.5rem;
+ margin-bottom: 0.5rem;
}
header.post a:link {
@@ -326,10 +334,8 @@ header.post span.author {
font-size: 0.75rem;
}
-div.content {
- padding: 2rem;
- margin-bottom: 3rem;
- border: 1px solid rgba(0, 0, 0, 0.05);
+div.frcontent {
+ padding: 1rem 2rem;
text-align: justify;
font-size: inherit;
}
@@ -353,8 +359,8 @@ dd:after {
blockquote {
margin-top: 10px;
margin-bottom: 10px;
- margin-left: 50px;
- padding-left: 15px;
+ padding-left: 15px;
+ margin-left: 15px;
border-left: 3px solid #ccc;
}
@@ -377,147 +383,162 @@ b {
height: 100%;
}
+/* Themes with no background boxes need less padding */
+body.theme.default header.post, body.theme.parchment header.post,
+body.theme.default div.frcontent, body.theme.parchment div.frcontent
+{
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-bottom: 1rem;
+ margin-top: 1rem;
+}
/* DEFAULT THEME*/
-div.theme.default {
+body.theme.default {
background: white;
}
+footer,
+iframe,
+img,
+figure {
+ border: none;
+}
/* MIDNIGHT THEME -- also default dark */
-div.theme.midnight {
+body.theme.midnight {
color: rgba(255, 255, 255, 0.6);
background: #233540;
}
-div.theme.midnight pre,
-div.theme.midnight pre code,
-div.theme.midnight code {
+body.theme.midnight pre,
+body.theme.midnight pre code,
+body.theme.midnight code {
background-color: rgba(255, 255, 255, 0.6);
color: #233540;
}
-div.theme.midnight table,
-div.theme.midnight th,
-div.theme.midnight td {
+body.theme.midnight table,
+body.theme.midnight th,
+body.theme.midnight td {
border: 1px solid rgba(255, 255, 255, 0.6);
}
-div.theme.midnight div.content th,
-div.theme.midnight header.post {
+body.theme.midnight div.frcontent th,
+body.theme.midnight header.post {
background: rgba(0, 0, 0, 0.1);
}
-div.theme.midnight header.post h1 {
+body.theme.midnight header.post h1 {
color: #fff;
}
-div.theme.midnight header.post h1 a {
+body.theme.midnight header.post h1 a {
color: #9BA6AC;
}
-div.theme.midnight header.post span.source {
+body.theme.midnight header.post span.source {
color: #2978a6;
}
-div.theme.midnight header.post span.author {
+body.theme.midnight header.post span.author {
color: rgba(255, 255, 255, 0.6);
}
-div.theme.midnight div.content {
+body.theme.midnight div.frcontent {
border: 1px solid rgba(0, 0, 0, 0.1);
}
-div.theme.midnight div.content a {
+body.theme.midnight div.frcontent a {
color: #2978a6;
}
-div.theme.midnight div.content h1,
-div.theme.midnight div.content h2,
-div.theme.midnight div.content h3,
-div.theme.midnight div.content h4 {
+body.theme.midnight div.frcontent h1,
+body.theme.midnight div.frcontent h2,
+body.theme.midnight div.frcontent h3,
+body.theme.midnight div.frcontent h4 {
color: #2978a6;
}
-div.theme.midnight div.content h2 {
+body.theme.midnight div.frcontent h2 {
border-color: #2978a6;
}
-div.theme.midnight div.content body,
-div.theme.midnight div.content ul,
-div.theme.midnight div.content figcaption,
-div.theme.midnight div.content h5,
-div.theme.midnight div.content h6,
-div.theme.midnight div.content p {
+body.theme.midnight div.frcontent body,
+body.theme.midnight div.frcontent ul,
+body.theme.midnight div.frcontent figcaption,
+body.theme.midnight div.frcontent h5,
+body.theme.midnight div.frcontent h6,
+body.theme.midnight div.frcontent p {
color: rgba(255, 255, 255, 0.6);
text-align: justify;
}
-div.theme.spring {
+body.theme.spring {
background: #f8fff2;
}
-div.theme.spring header.post {
+body.theme.spring header.post {
background: #ccffa6;
}
-div.theme.spring header.post h1 {
+body.theme.spring header.post h1 {
color: #405e80;
}
-div.theme.spring header.post span.source {
+body.theme.spring header.post span.source {
color: #405e80;
}
-div.theme.spring div.content {
+body.theme.spring div.frcontent {
border: 1px solid #ccffa6;
}
-div.theme.spring div.content a {
+body.theme.spring div.frcontent a {
color: #405e80;
}
-div.theme.spring div.content h1,
-div.theme.spring div.content h2,
-div.theme.spring div.content h3,
-div.theme.spring div.content h4 {
+body.theme.spring div.frcontent h1,
+body.theme.spring div.frcontent h2,
+body.theme.spring div.frcontent h3,
+body.theme.spring div.frcontent h4 {
color: #405e80;
}
-div.theme.spring div.content h2 {
+body.theme.spring div.frcontent h2 {
border-color: #405e80;
}
-div.theme.parchment {
+body.theme.parchment {
background: #faf2e1;
}
-div.theme.parchment header.post h1 {
+body.theme.parchment header.post h1 {
color: #99400f;
}
-div.theme.parchment div.content a {
+body.theme.parchment div.frcontent a {
color: #99400f;
}
-div.theme.parchment div.content h1,
-div.theme.parchment div.content h2,
-div.theme.parchment div.content h3,
-div.theme.parchment div.content h4 {
+body.theme.parchment div.frcontent h1,
+body.theme.parchment div.frcontent h2,
+body.theme.parchment div.frcontent h3,
+body.theme.parchment div.frcontent h4 {
color: #99400f;
}
-div.theme.parchment div.content h2 {
+body.theme.parchment div.frcontent h2 {
border-color: #99400f;
}
-div.theme.parchment div.content body,
-div.theme.parchment div.content ul,
-div.theme.parchment div.content figcaption,
-div.theme.parchment div.content h5,
-div.theme.parchment div.content h6,
-div.theme.parchment div.content p {
+body.theme.parchment div.frcontent body,
+body.theme.parchment div.frcontent ul,
+body.theme.parchment div.frcontent figcaption,
+body.theme.parchment div.frcontent h5,
+body.theme.parchment div.frcontent h6,
+body.theme.parchment div.frcontent p {
color: rgba(0, 0, 0, 0.8);
}
diff --git a/data/GrabberConfig b/data/GrabberConfig
new file mode 160000
+Subproject 563925676d110a51197025aad8ddcac14d18e36
diff --git a/data/GrabberConfig/.about.com.txt b/data/GrabberConfig/.about.com.txt
deleted file mode 100644
index 3953d3e5..00000000
--- a/data/GrabberConfig/.about.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //*[@id='title']//h1
-body: //*[(@id = "articlebody")]
-test_url: http://nutrition.about.com/od/changeyourdiet/qt/healthysnacks.htm \ No newline at end of file
diff --git a/data/GrabberConfig/.allthingsd.com.txt b/data/GrabberConfig/.allthingsd.com.txt
deleted file mode 100644
index ec89c0da..00000000
--- a/data/GrabberConfig/.allthingsd.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='content-left']/div[@class='post']
-strip_id_or_class: social
-strip_id_or_class: atd-disqus-disclaimer
-tidy: no
-
-test_url: http://mediamemo.allthingsd.com/20110516/bit-ly-gets-a-new-boss/ \ No newline at end of file
diff --git a/data/GrabberConfig/.blog.163.com.txt b/data/GrabberConfig/.blog.163.com.txt
deleted file mode 100644
index 2372e122..00000000
--- a/data/GrabberConfig/.blog.163.com.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# To administrator:
-# Please replace the hostname with "*.blog.163.com"
-
-# This filter is tested on:
-# http://wangzeke.blog.163.com/blog/static/933015402012410105922228/
-# http://wavow.blog.163.com/blog/static/532284320124117211245/
-# http://elainejeff.blog.163.com/blog/static/1671902912012498727253/
-
-
-strip://*[contains(@class, 'mcnt ztag')]//span[@style = 'display:none;']
-strip://*[contains(@id, 'divTopLink')]
-strip://*[contains(@class, 'phide')]
-strip://*[contains(@class, 'thide')]
-strip://*[contains(@id, 'topbar')]
-strip://*[contains(@class, 'tbar')]
-strip://*[contains(@class, 'snl')]
-strip://*[contains(@id, 'banner')]
-
-
-title://h3
-author://span[contains(@class, 'ztag pre')]
-date://span[contains(@class, 'blogsep')]
-body://div[contains(@class, 'mcnt ztag')]
-
-convert_double_br_tags: yes
-test_url: http://lvqiuluwei1510.blog.163.com/blog/static/9028525120124146100841/ \ No newline at end of file
diff --git a/data/GrabberConfig/.blogs.nytimes.com.txt b/data/GrabberConfig/.blogs.nytimes.com.txt
deleted file mode 100644
index 6517463e..00000000
--- a/data/GrabberConfig/.blogs.nytimes.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-body: //div[@class='entry-content']
-title: //h1[@class='entry-title']
-# Two author lines because krugman.blogs.nytimes.com is a special case
-author: substring-after(//div[@class="box module nocontent"]/h4, "About ")
-author: //address/a
-date: //meta[@name="PUD"]/@content
-date: //*[@class='date']
-
-#Removes related content but cleans up article text
-strip: //ul[@class='toolsList wrap']
-strip_id_or_class:inlineModule
-strip_id_or_class:module
-strip_id_or_class:toolsListContainer
-prune: no
-test_url: http://opinionator.blogs.nytimes.com/2011/02/03/lost-and-gone-forever/
-test_url: http://krugman.blogs.nytimes.com/2012/09/12/a-vote-of-confidence/
-test_url: http://bits.blogs.nytimes.com/2012/01/16/wikipedia-plans-to-go-dark-on-wednesday-to-protest-sopa/ \ No newline at end of file
diff --git a/data/GrabberConfig/.blogspot.com.txt b/data/GrabberConfig/.blogspot.com.txt
deleted file mode 100644
index d04b7683..00000000
--- a/data/GrabberConfig/.blogspot.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-date: //*[contains(@class, 'date-header')]
-title://*[contains(@class,'post-title')]
-body://div[contains(@class,'post-body')]
-body://div[contains(@class,'entry-content')]
-strip_comments:no
-prune:no
-
-tidy:yes
-
-test_url: http://themerryone.blogspot.com/2010/08/new-move-new-blog.html
-test_url: http://strobist.blogspot.com/2012/01/qa-down-phase-one-rabbit-hole.html \ No newline at end of file
diff --git a/data/GrabberConfig/.businessinsider.com.txt b/data/GrabberConfig/.businessinsider.com.txt
deleted file mode 100644
index 43aede21..00000000
--- a/data/GrabberConfig/.businessinsider.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title://div[@class="sl-layout-post"]/h1
-body: //div[contains(@class, 'post-content') or contains(@class, 'KonaBody')]
-strip: //div[contains(@class, "post-sidebar")]
-strip: //div[@id='related-links']
-author://div[@class="byline"]/a
-date://div[@class="byline"]/span[@class="date"]
-prune: no
-
-test_url: http://www.businessinsider.com/as-europe-booms-on-bailout-deal-john-boehner-just-confirmed-that-the-us-is-nowhere-2011-7 \ No newline at end of file
diff --git a/data/GrabberConfig/.calepin.co.txt b/data/GrabberConfig/.calepin.co.txt
deleted file mode 100644
index 6b3d0107..00000000
--- a/data/GrabberConfig/.calepin.co.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //address/a
-date: //article/abbr/@title
-
-# Please consider *.calepin.co
-test_url: http://jokull.calepin.co/nutrition-pt-1.html \ No newline at end of file
diff --git a/data/GrabberConfig/.chicagotribune.com.txt b/data/GrabberConfig/.chicagotribune.com.txt
deleted file mode 100644
index 55a9ed2f..00000000
--- a/data/GrabberConfig/.chicagotribune.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-date: //span[@class='pubdate']
-author: //div[@id='mod-article-byline']/span[3]
-body: //div[@id='area-article-first-block'] | //div[@id='mod-a-body-after-first-para']
-strip_id_or_class: byline
-
-strip: //div[@id='mod-article-byline']
-
-test_url: http://www.chicagotribune.com/classified/automotive/used/chi-auto-refinance-pros-cons-20130513,0,4116070.story
diff --git a/data/GrabberConfig/.cnet.com.txt b/data/GrabberConfig/.cnet.com.txt
deleted file mode 100644
index eac08aaa..00000000
--- a/data/GrabberConfig/.cnet.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[contains(@class, 'postBody')]
-date: //div[@id='nameAndTime']/time
-author: //div[@id='nameAndTime']/span[@class='author']
-
-strip_id_or_class: image-credit
-strip_id_or_class: noAutolink
-strip_id_or_class: related
-
-prune: no
-tidy: no
-
-# early end
-replace_string(Download today's podcast</a>): Download today's podcast</a></div></body></html>
-
-test_url: http://www.cnet.com/8301-13952_1-57367607-81/the-404-981-where-the-world-is-a-vampire-podcast/ \ No newline at end of file
diff --git a/data/GrabberConfig/.craigslist.org.txt b/data/GrabberConfig/.craigslist.org.txt
deleted file mode 100644
index a39aa35e..00000000
--- a/data/GrabberConfig/.craigslist.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h2[@class='postingtitle']
-date: //p[@class='postinginfo']/date
-
-body: //figure[@class='iw'] | //section[@class='cltags' or @id='postingbody']
-prune: no
-tidy: no
-
-test_url: http://sfbay.craigslist.org/hhh/index.rss \ No newline at end of file
diff --git a/data/GrabberConfig/.ctv.ca.txt b/data/GrabberConfig/.ctv.ca.txt
deleted file mode 100644
index e12fc65a..00000000
--- a/data/GrabberConfig/.ctv.ca.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h3[@class='jhl']
-body: //div[@class='storyBody']
-strip: //p[contains(., 'Please Add Comments')]//following-sibling::*
-strip: //p[contains(., 'Please Add Comments')]
-strip: //p[em[contains(., 'This story has been updated from its original version')]]
-strip: //hr
-
-test_url: http://montreal.ctv.ca/servlet/an/local/CTVNews/20110914/mtl_construction_110914/20110915?hub=MontrealHome \ No newline at end of file
diff --git a/data/GrabberConfig/.dreamwidth.org.txt b/data/GrabberConfig/.dreamwidth.org.txt
deleted file mode 100644
index 726e30d6..00000000
--- a/data/GrabberConfig/.dreamwidth.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Please convert this to *.dreamwidth.org, as users receive individual subdomains.
-convert_double_br_tags: yes
-strip_image_src: 'dreamwidth.org'
-strip_id_or_class: 'currents'
-title: //div[contains(@id, 'entrysubj')]
-body: //div[contains(@class, 'usercontent')]
-test_url: http://dw-news.dreamwidth.org/28922.html \ No newline at end of file
diff --git a/data/GrabberConfig/.dxy.cn.txt b/data/GrabberConfig/.dxy.cn.txt
deleted file mode 100644
index d567b66f..00000000
--- a/data/GrabberConfig/.dxy.cn.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id='content']
-prune: no
-
-test_url: http://neurosurg.dxy.cn/article/87224 \ No newline at end of file
diff --git a/data/GrabberConfig/.elpais.com.txt b/data/GrabberConfig/.elpais.com.txt
deleted file mode 100644
index 0e7eebc3..00000000
--- a/data/GrabberConfig/.elpais.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //meta[@name='DC.title']/@content
-date: //meta[@name='DC.date']/@content
-body: //div[@class='columna_texto']
-body: //div[@id='cuerpo_noticia']
-prune: no
-
-strip_id_or_class: disposicion_vertical
-strip_id_or_class: ampliar_foto
-
-strip: //div[starts-with(@id, 'sumario') and contains(., 'más información')]
-
-test_url: http://economia.elpais.com/economia/2012/02/07/actualidad/1328611790_342868.html
-test_url: http://internacional.elpais.com/internacional/2012/02/07/actualidad/1328602145_448315.html \ No newline at end of file
diff --git a/data/GrabberConfig/.etc.se.txt b/data/GrabberConfig/.etc.se.txt
deleted file mode 100644
index e2cb033c..00000000
--- a/data/GrabberConfig/.etc.se.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[contains(@class, '-body-')]
-date: //meta[@name='dcterms.date']/@content
-author: //meta[@name='dcterms.creator']/@content
-
-test_url: http://stockholm.etc.se/debatt/jobbgaraget-gav-hopp-ungdomar-i-tensta
-test_contains: Jobbgaraget startades av Angeles
-
-test_url: http://goteborg.etc.se/inrikes/snart-oppnar-stans-forsta-ekogalleria
-test_contains: Krasnapolsky och just nu
diff --git a/data/GrabberConfig/.ew.com.txt b/data/GrabberConfig/.ew.com.txt
deleted file mode 100644
index c4b886f0..00000000
--- a/data/GrabberConfig/.ew.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-next_page_link: //span[@class='paging-next']/a[contains(., 'NEXT')]
-strip_id_or_class: article-paging
-strip_id_or_class: eyebrow
-strip_id_or_class: underbar
-strip_id_or_class: extras
-strip_id_or_class: share
-strip_id_or_class: recap-links
-strip_id_or_class: tvr-author
-strip_id_or_class: pub-date
-strip_id_or_class: post-title
-
-title: //h1[@class='post-title']
-
-test_url: http://tvrecaps.ew.com/recap/fringe-season-4-episode-2/ \ No newline at end of file
diff --git a/data/GrabberConfig/.finance.yahoo.com.txt b/data/GrabberConfig/.finance.yahoo.com.txt
deleted file mode 100644
index a10b86cd..00000000
--- a/data/GrabberConfig/.finance.yahoo.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //meta[@property='og:title']/@content
-body: //div[@id='y-article-bd']
-body: //div[contains(@class, 'yom-art-content')]
-strip: //div[contains(@class, 'related-companies')]
-strip: //div[@id='y-article-related']
-strip: //div[@id='ypf-article-related']
-prune: no
-
-single_page_link: //div[@class='ft']//a[contains(@href, 'page=all')]
-
-test_url: https://sg.finance.yahoo.com/news/former-xstrata-bosss-venture-raises-095622450.html
-test_contains: The former boss of mining company Xstrata
diff --git a/data/GrabberConfig/.fivefilters.org.txt b/data/GrabberConfig/.fivefilters.org.txt
deleted file mode 100644
index dc1db432..00000000
--- a/data/GrabberConfig/.fivefilters.org.txt
+++ /dev/null
@@ -1 +0,0 @@
-prune: no \ No newline at end of file
diff --git a/data/GrabberConfig/.fok.nl.txt b/data/GrabberConfig/.fok.nl.txt
deleted file mode 100644
index e6ad7d52..00000000
--- a/data/GrabberConfig/.fok.nl.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //h1[@class='title']
-body: //div[@id='itemBody']
-
-strip_id_or_class: itemFooter
-
-replace_string(90%;">Lees ook): 0%;"></h3></div></body></html>
-
-tidy: no
-prune: no
-
-http_header(user-agent): Googlebot/2.1
-
-test_url: http://sport.fok.nl/nieuws/548725/1/1/50/rosicky-traint-weer-mee-bij-tsjechie.html \ No newline at end of file
diff --git a/data/GrabberConfig/.hardware.info.txt b/data/GrabberConfig/.hardware.info.txt
deleted file mode 100644
index 82c33790..00000000
--- a/data/GrabberConfig/.hardware.info.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@itemprop='headline']
-author: //span[@itemprop='author']
-body: //article[@itemprop='articleBody']
-date: //span[@itemprop='datePublished']/@content
-
-test_url: http://be.hardware.info/reviews/6197/game-pcs-van-0-25-en-5-jaar-oud-review-tijd-om-te-upgraden
diff --git a/data/GrabberConfig/.ibm.com.txt b/data/GrabberConfig/.ibm.com.txt
deleted file mode 100644
index 2e0a6832..00000000
--- a/data/GrabberConfig/.ibm.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# this config useful for the jive forum part of the ibm site. would probably work on any like jive forum
-# suggest URL path filter of "*.ibm.com/developerworks/forums/*"
-title://h1
-body://div[@id='jive-message-holder']
-strip_id_or_class:jive-first
-strip_id_or_class:jive-buttons
-strip_id_or_class:jive-description
-strip_id_or_class:jive-rating-buttons
-strip_id_or_class:jive-message-list-footer
-
-test_url: http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14547837&tstart=0#14547837
diff --git a/data/GrabberConfig/.ifeng.com.txt b/data/GrabberConfig/.ifeng.com.txt
deleted file mode 100644
index f8b7993b..00000000
--- a/data/GrabberConfig/.ifeng.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Please change host to *.ifeng.com
-# same config works well on other subdomains
-# tested on following links
-# http://phtv.ifeng.com/program/qqsrx/detail_2012_11/28/19613849_0.shtml
-# http://finance.ifeng.com/news/corporate/20121128/7359279.shtml
-
-tidy:no
-
-title://h1[contains(@id,'artical_topic')]
-
-body://div[contains(@id,'artical_real')]
-
-next_page_link://*[contains(@id,'pagenext')]
-test_url: http://news.ifeng.com/history/zhongguojindaishi/detail_2012_04/01/13605159_0.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/.livejournal.com.txt b/data/GrabberConfig/.livejournal.com.txt
deleted file mode 100644
index 551ace47..00000000
--- a/data/GrabberConfig/.livejournal.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //title
-strip_image_src: 'l-stat.livejournal.com'
-strip_image_src: 'www.livejournal.com'
-strip_image_src: 'l-userpic.livejournal.com'
-test_url: http://news.livejournal.com/136664.html
-test_url: http://stelazin.livejournal.com/91363.html \ No newline at end of file
diff --git a/data/GrabberConfig/.m.wikihow.com.txt b/data/GrabberConfig/.m.wikihow.com.txt
deleted file mode 100644
index 5be49fe1..00000000
--- a/data/GrabberConfig/.m.wikihow.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# ...&printable=yes
-body: //div[@id='bodycontents']
-# m.wikihow.com/...
-body: //div[@id='article']
-prune: no
-tidy: no
-strip_id_or_class: gatEditSection
-strip_id_or_class: relatedwikihows
-#strip: //div[contains(@class, 'step_num')]
-
-replace_string(<script ): <div style="display: none"
-replace_string(</script>): </div>
-
-single_page_link: //a[@id='gatPrintView']
-single_page_link: concat(//link[@rel='canonical']/@href, '?printable=yes')
-
-test_url: http://pt.m.wikihow.com/Criar-um-Script-de-Login-Seguro-em-PHP-e-MySQL \ No newline at end of file
diff --git a/data/GrabberConfig/.metafilter.com.txt b/data/GrabberConfig/.metafilter.com.txt
deleted file mode 100644
index 3b4e121b..00000000
--- a/data/GrabberConfig/.metafilter.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[contains(@class, 'copy') or contains(@class, 'comments')]
-strip_id_or_class: related
-strip_id_or_class: whitesmallcopy
-strip: //a[. = 'Subscribe']
-strip: //h1/span[@class = 'smallcopy']
-strip: //a[@class = 'skip']
-strip: //div[@id = 'logo']
-strip: //div[contains(@class, 'comments') and contains(., 'You are not currently logged in')]
-test_url: http://ask.metafilter.com/159539/Connect-ZERO-I-feel-like-an-idiot \ No newline at end of file
diff --git a/data/GrabberConfig/.mozilla.org.txt b/data/GrabberConfig/.mozilla.org.txt
deleted file mode 100644
index 091aa76c..00000000
--- a/data/GrabberConfig/.mozilla.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip_id_or_class: comments
-prune: no
-date: //p[@class="entry-posted"]//abbr[@class="published"]/@title
-
-test_url: https://hacks.mozilla.org/2013/05/how-to-spread-the-word-about-your-code/ \ No newline at end of file
diff --git a/data/GrabberConfig/.myjoyonline.com.txt b/data/GrabberConfig/.myjoyonline.com.txt
deleted file mode 100644
index 9ce947fc..00000000
--- a/data/GrabberConfig/.myjoyonline.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[@id='story_photo'] | //span[@class='story_text_1']
-
-prune: no
-
-test_url: http://business.myjoyonline.com/pages/news/201202/81349.php \ No newline at end of file
diff --git a/data/GrabberConfig/.news.yahoo.com.txt b/data/GrabberConfig/.news.yahoo.com.txt
deleted file mode 100644
index 84ea85e2..00000000
--- a/data/GrabberConfig/.news.yahoo.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class='headline']
-body: //cite[contains(@class,'byline')] | //div[contains(@class,'yom-art-content')]
-strip: //cite/abbr
-tidy: no
-
-test_url: http://ca.news.yahoo.com/cold-la-nina-winter-forecast-west-coast-183535067.html \ No newline at end of file
diff --git a/data/GrabberConfig/.nytimes.com.txt b/data/GrabberConfig/.nytimes.com.txt
deleted file mode 100644
index 78096d59..00000000
--- a/data/GrabberConfig/.nytimes.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-strip: //*[@id='insideNYTimesScrollWrapper'] | //*[contains(@class, 'articleInline')]
-single_page_link: //li[@class='singlePage']/a
-test_url: http://www.nytimes.com/2010/07/13/science/13gravity.html?_r=1&amp;pagewanted=print
-test_url: http://www.nytimes.com/2011/05/15/world/middleeast/15prince.html?_r=1&hp \ No newline at end of file
diff --git a/data/GrabberConfig/.onliner.by.txt b/data/GrabberConfig/.onliner.by.txt
deleted file mode 100644
index 84470050..00000000
--- a/data/GrabberConfig/.onliner.by.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //*[contains(@class, 'b-posts-1-item__title')]
-body: //figure[contains(@class, 'b-posts-1-item__image')] | //div[contains(@class, 'b-posts-1-item__text')]
-date: //article//time/@datetime
-
-tidy: no
-prune: no
-
-test_url: http://tech.onliner.by/feed
-test_url: http://tech.onliner.by/2014/04/24/the-amazing-spider-man-2 \ No newline at end of file
diff --git a/data/GrabberConfig/.orf.at.txt b/data/GrabberConfig/.orf.at.txt
deleted file mode 100644
index 9eb29c3d..00000000
--- a/data/GrabberConfig/.orf.at.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-single_page_link: //div[@id='ss-storyText']//p[@class='readMore']/a
-single_page_link: //div[@id='ss-storyText']//p[contains(., 'Mehr dazu')]/a
-
-title: substring-before(//title,' - ')
-body: //div[@id="ss-storyText"]
-author: substring-before(//div[@id="ss-storyText"]//p[contains(text(), ', ORF.at')], ', ORF.at')
-strip: //div[@id="ss-storyText"]//p[contains(text(), ', ORF.at')]
-date: substring-after(//div[@class='storyMeta socialshare']//p[@class='date'],'Publiziert am')
-strip: //p[@class='date']
-
-strip: //p[@class='credit']
-strip: //p[@class='toplink']
-strip: //div[@id="ss-storyText"]/h1
-strip: //div[@class='socialButtons']
-strip: //div[@class='storyMeta socialshare']
-strip: //div[@class='socialShareWrapper']
-strip: //div[@id='socialshareprivacy']
-strip: //div[@class='storyMeta']
-strip: //div[@class='remote']
-
-prune: no
-tidy: no
-
-test_url: http://orf.at/stories/2317355/
-test_url: http://orf.at/stories/2084731/
-test_url: http://orf.at/stories/2317313/2317311/
-test_url: http://wien.orf.at/news/stories/2746414/
-test_url: http://ooe.orf.at/news/stories/2750613/
-test_url: http://science.orf.at/stories/2774991/
-test_url: http://orf.at/stories/2339962/
-test_url: http://orf.at/stories/2339958/
-test_url: http://help.orf.at/stories/1770242/
diff --git a/data/GrabberConfig/.peacefmonline.com.txt b/data/GrabberConfig/.peacefmonline.com.txt
deleted file mode 100644
index 165c6925..00000000
--- a/data/GrabberConfig/.peacefmonline.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //img[contains(@src, "photos")] | //span[@class='peace_content_text_1']
-strip_image_src: photos/gallery
-
-test_url: http://news.peacefmonline.com/pages/news/201410/219134.php
-test_contains: Fortune Alimi, the Editor of the Daily Guide Newspaper
diff --git a/data/GrabberConfig/.reuters.com.txt b/data/GrabberConfig/.reuters.com.txt
deleted file mode 100644
index 74118ece..00000000
--- a/data/GrabberConfig/.reuters.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@id='maincontent']//h1
-body: //div[@id='resizeableText']
-
-single_page_link: concat(//link[@rel='canonical']/@href, '?sp=true')
-
-test_url: http://cn.reuters.com/article/CNAnalysesNews/idCNKBS0FF0NM20140710
-test_url: http://cn.reuters.feedsportal.com/CNAnalysesNews
-# multipage link
-test_url: http://cn.reuters.com/article/idCNKBS0FF0UL20140710
-test_url: http://br.reuters.com/article/topNews/idBRKBN0JN1D420141209
-test_contains: Em 2015 a tendência é que
diff --git a/data/GrabberConfig/.slashdot.org.txt b/data/GrabberConfig/.slashdot.org.txt
deleted file mode 100644
index a035e2d1..00000000
--- a/data/GrabberConfig/.slashdot.org.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //span[starts-with(@id, 'title-')]
-
-body: //div[starts-with(@id, 'fhbody-')]
-
-prune: no
-tidy: no
-
-http_header(user-agent): PHP/5.3
-
-# follow first link
-#single_page_link: (//div[starts-with(@id, 'fhbody-')]//a[contains(@href, '://')])[1]
-
-test_url: http://apple.slashdot.org/story/13/03/21/1736239/new-os-x-trojan-adware-injects-ads-into-chrome-firefox-safari
-test_url: http://developers.slashdot.org/story/13/03/23/1426215/will-donglegate-affect-your-decision-to-attend-pycon
-# feed URL
-test_url: http://rss.slashdot.org/Slashdot/slashdot
diff --git a/data/GrabberConfig/.smashingmagazine.com.txt b/data/GrabberConfig/.smashingmagazine.com.txt
deleted file mode 100644
index 91c39a12..00000000
--- a/data/GrabberConfig/.smashingmagazine.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title://article[contains(@id, "post-")]/h2
-author://ul[@class="postmetadata clearfix"]/li[@class="author"]
-date://ul[@class="postmetadata clearfix"]/li[@class="date"]
-body://article[contains(@id, "post-")]
-strip://div[@class="ad ed"]
-prune:yes
-test_url: http://wp.smashingmagazine.com/2012/11/08/complete-guide-custom-post-types/ \ No newline at end of file
diff --git a/data/GrabberConfig/.stanford.edu.txt b/data/GrabberConfig/.stanford.edu.txt
deleted file mode 100644
index 96490315..00000000
--- a/data/GrabberConfig/.stanford.edu.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@id='aueditable']/h1
-body: //div[@id='content']
-strip: //div[@id='message' or @id='linklist']
-prune: no
-test_url: http://plato.stanford.edu/entries/supervenience/ \ No newline at end of file
diff --git a/data/GrabberConfig/.thueringer-allgemeine.de.txt b/data/GrabberConfig/.thueringer-allgemeine.de.txt
deleted file mode 100644
index 77d5a51c..00000000
--- a/data/GrabberConfig/.thueringer-allgemeine.de.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@class='qp_headline']/h1
-body: //div[contains(@class, 'article')]//div[@class='qp_text']
-prune: no
-
-strip: //div[@id='_DetailPortlet_WAR_queport_zgtperson']
-strip: //div[@class='qp_embedded']
-
-test_url: http://apolda.thueringer-allgemeine.de/web/apolda/startseite/detail/-/specific/Neue-Superknolle-beim-Heichelheimer-Kartoffelfest-praemiert-447764498 \ No newline at end of file
diff --git a/data/GrabberConfig/.time.com.txt b/data/GrabberConfig/.time.com.txt
deleted file mode 100644
index 40ee26f8..00000000
--- a/data/GrabberConfig/.time.com.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-date: //meta[@name='date']/@content
-author: //meta[@name='byline']/@content
-date: //span[@class = 'date']
-title: //div[@id='print']//h1
-title: //h1[@class="entry-title"]
-body: //article//div[contains(@class,'entry-content')]
-strip: //div[@class='more-ways']
-strip: //div[@id = 'stayConnected']
-strip: //p[child::a[@rel = 'bookmark']]
-strip: //p[starts-with(string(.),'(MORE:')]
-strip: //p[starts-with(string(.),'(PHOTOS:')]
-strip: //aside
-#move_into(//p[../@class = 'entry-content'][position() = last()])://div[@id = 'featbox']
-prune: no
-
-replace_string(<noscript>): <div>
-replace_string(</noscript>): </div>
-
-
-strip: //div[@id='print']//div[contains(@class, 'thumbnail')]
-
-single_page_link: //footer//a[contains(@href, '/printout/')]
-
-test_url: http://content.time.com/time/specials/packages/article/0,28804,2094921_2094923_2094924,00.html
-test_url: http://healthland.time.com/2011/07/24/amy-winehouse-and-the-pain-of-addiction/
-test_url: http://nation.time.com/2013/09/17/navy-yard-shooter-had-been-treated-for-mental-health-problems/ \ No newline at end of file
diff --git a/data/GrabberConfig/.tweakblogs.net.txt b/data/GrabberConfig/.tweakblogs.net.txt
deleted file mode 100644
index 784586cc..00000000
--- a/data/GrabberConfig/.tweakblogs.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class="article"]
-author: //p[@class="author"]/a
-
-test_url: http://harryl.tweakblogs.net/blog/11988/voorstellen
diff --git a/data/GrabberConfig/.usinenouvelle.com.txt b/data/GrabberConfig/.usinenouvelle.com.txt
deleted file mode 100644
index 380f2724..00000000
--- a/data/GrabberConfig/.usinenouvelle.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[contains(concat(' ',normalize-space(@class),' '),' articleTitre ')]
-body: //div[contains(concat(' ',normalize-space(@class),' '),' articleBrut ')]
-date: //span[contains(concat(' ',normalize-space(@class),' '),' articleAuteurDate')]//time
-author: //span[contains(concat(' ',normalize-space(@class),' '),' articleAuteurDate')]//span/a
-prune: no
-
-test_url: http://www.usinenouvelle.com/article/froid-devant.N321392
diff --git a/data/GrabberConfig/.wikihow.com.txt b/data/GrabberConfig/.wikihow.com.txt
deleted file mode 100644
index 01b3afd4..00000000
--- a/data/GrabberConfig/.wikihow.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# ...&printable=yes
-body: //div[@id='bodycontents']
-prune: no
-tidy: no
-strip_id_or_class: gatEditSection
-strip_id_or_class: relatedwikihows
-#strip: //div[contains(@class, 'step_num')]
-
-replace_string(<script ): <div style="display: none"
-replace_string(</script>): </div>
-
-single_page_link: //a[@id='gatPrintView']
-single_page_link: concat(//link[@rel='canonical']/@href, '?printable=yes')
-
-test_url: http://pt.wikihow.com/Criar-um-Script-de-Login-Seguro-em-PHP-e-MySQL
-test_url: http://m.wikihow.com/Check-out-a-Used-Car-Before-Buying-It \ No newline at end of file
diff --git a/data/GrabberConfig/.wikimedia.org.txt b/data/GrabberConfig/.wikimedia.org.txt
deleted file mode 100644
index ff990c2c..00000000
--- a/data/GrabberConfig/.wikimedia.org.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h1[@id='firstHeading']
-body: //div[@id = 'bodyContent']
-strip_id_or_class: editsection
-strip_id_or_class: toc
-strip_id_or_class: vertical-navbox
-strip: //div[@id='catlinks']
-strip: //div[@id='jump-to-nav']
-strip: //div[@class='thumbcaption']//div[@class='magnify']
-strip: //table[@class='navbox']
-prune: no
-tidy: no
-test_url: https://secure.wikimedia.org/wikipedia/en/wiki/Christopher_Lloyd \ No newline at end of file
diff --git a/data/GrabberConfig/.wikipedia.org.txt b/data/GrabberConfig/.wikipedia.org.txt
deleted file mode 100644
index 1da400bc..00000000
--- a/data/GrabberConfig/.wikipedia.org.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-title: //h1[@id='firstHeading']
-body: //div[@id = 'bodyContent']
-strip_id_or_class: editsection
-#strip_id_or_class: toc
-strip_id_or_class: vertical-navbox
-strip: //*[@id='toc']
-strip: //div[@id='catlinks']
-strip: //div[@id='jump-to-nav']
-strip: //div[@class='thumbcaption']//div[@class='magnify']
-strip: //table[@class='navbox']
-#strip: //table[contains(@class, 'infobox')]
-strip: //div[@class='dablink']
-strip: //div[@id='contentSub']
-strip: //table[contains(@class, 'metadata')]
-strip: //*[contains(@class, 'noprint')]
-strip: //span[@class='noexcerpt']
-
-http_header(user-agent): Mozilla/5.2
-
-prune: no
-tidy: no
-test_url: http://en.wikipedia.org/wiki/Christopher_Lloyd
-test_url: https://en.wikipedia.org/wiki/Ronnie_James_Dio
-test_url: https://en.wikipedia.org/wiki/Metallica \ No newline at end of file
diff --git a/data/GrabberConfig/.wordpress.com.txt b/data/GrabberConfig/.wordpress.com.txt
deleted file mode 100644
index 18fd3623..00000000
--- a/data/GrabberConfig/.wordpress.com.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# try to target content block within div#content
-body: //div[@id="content"]//div[contains(@class, 'entry-content') or contains(@class, 'entrytext') or @class='main' or @class='entry']
-# if that fails, get div#content
-body: //div[@id='content']
-title: //meta[@property='og:title']/@content
-
-date: //div[@id='content']//span[contains(@class, 'entry-date')]
-date: //div[contains(@class, 'entry-meta')]//time[@pubdate or @pubDate]
-author: //div[contains(@class, 'entry-meta')]//a[@rel='author']
-
-prune: no
-
-strip: //nav
-strip: //header
-strip: //*[@id='comments' or @id='respond']
-strip: //div[contains(@class, 'comments')]
-strip_id_or_class: sharedaddy
-strip_id_or_class: wpadvert
-strip_id_or_class: commentlist
-strip_id_or_class: sociable
-strip_id_or_class: related_post
-strip_id_or_class: wp-socializer
-strip_id_or_class: addtoany
-strip: //div[contains(@class, 'navigation')]
-#strip: //iframe
-
-test_url: https://elisehahn.wordpress.com/2013/09/22/looking-back-to-move-forward-navigating-race-and-racism-in-neoliberal-terrain/
diff --git a/data/GrabberConfig/20min.ch.txt b/data/GrabberConfig/20min.ch.txt
deleted file mode 100644
index cd8e3fc0..00000000
--- a/data/GrabberConfig/20min.ch.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-# Author: cirnod@gmail.com
-
-tidy: no
-prune: no
-
-title: //h1
-date: /html/body/div[3]/div[1]/div[6]/div/div[1]/div[2]/div[1]/div/p
-body: //div[@class='published clearfix'] | //div[@class='story_titles']/h3 | //div[@class='story_text']
-
-# General Cleanup
-strip_id_or_class: info_panel
-strip_id_or_class: info_poll
-strip_id_or_class: teaser
-strip_id_or_class: panelbox
-strip_id_or_class: polls
-strip_id_or_class: warning
-strip_id_or_class: vplaceholder
-
-# visual removal only -> complete removal doesn't work
-replace_string(Print</a>): </a>
-
-# Try yourself
-test_url: http://www.20min.ch/wissen/news/story/31588952
-test_url: http://www.20min.ch/digital/dossier/apple/story/So-einfach-laesst-sich-das-iPhone-6-Plus-verbiegen-24651169
diff --git a/data/GrabberConfig/24.ae.txt b/data/GrabberConfig/24.ae.txt
deleted file mode 100644
index 6e515076..00000000
--- a/data/GrabberConfig/24.ae.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@id='DivTitle']
-body: //div[@id='divImages' or @id='Divkhabarcontent']
-author: //div[@id='DivAuthor']
-
-prune: no
-
-test_url: http://24.ae/article.aspx?ArticleId=123304
-test_url: http://24.ae/rss.aspx?pageId=30
diff --git a/data/GrabberConfig/24ways.org.txt b/data/GrabberConfig/24ways.org.txt
deleted file mode 100644
index 86c9e077..00000000
--- a/data/GrabberConfig/24ways.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='meta']/h2/a
-author: //div[@class='meta']/h2/following-sibling::p/a/text()
-date://div[@class='meta']/h2/strong
-body: //div[@id='article']
-strip: //div[@class='domore']
-test_url: http://24ways.org/2011/composing-the-new-canon \ No newline at end of file
diff --git a/data/GrabberConfig/36kr.com.txt b/data/GrabberConfig/36kr.com.txt
deleted file mode 100644
index d73d7de5..00000000
--- a/data/GrabberConfig/36kr.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[contains(@class, 'entry-title')]
-date: //meta[@name='weibo: article:create_at']/@content
-body: //div[contains(@class, 'mainContent')]
-strip_id_or_class: related_topics
-
-prune: no
-
-test_url: http://www.36kr.com/p/207879.html \ No newline at end of file
diff --git a/data/GrabberConfig/37signals.com.txt b/data/GrabberConfig/37signals.com.txt
deleted file mode 100644
index 531cac1e..00000000
--- a/data/GrabberConfig/37signals.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='post_header']//h2/a
-author: //span[@class='author']
-date: //span[@class='date']
-body: //div[@id='Content']
-
-test_url: http://37signals.com/svn/posts/2785-the-end-of-the-it-department \ No newline at end of file
diff --git a/data/GrabberConfig/3quarksdaily.com.txt b/data/GrabberConfig/3quarksdaily.com.txt
deleted file mode 100644
index 80a3958f..00000000
--- a/data/GrabberConfig/3quarksdaily.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@class='content']
-date: //div[@class='content']/h2
-strip: //div[@class='content']/h2
-title: //div[@class='content']/h3
-
-strip: //div[@id='postmenu']
-strip: //div[@class='trackback']
-tidy: no
-test_url: http://www.3quarksdaily.com/3quarksdaily/2012/01/martin-luther-king-i-have-a-dream.html \ No newline at end of file
diff --git a/data/GrabberConfig/3voor12.vpro.nl.txt b/data/GrabberConfig/3voor12.vpro.nl.txt
deleted file mode 100644
index b846b050..00000000
--- a/data/GrabberConfig/3voor12.vpro.nl.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@id='main']
-title: //div[@class='intro']/h1
-author: //ul[@class='text-data']/li[@class='author']
-date: //ul[@class='text-data']/li[@class='date']
-convert_double_br_tags: yes
-tidy: no
-
-strip: //div[@class='share']
-strip: //*[@class='zoom']
-strip: //div[@id='disqus_thread']
-test_url: http://3voor12.vpro.nl/nieuws/2012/januari/Ook-website-GroenLinks-woensdag-op-zwart-i-v-m--SOPA.html \ No newline at end of file
diff --git a/data/GrabberConfig/43folders.com.txt b/data/GrabberConfig/43folders.com.txt
deleted file mode 100644
index 3777c66f..00000000
--- a/data/GrabberConfig/43folders.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //*[@class = 'content']
-author: //*[@class = 'submitted']/a
-date: substring-after(//*[@class = 'submitted']/text(), '|')
-test_url: http://www.43folders.com/2011/04/22/cranking \ No newline at end of file
diff --git a/data/GrabberConfig/500px.com.txt b/data/GrabberConfig/500px.com.txt
deleted file mode 100644
index b9b7e9dd..00000000
--- a/data/GrabberConfig/500px.com.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# very loose setup for both 500px.com/photo/* and 500px.com/blog/*
-# photo page example: http://500px.com/photo/4181666
-# blog page example: http://500px.com/blog/110
-
-# avoid "no text" error
-tidy:no
-prune:no
-
-# reorganize photo page elements
-#body://div[contains(@class,'container')]
-move_into(body)://div[contains(@id,'thephoto')]
-move_into(body)://div[contains(@id,'description')]
-move_into(body)://div[contains(@id,'tags')]
-move_into(body)://div[contains(@id,'photo-info')]
-
-# clean photo page info
-strip://span[contains(@id,'copyright')]
-strip://*[contains(@id,'store')]
-strip://*[contains(@id,'user-info')]
-strip://*[contains(@id,'photo-stats')]
-strip://*[contains(@id,'voting_controls_container')]
-strip://*[contains(@id,'more-photos')]
-strip://*[contains(@id,'embed-photo')]
-
-# clean blog page side bar
-strip://*[contains(@class,'col d3 clearafter')]
-test_url: http://500px.com/photo/3641041?from=editors \ No newline at end of file
diff --git a/data/GrabberConfig/512pixels.net.txt b/data/GrabberConfig/512pixels.net.txt
deleted file mode 100644
index 02a996f7..00000000
--- a/data/GrabberConfig/512pixels.net.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: //meta[@property='og:title']/@content
-test_url: http://www.512pixels.net/blog/2014/10/the-move
diff --git a/data/GrabberConfig/5by5.tv.txt b/data/GrabberConfig/5by5.tv.txt
deleted file mode 100644
index 59b70a99..00000000
--- a/data/GrabberConfig/5by5.tv.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //*[@id="episode"]
-prune: no
-tidy: no
-
-autodetect_next_page: no
-strip_id_or_class: player
-
-strip://*[@id="header"]
-test_url: http://5by5.tv/buildanalyze/60 \ No newline at end of file
diff --git a/data/GrabberConfig/7newsbelize.com.txt b/data/GrabberConfig/7newsbelize.com.txt
deleted file mode 100644
index 46d09f8e..00000000
--- a/data/GrabberConfig/7newsbelize.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //*[@id='sstitle']
-body: //div[@id='sstory']
-strip_id_or_class: newsoptions
-prune: no
-
-test_url: http://www.7newsbelize.com/sstory.php?nid=25654
-test_url: http://www.7newsbelize.com/7news.xml \ No newline at end of file
diff --git a/data/GrabberConfig/9gag.com.txt b/data/GrabberConfig/9gag.com.txt
deleted file mode 100644
index 4ebb62ad..00000000
--- a/data/GrabberConfig/9gag.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2F9gag.com%2Fgag%2FaDwQnO7
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' badge-post-container ')]
-test_url: http://9gag.com/gag/aDwQnO7
diff --git a/data/GrabberConfig/README.md b/data/GrabberConfig/README.md
deleted file mode 100644
index ab5b12d9..00000000
--- a/data/GrabberConfig/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Full-Text RSS site config files
-================
-
-[Full-Text RSS](http://fivefilters.org/content-only/), our article extraction tool, makes use of site-specific extraction rules to improve results. Each time a URL is processed, it checks to see if there are extraction rules for the site being processed. If there are no rules are found, it tries to detect the content block automatically.
-
-This repository contains the site-specific extraction rules we rely on in Full-Text RSS.
-
-### Contributing changes
-
-We run automated tests on these files to detect issues. If you'd like to help keep these up to date, please look at the [test results](http://siteconfig.fivefilters.org/test/) and see which files you'd like to contribute fixes for.
-
-We chose GitHub for this set of files because they offer one feature which we hope will make contributing changes easier: [file editing](https://github.com/blog/844-forking-with-the-edit-button) through the web interface.
-
-You can now make changes to any of our site config files and request that your changes be pulled into the main set we maintain. This is what GitHub calls the Fork and Pull model:
-
-> The Fork & Pull Model lets anyone fork an existing repository and push changes to their personal fork without requiring access be granted to the source repository. The changes must then be pulled into the source repository by the project maintainer. This model reduces the amount of friction for new contributors and is popular with open source projects because it allows people to work independently without upfront coordination.
-
-When we receive a pull request we'll review the changes and if everything's okay we'll update our copy.
-
-If a site is not in our set, you can create a file for it in the same way. See [Creating files on GitHub](https://github.com/blog/1327-creating-files-on-github).
-
-### How to write a site config file
-
-The quickest and simplest way is to use our [point-and-click interface](http://siteconfig.fivefilters.org). It's a simple tool only intended to create a rule to extract the correct content block.
-
-For further refinements, e.g. selecting the title, stripping elements, dealing with multi-page articles, please see our [help page](http://help.fivefilters.org/customer/portal/articles/223153-site-patterns).
-
-### Instapaper
-
-When we introduced site patterns, we chose to adopt the [same format](http://blog.instapaper.com/post/730281947) used by Instapaper. This allows us to make use of the existing extraction rules contributed by Instapaper users.
-
-Marco, Instapaper's creator, graciously opened up the database of contributions to everyone:
-
-> And, recognizing that your efforts could be useful to a wide range of other tools and services, I'll make the list of all of these site-specific configurations available to the public, free, with no strings attached.
-
-Most of the extraction rules in our set are borrowed from Instapaper. You can see the list maintained by Instapaper at [instapaper.com/bodytext/](http://instapaper.com/bodytext/) (no longer available since Instapaper was sold).
-
-### Testing site config files
-
-Currently you will have to have a copy of Full-Text RSS to test changes to the site config files. In the future we will try to make this process easier.
diff --git a/data/GrabberConfig/aachener-nachrichten.de.txt b/data/GrabberConfig/aachener-nachrichten.de.txt
deleted file mode 100644
index b60c15de..00000000
--- a/data/GrabberConfig/aachener-nachrichten.de.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //meta[@property='og:title']/@content
-body: //*[@class='fliesstext_detail' or @class='detail_fliesstext'] | //img[@itemprop="image" and starts-with(@src, "/sixcms/media.php/")]
-
-strip_id_or_class: socialshareprivacy1
-strip_id_or_class: zvaFacebookButton
-
-tidy: no
-prune: no
-
-test_url: http://www.aachener-nachrichten.de/lokales/aachen-detail-an/2517757 \ No newline at end of file
diff --git a/data/GrabberConfig/abc-luxe.com.txt b/data/GrabberConfig/abc-luxe.com.txt
deleted file mode 100644
index 7c8f859f..00000000
--- a/data/GrabberConfig/abc-luxe.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[contains(concat(' ',normalize-space(@class),' '),' brandMarginT ')]//h1
-body: //div[contains(concat(' ',normalize-space(@class),' '),' article ')]
-
-test_url: http://www.abc-luxe.com/actus/produits/article/kenzo-world-une-campagne-dejantee-pour-le-premier-parfum-signe-carol-lim-et-humberto-leon
diff --git a/data/GrabberConfig/abc.es.txt b/data/GrabberConfig/abc.es.txt
deleted file mode 100644
index 43aadc49..00000000
--- a/data/GrabberConfig/abc.es.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //meta[@property='og:title']/@content
-body: //div[@class='datosi' or @class='date' or @class='photo-alt1' or @class='text' or @itemprop='articleBody']
-strip_id_or_class: colB
-
-prune: no
-
-test_url: http://www.abc.es/20120209/tv-series/abci-house-ultima-temporada-201202090936.html \ No newline at end of file
diff --git a/data/GrabberConfig/abc.net.au.txt b/data/GrabberConfig/abc.net.au.txt
deleted file mode 100644
index 22b3a0f4..00000000
--- a/data/GrabberConfig/abc.net.au.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: //div[@class='article section']//h1
-author: //div[@class="byline"]/a
-date: //span[@class="timestamp"]
-body: //div[@class="page section"]
-
-strip: //a[@class="inline-caption"]
-strip: //p[@class="ticker section noprint"]
-strip: //p[@class="topics"]
-strip: //h1
-strip: //div[@class="byline"]
-strip: //p[@class="published"]
-strip: //div[contains(@class,"featured-scroller")]
-strip_id_or_class: footer
-
-tidy: no
-
-test_url: http://www.abc.net.au/news/2013-03-27/open-speed-highways-change-clp-giles/4597892
-test_url: http://www.abc.net.au/news/2013-04-30/credit-growth-remains-subdued/4660054?section=business
diff --git a/data/GrabberConfig/abcnews.go.com.txt b/data/GrabberConfig/abcnews.go.com.txt
deleted file mode 100644
index 8d367351..00000000
--- a/data/GrabberConfig/abcnews.go.com.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-title: //h1[@class='headline']
-body: //div[@id='storyText']
-# for video entries
-body: //img[@id='ff-img'] | //div[@id='meta']//div[contains(@class, 'overview')]
-author: //div[@class='byline']
-date: //div[@class='date']
-strip: //*[@id='date_partner']
-
-strip: //div[@class='breadcrumb']
-strip: //div[contains(@class,'show_tools')]
-strip: //div[@id='sponsoredByAd']
-strip: //div[contains(@class,'rel_container')]
-strip: //p[a[starts-with(@href, 'http://www.twitter.com')]]
-strip: //p[a[starts-with(@href, 'http://www.facebook.com')]]
-strip: //p[contains(., 'Click here to return to')]
-#strip_id_or_class: media
-strip_id_or_class: mediaplayer
-
-replace_string(<link rel="image_src" href="http): <img id="ff-img" src="http
-
-prune: no
-
-single_page_link: concat(//li[@class='pager']//a/@href, '&singlePage=true')
-
-test_url: http://abcnews.go.com/Politics/newt-gingrich-rocky-rollout-presidential-campaign-recover/story?id=13632744
-# multi-page
-test_url: http://abcnews.go.com/Blotter/family-freed-american-hostage-somalia-seals-obama/story?id=15439544 \ No newline at end of file
diff --git a/data/GrabberConfig/accesstoinsight.org.txt b/data/GrabberConfig/accesstoinsight.org.txt
deleted file mode 100644
index 45d66533..00000000
--- a/data/GrabberConfig/accesstoinsight.org.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='H_docTitle']
-
-body: //div[@id='H_meta' or @id='H_content' or @id='F_footer']
-
-strip_id_or_class: F_toenail
-
-prune: no
-
-test_url: http://www.accesstoinsight.org/lib/authors/nyanaponika/wheel026.html \ No newline at end of file
diff --git a/data/GrabberConfig/acidcow.com.txt b/data/GrabberConfig/acidcow.com.txt
deleted file mode 100644
index 21958651..00000000
--- a/data/GrabberConfig/acidcow.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[starts-with(@id, 'news-id-')]
-
-test_url: http://acidcow.com/fun/20933-acid-picdump-83-pics.html \ No newline at end of file
diff --git a/data/GrabberConfig/aclu.org.txt b/data/GrabberConfig/aclu.org.txt
deleted file mode 100644
index 74236e2d..00000000
--- a/data/GrabberConfig/aclu.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='panel-panel panel-main-3 content-column']
-title: //div[@class='panel-pane pane-node-title']
-date: //div[@class='updated-date']
-
-test_url: https://www.aclu.org/blog/free-future/chinas-nightmarish-citizen-scores-are-warning-americans
diff --git a/data/GrabberConfig/acquia.com.txt b/data/GrabberConfig/acquia.com.txt
deleted file mode 100644
index 2803611f..00000000
--- a/data/GrabberConfig/acquia.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title://h1[@class="title"]
-author://div[@class="submitted"]/span/a
-date://div[@class="submitted"]/span
-body://div[@class="content-wrapper"]
-
-strip://div[@id="skip-link"]
-strip://div[@id="region-content-3-3"]
-strip://div[@id="section-footer"]
-test_url: https://www.acquia.com/blog/drupals-long-warmth-toward-third-party-code \ No newline at end of file
diff --git a/data/GrabberConfig/acroswing.fr.txt b/data/GrabberConfig/acroswing.fr.txt
deleted file mode 100644
index 6b1d67fe..00000000
--- a/data/GrabberConfig/acroswing.fr.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-tidy:no
-date: //time[@class='updated']
-dissolve: //ul[@class='video-gallery']/li
-dissolve: //ul[@class='video-gallery']
-test_url: http://www.acroswing.fr/actualites/competition_rock/selectif_bellegarde_sur_valserine__2012-02-26.php \ No newline at end of file
diff --git a/data/GrabberConfig/ad.nl.txt b/data/GrabberConfig/ad.nl.txt
deleted file mode 100644
index 422faa57..00000000
--- a/data/GrabberConfig/ad.nl.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-#bypass cookie check
-single_page_link: //a[contains(@href, '/acceptCookieCheck.do?url=')]
-
-test_url: http://www.ad.nl/ad/nl/10444/Offside/article/detail/4043834/2015/05/31/Dani-Alves-voetbalt-met-drol-op-zijn-hoofd.dhtml
-test_contains: De nieuwe coupe van Alves
-
-test_url: http://www.ad.nl/digitaal/rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/adme.ru.txt b/data/GrabberConfig/adme.ru.txt
deleted file mode 100644
index b929685d..00000000
--- a/data/GrabberConfig/adme.ru.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.adme.ru%2Ftvorchestvo-hudozhniki%2Fprostoj-kak-5-kopeek-hudozhnik-557405%2F
-
-body: //article[contains(concat(' ',normalize-space(@class),' '),' article ')]
-test_url: http://www.adme.ru/tvorchestvo-hudozhniki/prostoj-kak-5-kopeek-hudozhnik-557405/
diff --git a/data/GrabberConfig/aftenposten.no.txt b/data/GrabberConfig/aftenposten.no.txt
deleted file mode 100644
index 8a69c357..00000000
--- a/data/GrabberConfig/aftenposten.no.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1[@class='articleTitle ']
-body: //div[@class='bodyText widget storyContent']
-strip: //p/span[@class='quote']/..
-strip_id_or_class: 'pull1'
-test_url: https://www.aftenposten.no/meninger/spaltister/Portrett-av-scenekunstneren-som-ung-mann-7167959.html \ No newline at end of file
diff --git a/data/GrabberConfig/aftonbladet.se.txt b/data/GrabberConfig/aftonbladet.se.txt
deleted file mode 100644
index b6c576a8..00000000
--- a/data/GrabberConfig/aftonbladet.se.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-author: //article//address[contains(@class, 'author')]
-body: //article[.//div[contains(@class, 'abBodyText')]]//*[contains(@class, 'abLeadText') or contains(@class, 'abBodyText') or contains(@class, 'abImageBlock') or contains(@class, 'abIGSatellite')]
-
-strip: //address//img
-strip: //footer
-strip_id_or_class: abSticky
-
-prune: no
-
-test_url: http://www.aftonbladet.se/sportbladet/hockey/sverige/allsvenskan/article17498194.ab
-test_url: http://www.aftonbladet.se/debatt/article16207536.ab
-test_url: http://www.aftonbladet.se/debatt/debattamnen/politik/article17483377.ab
-test_url: http://www.aftonbladet.se/rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/aht.seriouseats.com.txt b/data/GrabberConfig/aht.seriouseats.com.txt
deleted file mode 100644
index b2d88a05..00000000
--- a/data/GrabberConfig/aht.seriouseats.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body: //div[@id='content']
-
-# clean up recipe pages
-strip: //h2[@class='fn'] | //h2[@class='double-lined'] | //h3 | //div[@id='threeColumn2'] | //div[@id='threeColumn3']
-
-#recipe pages
-strip_id_or_class: "recipe-feedback"
-strip_id_or_class: "comments"
-strip_id_or_class: "procedure-number"
-strip_id_or_class: "more-with-author"
-
-#slice
-strip_id_or_class: "inner"
-
-test_url: http://aht.seriouseats.com/archives/2009/12/the-burger-lab-salting-ground-beef.html \ No newline at end of file
diff --git a/data/GrabberConfig/aitnews.com.txt b/data/GrabberConfig/aitnews.com.txt
deleted file mode 100644
index 1b944053..00000000
--- a/data/GrabberConfig/aitnews.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[contains(@class, 'single-post-thumbnail')] | //*[@itemprop="articleBody"]
-
-test_url: http://aitnews.com/2016/04/23/%D8%A7%D9%84%D9%80-fbi-%D9%8A%D8%AE%D8%AA%D8%B1%D9%82-%D9%87%D8%A7%D8%AA%D9%81-%D8%A2%D9%8A%D9%81%D9%88%D9%86-%D8%A2%D8%AE%D8%B1-%D8%AF%D9%88%D9%86-%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A2%D8%A8/
diff --git a/data/GrabberConfig/albayan.ae.txt b/data/GrabberConfig/albayan.ae.txt
deleted file mode 100644
index d52700b3..00000000
--- a/data/GrabberConfig/albayan.ae.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@id='main-column']//div[@class='content']
-
-strip_id_or_class: social-buttons
-
-prune: no
-
-test_url: http://www.albayan.ae/across-the-uae/education/2013-08-29-1.1949645
-test_url: http://www.albayan.ae/1.448?ot=ot.AjaxPageLayout \ No newline at end of file
diff --git a/data/GrabberConfig/alex.mullr.net.txt b/data/GrabberConfig/alex.mullr.net.txt
deleted file mode 100644
index c5f15370..00000000
--- a/data/GrabberConfig/alex.mullr.net.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class="entry"]
-test_url: http://alex.mullr.net/blog/2011/05/on-spotify/ \ No newline at end of file
diff --git a/data/GrabberConfig/alexduner.com.txt b/data/GrabberConfig/alexduner.com.txt
deleted file mode 100644
index 3897f9ec..00000000
--- a/data/GrabberConfig/alexduner.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //section[@class='content']
-date: //span[1]
-author: //h1[@id='sitetitle']
-test_url: http://alexduner.com/blog/something-i-learned-today
diff --git a/data/GrabberConfig/alistapart.com.txt b/data/GrabberConfig/alistapart.com.txt
deleted file mode 100644
index 375f6c5b..00000000
--- a/data/GrabberConfig/alistapart.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[@class='entry-title']
-author: //h2/a[@class='fn']
-date: //time[@itemprop='datePublished']
-
-body: //div[@itemprop='articleBody']
-strip: //aside
-strip_id_or_class: 'aside-breaker'
-
-prune: no
-test_url: http://www.alistapart.com/articles/organizing-mobile/
-test_url: http://alistapart.com/article/all-talk-and-no-buttons-the-conversational-ui
diff --git a/data/GrabberConfig/aljazeera.com.txt b/data/GrabberConfig/aljazeera.com.txt
deleted file mode 100644
index d3bf4014..00000000
--- a/data/GrabberConfig/aljazeera.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //span[@id='DetailedTitle']
-body: //td[@id='tdTextContent']
-strip_id_or_class: Skyscrapper_Body
-date: //span[@id='ctl00_cphBody_lblDate']
-author: //div[@id="dvAuthorInfo"]//a/text()
-strip: //table[ tbody/tr/td/object ]
-prune: no
-test_url: http://www.aljazeera.com/indepth/opinion/2012/01/2012114121925380575.html \ No newline at end of file
diff --git a/data/GrabberConfig/allafrica.com.txt b/data/GrabberConfig/allafrica.com.txt
deleted file mode 100644
index ca20666b..00000000
--- a/data/GrabberConfig/allafrica.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-http_header(user-agent): PHP/7.0
-
-test_url: http://allafrica.com/tools/headlines/rdf/latest/headlines.rdf
diff --git a/data/GrabberConfig/allrecipes.com.txt b/data/GrabberConfig/allrecipes.com.txt
deleted file mode 100644
index 85dc2a5a..00000000
--- a/data/GrabberConfig/allrecipes.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //h1[@id='itemTitle']
-body: //img[@id="ctl00_CenterColumnPlaceHolder_recipe_photoStuff_imgPhoto"] | //div[@id='ctl00_CenterColumnPlaceHolder_recipe_divSubmitter'] | //div[contains(@class, 'recipe-details-content')]
-strip: //div[@class='top-left' or @class='top-right' or @class='bot-left' or @class='bot-right']
-strip: //div[contains(@class, 'rightcoltoolsdiv')]
-strip: //div[contains(@class, 'servings-form')]
-strip: //p[@class='nutritional-information']
-strip: //a[contains(@class, 'nutritional-information') or contains(@class, 'nutritionanchor')]
-strip: //div[@id='nutri-info']/div[contains(@class, 'title')]
-strip: //img[@id='ctl00_CenterColumnPlaceHolder_recipe_imgSubmitter']
-strip_id_or_class: eshaAttribute
-strip_id_or_class: eshaParagraph
-prune: no
-
-test_url: http://allrecipes.com/Recipe/Taco-Pie/Detail.aspx?src=rotd \ No newline at end of file
diff --git a/data/GrabberConfig/allthingsd.com.txt b/data/GrabberConfig/allthingsd.com.txt
deleted file mode 100644
index f8c67d02..00000000
--- a/data/GrabberConfig/allthingsd.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title://div[@class="article-title"]/h1[@class="title"]
-date: //p[@class="article-date"]
-body://div[contains(@class, "article-body")]
-# Trim out related posts at bottom of article
-strip://blockquote[@class="memo"]
-
-tidy: no
-
-# Yup, no idea why author won't work...
-author://div[@class="page-header article-header clearfix"]/p[@class="title"]
-# [Marco:] Author won't work here because the page defines the "home" link under the author's name as rel="author", which always gets priority if the page has defined it.
-test_url: http://allthingsd.com/20120513/exclusive-yahoos-thompson-out-levinsohn-in-board-settlement-with-loeb-nears-completion/
-test_url: http://allthingsd.com/20131010/google-cio-ben-fried-on-how-google-works/ \ No newline at end of file
diff --git a/data/GrabberConfig/allyou.com.txt b/data/GrabberConfig/allyou.com.txt
deleted file mode 100644
index a13a7252..00000000
--- a/data/GrabberConfig/allyou.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@id='pageHdr']//h1
-body: //div[@id='pageHdr']/*[@class='dek'] | //div[@id='printArticle' or @id='slideShowPrint']
-strip: //div[contains(@class, 'infoBox') or @id='infoBox']
-single_page_link: //li[@id='print']/a
-
-prune: no
-
-test_url: http://www.allyou.com/budget-home/money-shopping/freebies-online-00400000066392/ \ No newline at end of file
diff --git a/data/GrabberConfig/alphabeta.argaam.com.txt b/data/GrabberConfig/alphabeta.argaam.com.txt
deleted file mode 100644
index da1a67bc..00000000
--- a/data/GrabberConfig/alphabeta.argaam.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@class = 'entry']
-date: substring-after(//p[@class="date"],'بتاريخ ')
-strip_id_or_class: date
-strip_id_or_class: follow-single
-strip_id_or_class: ratingblock
-strip_id_or_class: newRatingHolder
-strip_id_or_class: postmetadata
-strip_id_or_class: addthis_toolbox
-strip_id_or_class: addthis_default_style
-strip_id_or_class: size-full
-test_url: http://alphabeta.argaam.com/?p=35657 \ No newline at end of file
diff --git a/data/GrabberConfig/alriyadh.com.txt b/data/GrabberConfig/alriyadh.com.txt
deleted file mode 100644
index be7c43d5..00000000
--- a/data/GrabberConfig/alriyadh.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id = "article-view"]
-body: //div[contains(@class, 'article')]//div[contains(@class, 'photo_bg')]
-author: //p[@class = "author"]
-strip: //h1
-strip: //h2
-strip_id_or_class: author
-prune: no
-test_url: http://www.alriyadh.com/2011/10/10/article674357.html
-test_url: http://www.alriyadh.com/net/article/780935 \ No newline at end of file
diff --git a/data/GrabberConfig/alseraj.net.txt b/data/GrabberConfig/alseraj.net.txt
deleted file mode 100644
index 107d82d6..00000000
--- a/data/GrabberConfig/alseraj.net.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: //*[@id='normalfontyellow']
-test_url: http://www.alseraj.net/cgi-bin/pros/av/LeqaTextDisplay.cgi?display&2 \ No newline at end of file
diff --git a/data/GrabberConfig/alternet.org.txt b/data/GrabberConfig/alternet.org.txt
deleted file mode 100644
index e92252eb..00000000
--- a/data/GrabberConfig/alternet.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-single_page_link: //div[contains(@class, 'story_tools')]//a[contains(@href, '/print/')]
-
-test_url: http://www.alternet.org/civil-liberties/noam-chomsky-surveillance-state-beyond-imagination-being-created-one-freest
-test_url: http://feeds.feedblitz.com/alternet \ No newline at end of file
diff --git a/data/GrabberConfig/altfoto.com.txt b/data/GrabberConfig/altfoto.com.txt
deleted file mode 100644
index d974cf4a..00000000
--- a/data/GrabberConfig/altfoto.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://altfoto.com/2011/09/nikon-presenta-su-nuevo-sistema-nikon-1-y-dos-nuevas-camaras \ No newline at end of file
diff --git a/data/GrabberConfig/alumni.stanford.edu.txt b/data/GrabberConfig/alumni.stanford.edu.txt
deleted file mode 100644
index a5bd03bf..00000000
--- a/data/GrabberConfig/alumni.stanford.edu.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1
-
-author: substring-after(//div[@class="enableBullets"]/preceding-sibling::p[1], "By ")
-
-date: //div/a[contains (@href, "issue")]
-
-move_into(//div[@class="enableBullets"]/p): (//div[@id="content"]//img)[1]
-
-body: //div[@class="enableBullets"]
-test_url: http://alumni.stanford.edu/get/page/magazine/article/?article_id=54819 \ No newline at end of file
diff --git a/data/GrabberConfig/amandala.com.bz.txt b/data/GrabberConfig/amandala.com.bz.txt
deleted file mode 100644
index fb0e21b8..00000000
--- a/data/GrabberConfig/amandala.com.bz.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='content']//div[contains(@class, 'content')]
-strip_id_or_class: widget
-strip: //a[contains(@href, 'upm_export=')]
-
-test_url: http://amandala.com.bz/news/feed/
-test_url: http://amandala.com.bz/news/poor-pse-results-30-raise/ \ No newline at end of file
diff --git a/data/GrabberConfig/amazon.com.txt b/data/GrabberConfig/amazon.com.txt
deleted file mode 100644
index cd7ad159..00000000
--- a/data/GrabberConfig/amazon.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-title: //span[@id = 'btAsinTitle']
-body: (//*[@id='prodImageCell']//a)[1] | //div[@id = 'ps-content'] | //span[@id='actualPriceValue'] | //h2[.='Product Details']/following-sibling::div | //div[@class='h2' and .='Product Description']/following-sibling::div
-#strip_id_or_class: quantityDropdownDiv
-#strip_id_or_class: addToCartSpan
-#strip_id_or_class: oneClickDiv
-strip_id_or_class: nocontent
-strip_id_or_class: masDynamicConten
-strip_id_or_class: dynamic-content
-prune: no
-
-find_string: <span id="actualPriceValue">
-replace_string: <span id="actualPriceValue"><br />Price:
-
-strip_id_or_class: collapsePS
-strip_id_or_class: expandPS
-strip_id_or_class: psPlaceHolde
-strip: //li[contains(., 'update product info') or contains(., 'give feedback on images')]
-
-test_url: http://www.amazon.com/Common-Sense-Forestry-Living-Mother/dp/1931498210/ \ No newline at end of file
diff --git a/data/GrabberConfig/americandrink.net.txt b/data/GrabberConfig/americandrink.net.txt
deleted file mode 100644
index 7145f3ff..00000000
--- a/data/GrabberConfig/americandrink.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='head']/h2/a
-author: //div[@class='head']/a
-date: //div[@class='head']/p[@class='date']/a
-body: //div[@class='copy']
-strip: //p[@class='meta']
-test_url: http://americandrink.net/post/10567188712/free-the-hooch \ No newline at end of file
diff --git a/data/GrabberConfig/americastestkitchenfeed.com.txt b/data/GrabberConfig/americastestkitchenfeed.com.txt
deleted file mode 100644
index c2b62b5a..00000000
--- a/data/GrabberConfig/americastestkitchenfeed.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1[@class="post-title"]
-author: //span[@class="author"]/a
-date: //span[@class="date"]
-body: //div[@class="post-content main"]
-test_url: http://www.americastestkitchenfeed.com/gadgets-and-gear/2012/07/chill-out-with-tovolos-king-cube-silicone-ice-cube-tray/ \ No newline at end of file
diff --git a/data/GrabberConfig/amptoons.com.txt b/data/GrabberConfig/amptoons.com.txt
deleted file mode 100644
index 87547c63..00000000
--- a/data/GrabberConfig/amptoons.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //title
-
-body: //div[@class="entry-content"]
-
-author: //span[@class="author vcard"]
-
-date: //span[@class="entry-date"]
-test_url: http://www.amptoons.com/blog/2013/03/14/open-thread-and-link-farm-i-hate-being-sick-edition/ \ No newline at end of file
diff --git a/data/GrabberConfig/anandtech.com.txt b/data/GrabberConfig/anandtech.com.txt
deleted file mode 100644
index faba9fb8..00000000
--- a/data/GrabberConfig/anandtech.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-body: //section[@class='main_cont']/img | //div[@class='articleContent']
-title: //div[@class='blog_top_left']//h2
-author: //a[@class='b'][1]
-date: substring-after(substring-before(//div, 'Posted in'), ' on ')
-strip_image_src: /content/images/globals/
-strip: //h2[. = 'Page 1']/preceding::p
-strip: //h2
-
-prune: no
-
-single_page_link: concat('http://www.anandtech.com/print/', substring-after(//meta[@property='og:url']/@content, '/show/'))
-next_page_link: //div[@class='article_links']/a[@class='fl-rt']
-
-test_url: http://www.anandtech.com/show/8370/gigabyte-am1m-s2h-review
-test_url: http://www.anandtech.com/show/8402/sandisk-releases-ultra-ii-ssd-the-second-tlc-nand-ssd-in-the-market
-test_url: http://www.anandtech.com/show/8400/arms-cortex-m-even-smaller-and-lower-power-cpu-cores
diff --git a/data/GrabberConfig/androidandme.com.txt b/data/GrabberConfig/androidandme.com.txt
deleted file mode 100644
index bb48a7cb..00000000
--- a/data/GrabberConfig/androidandme.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //img[@class='attachment-large wp-post-image'] | //div[@class='entry-content']
-prune: no
-
-test_url: http://androidandme.com/2015/12/news/google-introduces-trial-run-ads-and-interactive-interstitials/
-test_url: http://androidandme.com/2015/12/applications/top-10-new-android-games-this-week-maestria-mad-aces/ \ No newline at end of file
diff --git a/data/GrabberConfig/androidpolice.com.txt b/data/GrabberConfig/androidpolice.com.txt
deleted file mode 100644
index 3588e588..00000000
--- a/data/GrabberConfig/androidpolice.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@class='post_content']
-date: //div[@class='date_day'] | div[@class='date_month']
-strip_id_or_class: author-box
-strip_id_or_class: multi-page-post
-strip_id_or_class: toc_container
-author: //h2[@class='author-box-heading']/a
-next_page_link: //link[@rel='next']/@href
-
-test_url: http://www.androidpolice.com/2014/03/30/music-boss-for-pebble-can-now-control-playback-and-volume-on-chromecast-content-from-your-smartwatch/
-test_url: http://www.androidpolice.com/2015/12/07/32-new-and-notable-android-games-from-the-last-2-weeks-112415-12715/ \ No newline at end of file
diff --git a/data/GrabberConfig/andyrutledge.com.txt b/data/GrabberConfig/andyrutledge.com.txt
deleted file mode 100644
index ce31fcf5..00000000
--- a/data/GrabberConfig/andyrutledge.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h2
-author: string('Andy Rutledge')
-date: //div[@class='articledate']
-body: //div[@class='copybody']
-
-strip: //*[@class='space']
-strip: //*[@class='articleFoot']
-
-test_url: http://www.andyrutledge.com/hungry-for-a-better-menu.php \ No newline at end of file
diff --git a/data/GrabberConfig/annatravelling.wordpress.com.txt b/data/GrabberConfig/annatravelling.wordpress.com.txt
deleted file mode 100644
index 2d8937f7..00000000
--- a/data/GrabberConfig/annatravelling.wordpress.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1[@class="title"]
-
-author: ("Anna Manasova")
-# is ignored, unfortunately
-
-date: //p[@class="date"]
-
-body: //div[@class="entry"]
-test_url: http://annatravelling.wordpress.com/2011/11/07/a-day-of-cooking-thai/ \ No newline at end of file
diff --git a/data/GrabberConfig/antirez.com.txt b/data/GrabberConfig/antirez.com.txt
deleted file mode 100644
index f8bef02c..00000000
--- a/data/GrabberConfig/antirez.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fantirez.com%2Fnews%2F104
-
-body: //article/pre
-test_url: http://antirez.com/news/104
diff --git a/data/GrabberConfig/apotheke-adhoc.de.txt b/data/GrabberConfig/apotheke-adhoc.de.txt
deleted file mode 100644
index 3a702e7b..00000000
--- a/data/GrabberConfig/apotheke-adhoc.de.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# Author: zinnober
-
-prune: no
-
-title: substring-before(//div[@id='content']/h1, ',')
-
-single_page_link: //a[@title='Seite drucken']
-
-body: //div[@id='detail-body']
-
-replace_string(<span class="description">): <em>
-replace_string(<p class="leadtext"><small>): <p class="leadtext">
-
-# Fix headlines
-replace_string(Patrick Hollstein): &nbsp;
-replace_string(APOTHEKE ADHOC): &nbsp;
-replace_string(dpa): &nbsp;
-replace_string(Katharina Lübke): &nbsp;
-replace_string(Julia Pradel): &nbsp;
-replace_string(Franziska Gerhardt): &nbsp;
-
-test_url: http://www.apotheke-adhoc.de/nachrichten/politik/nachricht-detail-politik/deutscher-apothekertag-antraege-gegen-lieferengpaesse-2/
-
diff --git a/data/GrabberConfig/apple.com.txt b/data/GrabberConfig/apple.com.txt
deleted file mode 100644
index a54dccc8..00000000
--- a/data/GrabberConfig/apple.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-strip: //p[@class='sosumi']
-# Aren't they witty?
-
-# I can't work out what causes the  before the title.
-title: //h1[@class='title']
-strip: //h1[@class='title']
-test_url: http://www.apple.com/pr/library/2011/02/15appstore.html \ No newline at end of file
diff --git a/data/GrabberConfig/appledaily.com.tw.txt b/data/GrabberConfig/appledaily.com.tw.txt
deleted file mode 100644
index 82d6f376..00000000
--- a/data/GrabberConfig/appledaily.com.tw.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[contains(@class, 'articulum')]
-
-test_url: http://www.appledaily.com.tw/realtimenews/article/new/20140120/330479
-test_url: http://www.appledaily.com.tw/rss/create/kind/rnews/type/new/ \ No newline at end of file
diff --git a/data/GrabberConfig/appleinsider.com.txt b/data/GrabberConfig/appleinsider.com.txt
deleted file mode 100644
index 5ae1050b..00000000
--- a/data/GrabberConfig/appleinsider.com.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-title: //h1[@class="art-head"]
-
-author: //p[contains(@class, 'byline')]/a
-#author: //p[text() = 'By ']/a/text()
-#strip: //p[text() = 'By ']
-
-date: //p[contains(@class, 'date-header')]
-
-body: //div[@class="article"]
-strip_id_or_class: lazy
-#strip_id_or_class: minor
-strip_id_or_class: multipagefooter
-strip_id_or_class: date-header
-strip_id_or_class: byline
-
-find_string: <noscript>
-replace_string: <div>
-find_string: </noscript>
-replace_string: </div>
-
-test_url: http://www.appleinsider.com/articles/12/02/29/inside_os_x_108_mountain_lion_safari_52_gets_a_simplified_user_interface_with_new_sharing_features.html
-test_url: http://appleinsider.com/articles/13/10/03/goldee-companion-app-for-philips-hue-bulbs-offers-shifting-dynamic-light-scenes
-test_url: http://appleinsider.com/appleinsider.rss \ No newline at end of file
diff --git a/data/GrabberConfig/appleweblog.com.txt b/data/GrabberConfig/appleweblog.com.txt
deleted file mode 100644
index 023c9ccb..00000000
--- a/data/GrabberConfig/appleweblog.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://appleweblog.com/2011/09/encontrada-vulnerabilidad-grave-en-skype-para-ios \ No newline at end of file
diff --git a/data/GrabberConfig/archdaily.com.txt b/data/GrabberConfig/archdaily.com.txt
deleted file mode 100644
index 0178639e..00000000
--- a/data/GrabberConfig/archdaily.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-date: //div[@class='post_date']
-
-body: //div[@class='post_content']
-
-test_url: http://www.archdaily.com/185325/p10-mixed-use-building-studio-up \ No newline at end of file
diff --git a/data/GrabberConfig/archiveofourown.org.txt b/data/GrabberConfig/archiveofourown.org.txt
deleted file mode 100644
index 579de517..00000000
--- a/data/GrabberConfig/archiveofourown.org.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# Description: Fix XPaths to include ALL chapters on 'view_full_work' pages.
-# Include: work meta, summary, chapter information, and notes which Instapaper strips out on default.
-# Exclude: header, footer, navigation, comments.
-# Notes: User is a newbie with XPaths.
-
-title: //h2[@class='title']
-author: //h3[@class='byline']
-author: //a[@class='login author']
-
-strip_id_or_class:header
-strip_id_or_class:navigation
-strip_id_or_class:feedback
-strip_id_or_class:kudos
-strip_id_or_class:add_comment_placeholder
-strip_id_or_class:add_comment
-strip_id_or_class:globalize
-strip_id_or_class:footer
-
-single_page_link: //div[@id='main']//a[contains(@href, 'view_adult=true')]
-
-test_url: http://archiveofourown.org/works/229402?view_full_work=true
-test_url: http://archiveofourown.org/works/750111/chapters/1399929 \ No newline at end of file
diff --git a/data/GrabberConfig/arstechnica.co.uk.txt b/data/GrabberConfig/arstechnica.co.uk.txt
deleted file mode 100644
index 9ec8ff69..00000000
--- a/data/GrabberConfig/arstechnica.co.uk.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-strip: //aside
-next_page_link: //nav//a[contains(text(), 'Next')]/@href
-
-test_url: http://arstechnica.co.uk/science/2016/06/what-is-open-access-free-sharing-of-all-human-knowledge/
-test_url: http://arstechnica.co.uk/information-technology/2016/05/eben-moglen-gpl-online-advertising-is-becoming-a-perfect-despotism/
-
diff --git a/data/GrabberConfig/arstechnica.com.txt b/data/GrabberConfig/arstechnica.com.txt
deleted file mode 100644
index ffd5cc89..00000000
--- a/data/GrabberConfig/arstechnica.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-author: //p[@class='byline']/a
-body: //div[contains(@class,'article-content')]
-strip: //h2[@class='title']
-strip_id_or_class: byline
-strip_id_or_class: story-sidebar
-prune: no
-
-date: //div[@class='byline']/span[@class='posted']//abbr/@original-title
-date: //div[@class='byline']/span[@class='posted']//abbr
-
-title: //div[@id='story']//h2[@class='title']
-
-strip: //div[@class='pager']
-native_ad_clue: //meta[@property="og:url" and contains(@content, '/sponsored/')]
-
-strip: //aside
-next_page_link: //nav//a[contains(text(), 'Next')]/@href
-
-test_url: http://arstechnica.com/tech-policy/news/2012/02/gigabit-internet-for-80-the-unlikely-success-of-californias-sonicnet.ars
-test_url: http://arstechnica.com/apple/2005/04/macosx-10-4/
diff --git a/data/GrabberConfig/articles.boston.com.txt b/data/GrabberConfig/articles.boston.com.txt
deleted file mode 100644
index 73bcdb4e..00000000
--- a/data/GrabberConfig/articles.boston.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class="mod-bostonarticleheader mod-articleheader"]/h1
-author: substring-after(//div[@class="mod-bostonarticlebyline mod-articlebyline"]/span[3],"By ")
-date: //div[@class="mod-bostonarticlebyline mod-articlebyline"]/span[@class="pubdate"]
-
-strip_id_or_class: mod-pagination
-test_url: http://articles.boston.com/2011-10-23/news/30313691_1_bigfoot-free-speech-monadnock-state-park \ No newline at end of file
diff --git a/data/GrabberConfig/articles.courant.com.txt b/data/GrabberConfig/articles.courant.com.txt
deleted file mode 100644
index 984d81de..00000000
--- a/data/GrabberConfig/articles.courant.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@class="mod-courantarticleheader mod-articleheader"]/h1
-date: //div[@class="mod-courantarticlebyline mod-articlebyline"]/span[@class="pubdate"]
-author: //div[@class="mod-courantarticlebyline mod-articlebyline"]/span[3]
-
-strip_id_or_class: mod-article-byline
-strip_id_or_class: mod-article-header
-strip_id_or_class: mod-article-subtitle
-#This leaves some crud after the article, but it's better than nothing.
-#It would be ideal if we could set the body to every element matching //div[contains(@class, "mod-articletext")]/p, but it seems like body only takes the first matching element.
-
-test_url: http://articles.courant.com/2011-10-22/news/hc-green-drugsearch--1022-20111022_1_drugs-in-student-lockers-police-dogs-lockdown \ No newline at end of file
diff --git a/data/GrabberConfig/articles.washingtonpost.com.txt b/data/GrabberConfig/articles.washingtonpost.com.txt
deleted file mode 100644
index a76c2d02..00000000
--- a/data/GrabberConfig/articles.washingtonpost.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[contains(@class, "article_body")]
-# print view
-body: //div[@id='print_facet']//div[@id='body']
-
-tidy: no
-prune: no
-
-single_page_link: concat(substring-before(//div[@id="echo_container_a"]/@guid, '_story.html'), '_print.html')
-
-test_url: http://articles.washingtonpost.com/2011-10-22/world/35279694_1_germany-acts-german-leaders-chancellor-angela-merkel
-test_url: http://articles.washingtonpost.com/2013-05-31/opinions/39658000_1_chemical-weapons-mass-destruction-cartels \ No newline at end of file
diff --git a/data/GrabberConfig/artofmanliness.com.txt b/data/GrabberConfig/artofmanliness.com.txt
deleted file mode 100644
index b29ea0db..00000000
--- a/data/GrabberConfig/artofmanliness.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-parser: html5php
-date: //article/p[contains(@class, 'single-date')]
-author: //article/p[contains(@class, 'byline')]
-
-test_url: http://www.artofmanliness.com/2013/01/31/relationship-red-flags/
-test_contains: It seems that once we get close to a person \ No newline at end of file
diff --git a/data/GrabberConfig/ascarter.net.txt b/data/GrabberConfig/ascarter.net.txt
deleted file mode 100644
index 0327e846..00000000
--- a/data/GrabberConfig/ascarter.net.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1[@class='article_title']
-author: //span[@class='author']
-date: //h2[@class='dateline']
-body: //div[@class='article_body']
-test_url: http://ascarter.net/2012/02/20/enough-is-enough.html \ No newline at end of file
diff --git a/data/GrabberConfig/astronews.com.txt b/data/GrabberConfig/astronews.com.txt
deleted file mode 100644
index 8de22270..00000000
--- a/data/GrabberConfig/astronews.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //span[@class='titel']
-author: //span[@class='metadaten_C']/a//span[@class='metadaten_C']
-date: substring-after(//span[@class='metadaten_C'],'astronews.com')
-strip: //span[@class='bu']
-strip_image_src: '/_images/'
-
-test_url: http://www.astronews.com/news/artikel/2011/10/1110-021.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/asymco.com.txt b/data/GrabberConfig/asymco.com.txt
deleted file mode 100644
index f639b048..00000000
--- a/data/GrabberConfig/asymco.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Johannes Stühler
-
-title://h2
-author://span[@class='meta-content']
-date://abbr[@class='date published']/@title
-body://div[@class='entry-content']
-
-test_url: http://www.asymco.com/2011/01/14/is-android-more-efficient-than-ios-at-generating-search-revenue/ \ No newline at end of file
diff --git a/data/GrabberConfig/au.businessinsider.com.txt b/data/GrabberConfig/au.businessinsider.com.txt
deleted file mode 100644
index 46bcddf2..00000000
--- a/data/GrabberConfig/au.businessinsider.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title://div[@class="sl-layout-post"]/h1
-body: //div[@id='content_post']
-strip: //div[contains(@class, "post-sidebar")]
-strip: //div[@id='related-links']
-strip: //img[@class='size_xlarge']
-author://div[@class="byline"]/a
-date://div[@class="byline"]/span[@class="date"]
-prune: no
-tidy: no
-
-
-test_url: http://www.businessinsider.com/microsoft-just-put-one-of-its-hardcore-technical-geniuses-on-xbox-2012-1
diff --git a/data/GrabberConfig/au.news.yahoo.com.txt b/data/GrabberConfig/au.news.yahoo.com.txt
deleted file mode 100644
index 65753c4c..00000000
--- a/data/GrabberConfig/au.news.yahoo.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip: //a[contains(text(), "RELATED:")]
-author: //div[@class="info"]//span[@class="association printer-source"]
-author: //div[@class="info"]//span[@class="stamp printer-date"]
-
-test_url: https://au.news.yahoo.com/a/31334394/brave-subway-employee-fights-off-masked-robber-using-her-bare-hands/
diff --git a/data/GrabberConfig/autoblog.com.txt b/data/GrabberConfig/autoblog.com.txt
deleted file mode 100644
index 291db992..00000000
--- a/data/GrabberConfig/autoblog.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-prune: no
-body: //div[@class='post-body']
-author: //p[@class='byline']//a
-date: substring-after(//div[@class='about']/p[2], 'Posted')
-strip: //div[@class='body']/div[@class='meta']
-test_url: http://www.autoblog.com/2012/01/17/next-gen-bmw-x5-caught-again/ \ No newline at end of file
diff --git a/data/GrabberConfig/autocar.co.uk.txt b/data/GrabberConfig/autocar.co.uk.txt
deleted file mode 100644
index 9f4fe18b..00000000
--- a/data/GrabberConfig/autocar.co.uk.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //div[@class='col-center']/h1
-author: //div[@class='personality']/a
-date: //div[@class='personality-date']
-body: //div[@class='content-top ']//div[@class='content'][1] | //div[contains(@class,'article-body')] | //div[contains(@class,'main-article')]
-
-next_page_link: //div[@id='review-link']/a
-
-strip: //div[@class='author-block']
-strip: //p//iframe[contains(@src,'signup')]/preceding::p[1]
-
-test_url: http://www.autocar.co.uk/car-review/volkswagen/golf
-test_url: http://www.autocar.co.uk/car-news/pebble-beach/saleen-unveils-performance-electric-vehicle-based-tesla-model-s
-test_url: http://www.autocar.co.uk/car-review/rolls-royce/first-drives/rolls-royce-ghost-series-ii-first-drive-review
diff --git a/data/GrabberConfig/avclub.com.txt b/data/GrabberConfig/avclub.com.txt
deleted file mode 100644
index c365a7aa..00000000
--- a/data/GrabberConfig/avclub.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //*[@id="article_wrapper"]/div[1]/a[1]
-body: //*[@id="article_wrapper"]/div[2]
-date: //*[@id="article_wrapper"]/div[1]/text()[2]
-test_url: http://www.avclub.com/articles/forgetmenot,70904 \ No newline at end of file
diff --git a/data/GrabberConfig/baltimoresun.com.txt b/data/GrabberConfig/baltimoresun.com.txt
deleted file mode 100644
index 35b62427..00000000
--- a/data/GrabberConfig/baltimoresun.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-single_page_link: //div[@class='toppaginate']//a[@rel='nofollow']
-convert_double_br_tags: yes
-
-title: //div[@class="story"]/h1
-body: //div[@id="story-body-text"]
-author: //span[@class="byline"]
-date: //p[@class="date"]
-
-strip: //*[@class='all']
-strip: //*[@class='articlerail']
-
-test_url: http://www.baltimoresun.com/news/maryland/bs-md-omalley-budget-2-20120116,0,5340585.story \ No newline at end of file
diff --git a/data/GrabberConfig/baseballprospectus.com.txt b/data/GrabberConfig/baseballprospectus.com.txt
deleted file mode 100644
index 1207b343..00000000
--- a/data/GrabberConfig/baseballprospectus.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //h1[@class='title']
-author: //p[@class="author"]/a[1]
-body: //div[@class="article"]
-date: //p[@class="date"]
-
-# remove user tools
-strip: //div[@class='tools']
-strip: //h1
-strip: //h2[@class='subtitle']
-strip: //p[@class='author']
-strip: //p[@class='date']
-
-test_url: http://www.baseballprospectus.com/article.php?articleid=18463 \ No newline at end of file
diff --git a/data/GrabberConfig/basicthinking.de.txt b/data/GrabberConfig/basicthinking.de.txt
deleted file mode 100644
index f08c1f26..00000000
--- a/data/GrabberConfig/basicthinking.de.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h2
-date: //span[@class='date']
-body: //div[@class='entry']
-
-strip: //div[@class='zusatz']
-
-test_url: http://www.basicthinking.de/blog/2011/12/13/sagt-social-networks-adieu-begrust-private-networks/ \ No newline at end of file
diff --git a/data/GrabberConfig/bastamag.net.txt b/data/GrabberConfig/bastamag.net.txt
deleted file mode 100644
index 142c959c..00000000
--- a/data/GrabberConfig/bastamag.net.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.bastamag.net%2FEncadrement-des-loyers-pourquoi-Anne-Hidalgo-ferait-bien-de-visiter-Vienne-l
-
-body: //div[@id='content']//article
-
-strip_id_or_class: appel-soutien
-strip_id_or_class: liste dossiers-content
-
-test_url: http://www.bastamag.net/Encadrement-des-loyers-pourquoi-Anne-Hidalgo-ferait-bien-de-visiter-Vienne-l
diff --git a/data/GrabberConfig/baylon-industries.com.txt b/data/GrabberConfig/baylon-industries.com.txt
deleted file mode 100644
index 381e0a7d..00000000
--- a/data/GrabberConfig/baylon-industries.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.baylon-industries.com%2Fnews%2F%3Fp%3D1440
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry_content ')]
-test_url: http://www.baylon-industries.com/news/?p=1440
diff --git a/data/GrabberConfig/bb.is.txt b/data/GrabberConfig/bb.is.txt
deleted file mode 100644
index 57f7fdfa..00000000
--- a/data/GrabberConfig/bb.is.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-author: substring(//h3[@class='headlines']/span[@class='dates'],0,string-length(//h3[@class='headlines']/span[@class='dates'])-20)
-
-
-date: substring((//h3[@class='headlines']/span[@class='dates']),string-length(//h3[@class='headlines']/span[@class='dates'])-18,12)
-
-
-body: //div[@class='first-article-big']
-strip: //table[@class='newsimagecontainer']
-strip: //h3[@class='headlines']
-strip: //iframe[@class='headlines']
-strip: //a[@class='newslink']
-convert_double_br_tags: yes
-test_url: http://bb.is/Pages/82?NewsID=174119 \ No newline at end of file
diff --git a/data/GrabberConfig/bbc.co.uk.txt b/data/GrabberConfig/bbc.co.uk.txt
deleted file mode 100644
index 8abacded..00000000
--- a/data/GrabberConfig/bbc.co.uk.txt
+++ /dev/null
@@ -1,70 +0,0 @@
-body: //div[@id="story-body"]
-# for video entries
-body: //div[contains(@class, "videoInStory") or @id="meta-information"]
-title: //h1[@class="story-header"]
-date: //span[@class="story-date"]/span[@class='date']
-# for sport site
-date: //meta[@name='DCTERMS.created']/@content
-author: //div[@id='headline']//span[@class='byline-name']
-
-# recipes, e.g. http://www.bbc.co.uk/food/recipes/mymincepies_71055
-body: //div[contains(@class, 'hrecipe')]//div[@id='subcolumn-1']
-
-#strip: //div[@class="story-feature narrow"]
-#strip: //div[@class="story-feature wide"]
-#strip: //div[@class="story-feature dslideshow-enclosure"]
-strip: //div[contains(@class, "story-feature") and not(contains(@class, 'full-width'))]
-strip: //span[@class="story-date"]
-#strip: //div[@class="caption body-narrow-width"]
-strip: //div[@class="warning"]//p
-strip: //div[@id='page-bookmark-links-head']
-strip: //object
-strip: //div[contains(@class, "bbccom_advert_placeholder")]
-strip: //div[contains(@class, "embedded-hyper")]
-strip: //div[contains(@class, 'market-data')]
-strip: //a[contains(@class, 'hidden')]
-strip: //div[contains(@class, 'hypertabs')]
-strip: //div[contains(@class, 'related')]
-strip: //form[@id='comment-form']
-strip: //div[contains(@class, 'comment-introduction')]
-strip: //div[contains(@class, 'share-tools')]
-strip: //div[@id='also-related-links']
-
-strip: //figcaption
-strip_id_or_class: image-and-copyright-container
-
-strip: //aside[contains(@class, 'sp-pullout')]
-
-strip_id_or_class: share-help
-strip_id_or_class: comments_module
-
-find_string: http://ichef.bbci.co.uk/news/200/
-replace_string: http://ichef.bbci.co.uk/news/624/
-
-find_string: http://ichef.bbci.co.uk/news/304/
-replace_string: http://ichef.bbci.co.uk/news/624/
-
-replace_string({width}{hidpi}): 624
-
-replace_string(<noscript>): <div>
-replace_string(</noscript>): </div>
-
-native_ad_clue: //meta[@property="og:url" and contains(@content, '/sponsored/')]
-
-tidy: no
-prune: no
-
-dissolve: //h2
-
-test_url: http://www.bbc.co.uk/sport/0/football/23224017
-test_contains: Swansea City have completed the club-record signing
-
-test_url: http://www.bbc.co.uk/news/business-15060862
-test_contains: Europe's leaders are meeting again to try to solve
-
-# news feed
-test_url: http://feeds.bbci.co.uk/news/rss.xml
-# sports feed
-test_url: http://feeds.bbci.co.uk/sport/0/football/rss.xml?edition=int
-# video entry
-test_url: http://www.bbc.co.uk/news/world-asia-22056933
diff --git a/data/GrabberConfig/bbc.com.txt b/data/GrabberConfig/bbc.com.txt
deleted file mode 100644
index baf12b94..00000000
--- a/data/GrabberConfig/bbc.com.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-body: //div[@id="story-body"]
-# for video entries
-body: //div[contains(@class, "videoInStory") or @id="meta-information"]
-title: //h1[@class="story-header"]
-date: //span[@class="story-date"]/span[@class='date']
-# for sport site
-date: //meta[@name='DCTERMS.created']/@content
-author: //div[@id='headline']//span[@class='byline-name']
-
-# recipes, e.g. http://www.bbc.co.uk/food/recipes/mymincepies_71055
-body: //div[contains(@class, 'hrecipe')]//div[@id='subcolumn-1']
-
-#strip: //div[@class="story-feature narrow"]
-#strip: //div[@class="story-feature wide"]
-#strip: //div[@class="story-feature dslideshow-enclosure"]
-strip: //div[contains(@class, "story-feature") and not(contains(@class, 'full-width'))]
-strip: //span[@class="story-date"]
-#strip: //div[@class="caption body-narrow-width"]
-strip: //div[@class="warning"]//p
-strip: //div[@id='page-bookmark-links-head']
-strip: //object
-strip: //div[contains(@class, "bbccom_advert_placeholder")]
-strip: //div[contains(@class, "embedded-hyper")]
-strip: //div[contains(@class, 'market-data')]
-strip: //a[contains(@class, 'hidden')]
-strip: //div[contains(@class, 'hypertabs')]
-strip: //div[contains(@class, 'related')]
-strip: //form[@id='comment-form']
-strip: //div[contains(@class, 'comment-introduction')]
-strip: //div[contains(@class, 'share-tools')]
-strip: //div[@id='also-related-links']
-
-strip: //figcaption
-strip_id_or_class: image-and-copyright-container
-
-strip: //aside[contains(@class, 'sp-pullout')]
-
-strip_id_or_class: share-help
-strip_id_or_class: comments_module
-
-find_string: http://ichef.bbci.co.uk/news/200/
-replace_string: http://ichef.bbci.co.uk/news/624/
-
-find_string: http://ichef.bbci.co.uk/news/304/
-replace_string: http://ichef.bbci.co.uk/news/624/
-
-replace_string({width}{hidpi}): 624
-
-replace_string(<noscript>): <div>
-replace_string(</noscript>): </div>
-
-native_ad_clue: //meta[@property="og:url" and contains(@content, '/sponsored/')]
-
-tidy: no
-prune: no
-
-dissolve: //h2
-
-test_url: http://www.bbc.com/sport/0/football/28918021
-test_contains: Cameroonian footballer Albert Ebosse has died
-
-test_url: http://www.bbc.com/sport/0/football/23224017
-
-test_url: http://www.bbc.com/news/business-15060862
-test_contains: Europe's leaders are meeting again to try
-
-
-# news feed
-test_url: http://feeds.bbci.co.uk/news/rss.xml
-# sports feed
-test_url: http://feeds.bbci.co.uk/sport/0/football/rss.xml?edition=int
-# video entry
-test_url: http://www.bbc.com/news/world-asia-22056933
diff --git a/data/GrabberConfig/bbcgoodfood.com.txt b/data/GrabberConfig/bbcgoodfood.com.txt
deleted file mode 100644
index 1547d625..00000000
--- a/data/GrabberConfig/bbcgoodfood.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //header//h1
-#body: //article[contains(@class, 'node-full')]
-body: //div[contains(@class, 'recipe-details') or contains(@class, 'tips-carousel')] | //section[@id='recipe-ingredients' or @id='recipe-method']
-
-strip_id_or_class: recipe-rating-wrapper
-strip_id_or_class: magazine-subcribe-header
-strip_id_or_class: hide
-strip_id_or_class: recipe-actions
-strip_id_or_class: buy-ingredients
-strip_id_or_class: related-content
-strip_id_or_class: recipe-magazine-ad
-strip_id_or_class: copy-right
-
-prune: no
-
-test_url: http://www.bbcgoodfood.com/recipes/1131634/minced-beef-wellington \ No newline at end of file
diff --git a/data/GrabberConfig/bearmetal.eu.txt b/data/GrabberConfig/bearmetal.eu.txt
deleted file mode 100644
index 44d34655..00000000
--- a/data/GrabberConfig/bearmetal.eu.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fbearmetal.eu%2Ftheden%2Fits-not-about-you%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: https://bearmetal.eu/theden/its-not-about-you/
diff --git a/data/GrabberConfig/becomingminimalist.com.txt b/data/GrabberConfig/becomingminimalist.com.txt
deleted file mode 100644
index 79335884..00000000
--- a/data/GrabberConfig/becomingminimalist.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.becomingminimalist.com%2Fmost-popular-posts%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: http://www.becomingminimalist.com/most-popular-posts/
-test_url: http://www.becomingminimalist.com/the-10-most-important-things-to-simplify-in-your-life/
diff --git a/data/GrabberConfig/begeek.fr.txt b/data/GrabberConfig/begeek.fr.txt
deleted file mode 100644
index 5acec030..00000000
--- a/data/GrabberConfig/begeek.fr.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //div[@class='title']/h1
-author: //div[@class="author_link"]/span/a[@itemprop="author"]
-date: //div[@id="publish_post"]/time/@datetime
-body: //section[@id="single"]
-
-strip: //div[@class="title"]
-strip: //div[@class="info_top"]
-strip: //div[@class="follow-tools"]
-strip: //div[@class="author"]
-strip: //div[@id="share_post"]
-strip: //div[@id="topic_ass"]
-strip: //div[@id="taboola-below-article-thumbs-mix"]
-strip: //section[@id="facebook-com"]
-strip: //section[@id="related_post"]
-strip: //div[@id="ligatus"]
-
-test_url: http://www.begeek.fr/videos-amazon-va-defier-youtube-france-202647
diff --git a/data/GrabberConfig/benoitmaison.org.txt b/data/GrabberConfig/benoitmaison.org.txt
deleted file mode 100644
index 72c1baed..00000000
--- a/data/GrabberConfig/benoitmaison.org.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-body: //div[@class="entry-content"]
-
-# Remove text &lsquo;Tweet&rsquo;
-strip: //div[@class="entry-content"]/div[last()]
-
-title: h1[@class="entry-title"]
-
-# If the Instapaper text parser worked with HTML5 tags, we would use:
-date: //time[@class="entry-date"]
-
-# But since it does not, use this more complicated rule:
-date: //div[@class="entry-meta"]/a[@rel="bookmark"]
-
-# Unfortunately, the following rule is overridden by the automatically found author.
-author: ("Benoit Maison")
-test_url: http://www.benoitmaison.org/2011/12/06/why-siri-had-to-start-in-beta/ \ No newline at end of file
diff --git a/data/GrabberConfig/berlingske.dk.txt b/data/GrabberConfig/berlingske.dk.txt
deleted file mode 100644
index 9f8c41c6..00000000
--- a/data/GrabberConfig/berlingske.dk.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1[@class='headline']
-body: //div[contains(@class, 'article-wrapper')]
-test_url: http://www.berlingske.dk/danmark/festen-er-flyttet-nordpaa \ No newline at end of file
diff --git a/data/GrabberConfig/bernama.com.txt b/data/GrabberConfig/bernama.com.txt
deleted file mode 100644
index fdc04b7f..00000000
--- a/data/GrabberConfig/bernama.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(@class, "NewsText"]
-prune: no
-
-test_url: http://www.bernama.com/bernama/v7/rss/english.php
-test_url: http://www.bernama.com/bernama/v7/newsindex.php?id=943513 \ No newline at end of file
diff --git a/data/GrabberConfig/betabeat.com.txt b/data/GrabberConfig/betabeat.com.txt
deleted file mode 100644
index 7815cf26..00000000
--- a/data/GrabberConfig/betabeat.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class="entry-content"]
-test_url: http://www.betabeat.com/2011/07/04/sheryl-sandberg-breaks-through-silicon-valleys-boys-club-sort-of/ \ No newline at end of file
diff --git a/data/GrabberConfig/betanews.com.txt b/data/GrabberConfig/betanews.com.txt
deleted file mode 100644
index 90a54a23..00000000
--- a/data/GrabberConfig/betanews.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# some articles at this site like this one doesn't
-# seem to pick up the article body via normal
-# processing, other articles come through fine
-# http://www.betanews.com/joewilcox/article
-# /Google-is-a-marketing-sensation/1309708375
-body: //*[@id="article"]
-test_url: http://www.betanews.com/joewilcox/article/Google-is-a-marketing-sensation/1309708375 \ No newline at end of file
diff --git a/data/GrabberConfig/bez.es.txt b/data/GrabberConfig/bez.es.txt
deleted file mode 100644
index cab7c6f7..00000000
--- a/data/GrabberConfig/bez.es.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='text_art']
-strip: //div[@class='cab_datos_opinion']
-strip: //div[@class='sumario2_left']
-
-test_url: http://www.bez.es/382758623/otros-fracasos-empresas.html
diff --git a/data/GrabberConfig/biography.com.txt b/data/GrabberConfig/biography.com.txt
deleted file mode 100644
index e431037a..00000000
--- a/data/GrabberConfig/biography.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[contains(@class, 'main-content')]//h1
-body: //div[@class='summary-column'] | //div[contains(@class, 'main-content')]
-
-prune: no
-
-single_page_link: //div[@id='biography-action-links']//a[contains(@href, '/print/')]
-
-test_url: http://www.biography.com/print/profile/martin-luther-9389283 \ No newline at end of file
diff --git a/data/GrabberConfig/bit-tech.net.txt b/data/GrabberConfig/bit-tech.net.txt
deleted file mode 100644
index c6f5b204..00000000
--- a/data/GrabberConfig/bit-tech.net.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-body: //div[@id='column_1']
-next_page_link: //div[@class='next']/a[not(contains(@href, '/comments') or contains(@href, '/news/'))]
-prune: no
-
-author: substring-after(//p[@class='byline'], 'by ')
-date: substring-before(substring-after(//p[@class='byline'], 'on '), ' by')
-
-strip: //h1
-strip_id_or_class: socialLinks
-strip_id_or_class: byline
-strip_id_or_class: pageSelector
-strip_id_or_class: articleTabs
-strip_id_or_class: pageNav
-strip_id_or_class: share
-strip_id_or_class: commentsContainer
-strip_id_or_class: below_article_related
-
-test_url: http://www.bit-tech.net/hardware/storage/2014/08/13/ocz-arc-100-240gb-review/1
-test_url: http://www.bit-tech.net/news/bits/2014/08/15/google-trojan/1
diff --git a/data/GrabberConfig/bitelia.com.txt b/data/GrabberConfig/bitelia.com.txt
deleted file mode 100644
index 7bffae93..00000000
--- a/data/GrabberConfig/bitelia.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://bitelia.com/2011/09/klout-midiendo-influencia \ No newline at end of file
diff --git a/data/GrabberConfig/bizjournals.com.txt b/data/GrabberConfig/bizjournals.com.txt
deleted file mode 100644
index cfba766f..00000000
--- a/data/GrabberConfig/bizjournals.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-date: //meta[@name='publish-date']/@content
-body: //div[contains(@class, 'articleContentWrapper')]
-prune: no
-
-strip: //div[contains(@class, 'staff_info')]//dd[contains(., 'Twitter')]
-
-strip_id_or_class: related_content
-strip_id_or_class: enlarge
-strip_id_or_class: photoBy
-strip_id_or_class: older
-
-test_url: http://www.bizjournals.com/cincinnati/news/2013/10/03/harris-teeter-shareholders-vote-on.html
-test_url: http://feeds.bizjournals.com/industry_20?format=xml \ No newline at end of file
diff --git a/data/GrabberConfig/bjango.com.txt b/data/GrabberConfig/bjango.com.txt
deleted file mode 100644
index 0fed5526..00000000
--- a/data/GrabberConfig/bjango.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class='articlehead']
-body: //div[@class='column']
-strip: //h1
-strip: //div[@class='help']
-
-#no author or date/time provided in current layout
-test_url: http://bjango.com/articles/actions/ \ No newline at end of file
diff --git a/data/GrabberConfig/bleacherreport.com.txt b/data/GrabberConfig/bleacherreport.com.txt
deleted file mode 100644
index 9205e44e..00000000
--- a/data/GrabberConfig/bleacherreport.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-body: //div[contains(@class, 'article_pages')]
-
-strip_id_or_class: article_page-header
-strip_id_or_class: paginator
-strip_id_or_class: article_info
-
-find_string: src="data:image
-replace_string: ignore-src="data:image
-find_string: data-defer-src="
-replace_string: src="
-
-prune: no
-
-test_url: http://bleacherreport.com/articles/feed
-test_url: http://bleacherreport.com/articles/2137787-christian-ponders-newborn-daughter-was-named-after-fsu-legend-bobby-bowden
-test_url: http://bleacherreport.com/articles/2137596-college-football-week-1-picks-unlv-runnin-rebels-vs-arizona-wildcats/ \ No newline at end of file
diff --git a/data/GrabberConfig/blog.arsln.org.txt b/data/GrabberConfig/blog.arsln.org.txt
deleted file mode 100644
index 7ac8cc11..00000000
--- a/data/GrabberConfig/blog.arsln.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-tidy: no
-prune: no
-date: //article/header/h6/time
-title: //article/header/h3
-author: //meta[@name='author']/@content
-body: //article//post
-
-test_url: http://blog.arsln.org/aska-ayip-oluyor/ \ No newline at end of file
diff --git a/data/GrabberConfig/blog.asmartbear.com.txt b/data/GrabberConfig/blog.asmartbear.com.txt
deleted file mode 100644
index 78d7f516..00000000
--- a/data/GrabberConfig/blog.asmartbear.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //title
-author: //span[@class='author vcard']/a
-date: //p[@class='headline_meta']/abbr[@class='published']
-body: //div[@class='format_text entry-content']
-
-strip: //div[@id='dd_ajax_float']
-test_url: http://blog.asmartbear.com/how-to-get-quality-freelance-graphics-design-work-on-a-budget.html \ No newline at end of file
diff --git a/data/GrabberConfig/blog.cloudflare.com.txt b/data/GrabberConfig/blog.cloudflare.com.txt
deleted file mode 100644
index 2f9a5a2f..00000000
--- a/data/GrabberConfig/blog.cloudflare.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# Instapaper gets this back to front and only gets the blog title instead of the article title.
-title: //div[@class='title']
-
-author: //a[ contains(@href, '/people') ]
-
-body: //div[ @class='post-content' ]
-
-# Date is impossible to retrieve since they use those stupid "fuzzy" dates, inserted through javascript, at posterous.
-test_url: http://blog.cloudflare.com/understanding-analytics-when-is-a-page-view-n
-test_url: https://blog.cloudflare.com/sha-1-deprecation-no-browser-left-behind
diff --git a/data/GrabberConfig/blog.fefe.de.txt b/data/GrabberConfig/blog.fefe.de.txt
deleted file mode 100644
index 97e48e69..00000000
--- a/data/GrabberConfig/blog.fefe.de.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h2
-date: //h3
-body: //ul
-
-test_url: http://blog.fefe.de/?ts=b063bf55 \ No newline at end of file
diff --git a/data/GrabberConfig/blog.instagram.com.txt b/data/GrabberConfig/blog.instagram.com.txt
deleted file mode 100644
index 13d1d44a..00000000
--- a/data/GrabberConfig/blog.instagram.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# clean Instagram blog a little bit
-
-tidy:no
-prune:no
-
-body://div[contains(@id,'content')]
-
-strip_id_or_class:meta
-strip_id_or_class:notes
-strip_id_or_class:pagination
-test_url: http://blog.instagram.com/post/8757832007/fromwhereistand \ No newline at end of file
diff --git a/data/GrabberConfig/blog.instapaper.com.txt b/data/GrabberConfig/blog.instapaper.com.txt
deleted file mode 100644
index fda01b15..00000000
--- a/data/GrabberConfig/blog.instapaper.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-author: //a[@href="http://www.marco.org/about"]
-date: //span[@class="date"]
-
-# Remove the date from article body.
-strip: //span[@class="date"]
-
-# Remove pagination links from article body.
-strip: //div[@id="pagination"]
-test_url: http://blog.instapaper.com/post/31303984531 \ No newline at end of file
diff --git a/data/GrabberConfig/blog.kaelig.fr.txt b/data/GrabberConfig/blog.kaelig.fr.txt
deleted file mode 100644
index bcd3bdc9..00000000
--- a/data/GrabberConfig/blog.kaelig.fr.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //*[contains(@class, 'post_content')]
-author: string('Kaelig Deloumeau-Prigent')
-title: //h1[@class='title']
-date: //span[@class='date']
-test_url: http://blog.kaelig.fr/post/24877648508/preprocesseurs-css-renoncer-par-choix-ou-par \ No newline at end of file
diff --git a/data/GrabberConfig/blog.naver.com.txt b/data/GrabberConfig/blog.naver.com.txt
deleted file mode 100644
index 73c30c47..00000000
--- a/data/GrabberConfig/blog.naver.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //span[@class='pcol1 itemSubjectBoldfont']
-body: //div[@id='postListBody']
-date: //p[@class='date fil5 pcol2']
-single_page_link: /html/frameset/frame[1]/attribute::src
-strip: //div[@class='post-btn']
-test_url: http://blog.naver.com/how2invest/110135068757 \ No newline at end of file
diff --git a/data/GrabberConfig/blog.niqnutn.com.txt b/data/GrabberConfig/blog.niqnutn.com.txt
deleted file mode 100644
index aa2f1865..00000000
--- a/data/GrabberConfig/blog.niqnutn.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fblog.niqnutn.com%2Farticle35%2Fsteganographie-l-art-de-dissimuler-un-message
-
-body: //article[contains(concat(' ',normalize-space(@class),' '),' article-content ')]//section
-
-strip_id_or_class: sommaire
-
-test_url: http://blog.niqnutn.com/article35/steganographie-l-art-de-dissimuler-un-message
diff --git a/data/GrabberConfig/blog.pchome.net.txt b/data/GrabberConfig/blog.pchome.net.txt
deleted file mode 100644
index de81beba..00000000
--- a/data/GrabberConfig/blog.pchome.net.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# PCHOME blog, a popular Chinese blog host
-# Oct 15, 2011
-#
-
-title://*[contains(@class,'imp')]/h2
-
-date://*[contains(@class,'imp')]/span
-body://div[contains(@id,'blog_content')]
-
-
-
-test_url: http://blog.pchome.net/article/462502.html \ No newline at end of file
diff --git a/data/GrabberConfig/blog.pinboard.in.txt b/data/GrabberConfig/blog.pinboard.in.txt
deleted file mode 100644
index 40f0c560..00000000
--- a/data/GrabberConfig/blog.pinboard.in.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //a[@class="blog_title"]
-date: //p[@class="when"]/a
-body: //div[@class="blog_entry"]
-strip_id_or_class:blog_title
-strip_id_or_class:when
-test_url: http://blog.pinboard.in/2011/11/the_social_graph_is_neither/ \ No newline at end of file
diff --git a/data/GrabberConfig/blog.renren.com.txt b/data/GrabberConfig/blog.renren.com.txt
deleted file mode 100644
index 01938428..00000000
--- a/data/GrabberConfig/blog.renren.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# This filter is tested on:
-# http://blog.renren.com/share/224959024/14260739544
-# http://blog.renren.com/share/231323504/14261768898
-# http://blog.renren.com/share/230305019/1502806705
-
-title://h1[contains(@class, 'title-article')]
-author://span[contains(@class, 'name')]
-body://div[contains(@class, 'content-body')]
-
-convert_double_br_tags:yes
-test_url: http://blog.renren.com/share/224959024/14260739544
diff --git a/data/GrabberConfig/blog.sina.com.cn.txt b/data/GrabberConfig/blog.sina.com.cn.txt
deleted file mode 100644
index 4895272a..00000000
--- a/data/GrabberConfig/blog.sina.com.cn.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# Sina blog, the most popular blog host in China.
-# Its source code is horrible.
-#
-# Issue:
-# Only the first image in the article is displayed.
-# The rest images are replace by a 1x1 transparent gif by sina blog host.
-#
-
-title://*[contains(@class,'titName SG_txta')]
-author://*[contains(@id,'ownernick')]
-date://*[contains(@class,'time SG_txtc')]
-body://div[contains(@class,'articalContent')]
-
-# Remove redundant content which has span class start with "MASS"
-# Example <span class="MASSf21674ffeef7"></span>
-strip://span[contains(@class,'MASS')]
-
-# Remove comment
-strip://div[contains(@class,'allComm')]
-
-# Remove hiden text and link
-strip://ins
-
-tidy:no
-convert_double_br_tags:yes
-test_url: http://blog.sina.com.cn/s/blog_5054769e0102dtja.html \ No newline at end of file
diff --git a/data/GrabberConfig/blog.spu.edu.txt b/data/GrabberConfig/blog.spu.edu.txt
deleted file mode 100644
index 68bd4e39..00000000
--- a/data/GrabberConfig/blog.spu.edu.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body://div[@class='post']
-test_url: http://blog.spu.edu/lectio/from-the-frying-pan-into-the-fire/ \ No newline at end of file
diff --git a/data/GrabberConfig/blog.wells.ee.txt b/data/GrabberConfig/blog.wells.ee.txt
deleted file mode 100644
index eae6982b..00000000
--- a/data/GrabberConfig/blog.wells.ee.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2/a[@class="no-link title"]
-author: //h2[@id="blog_owner"]
-date: //time
-strip: //h2/a[@class="no-link title"]
-test_url: http://blog.wells.ee/retina
-test_url: http://blog.wells.ee/skeuomorphism \ No newline at end of file
diff --git a/data/GrabberConfig/blog.xebia.fr.txt b/data/GrabberConfig/blog.xebia.fr.txt
deleted file mode 100644
index de41260c..00000000
--- a/data/GrabberConfig/blog.xebia.fr.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fblog.xebia.fr%2F2015%2F11%2F18%2Fretour-sur-dockercon-eu-2015-12%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry ')]
-
-strip_id_or_class: yarpp-related
-strip_id_or_class: dd_button_v
-strip_id_or_class: c1
-strip_id_or_class: dd_end
-strip_id_or_class: dd_start
-strip_id_or_class: dd_outer
-
-test_url: http://blog.xebia.fr/2015/11/18/retour-sur-dockercon-eu-2015-12/
diff --git a/data/GrabberConfig/blogs.aljazeera.net.txt b/data/GrabberConfig/blogs.aljazeera.net.txt
deleted file mode 100644
index 2a66952b..00000000
--- a/data/GrabberConfig/blogs.aljazeera.net.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# 2011-08-23 [carlo@...] Initial version.
-
-author: //div[@id="blogauthordatebox-node"]//a[@title="View user profile."]/text()
-
-# why yes, I do feel a bit dirty
-date: substring-before( substring-after( substring-after( //div[@id="blogauthordatebox-node"]//td[3], "on " ), ", "), " " )
-
-test_url: http://blogs.aljazeera.net/asia/2011/08/22/peoples-hero \ No newline at end of file
diff --git a/data/GrabberConfig/blogs.faz.net.txt b/data/GrabberConfig/blogs.faz.net.txt
deleted file mode 100644
index 4f2626f1..00000000
--- a/data/GrabberConfig/blogs.faz.net.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-# Author: zinnober
-
-tidy: no
-prune: no
-
-# Set author
-author: //a[@rel='author']
-
-# Set date
-date: //span[@class='Datum']
-
-# Content is here
-body: //div[@class='Artikel']
-
-# Tidy up before article
-strip: //div[@id='FAZHeaderNeu']
-strip: //h2[@itemprop='headline']
-strip: //span[@class='Datum']
-strip: //span[@class='Autor']
-strip_id_or_class: ArticlePagerTop
-strip: //div[@class='FAZArtikelEinleitung']/h2
-
-# General cleanup
-strip: //div[@class='clear']
-strip: //span[@class='Bildnachweis']
-strip: //iframe
-strip_id_or_class: Community
-strip: ' · '
-
-# Remove tracking and ads
-strip_image_src: /l.gif?
-strip: //img[@width='1']
-strip_id_or_class: invisible
-strip_id_or_class: Anzeige
-strip_id_or_class: billboard
-
-# Remove clutter after article
-strip_id_or_class: Tagline
-strip_id_or_class: ArtikelAbbinder
-strip_id_or_class: FAZArtikelKommentare
-strip_id_or_class: ArtikelKommentieren
-strip_id_or_class: FAZContentRight
-
-# Try it yourself
-test_url: http://blogs.faz.net/wost/2014/08/17/viel-fuck-und-wenig-guter-sex-1239/
diff --git a/data/GrabberConfig/blogs.forbes.com.txt b/data/GrabberConfig/blogs.forbes.com.txt
deleted file mode 100644
index 86580d21..00000000
--- a/data/GrabberConfig/blogs.forbes.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='entry']
-test_url: http://blogs.forbes.com/adamhartung/2011/04/08/apple-is-better-managed-than-microsoft/ \ No newline at end of file
diff --git a/data/GrabberConfig/blogs.hbr.org.txt b/data/GrabberConfig/blogs.hbr.org.txt
deleted file mode 100644
index d47c3520..00000000
--- a/data/GrabberConfig/blogs.hbr.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[@id='pageFeature']/h1
-body: //div[@id='articleBody']
-strip: //div[@class='module wide']
-test_url: http://blogs.hbr.org/bregman/2011/04/the-1-killer-of-meetings-and-w.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+harvardbusiness+%28HBR.org%29 \ No newline at end of file
diff --git a/data/GrabberConfig/blogs.msdn.com.txt b/data/GrabberConfig/blogs.msdn.com.txt
deleted file mode 100644
index 11b8d42d..00000000
--- a/data/GrabberConfig/blogs.msdn.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h3[@class="post-name"]
-author: //span[@class="user-name"]
-date: //div[@class="post-date"]/span[@class="value"]
-body: //div[@class="post-content user-defined-markup"]
-footnotes: no
-test_url: http://blogs.msdn.com/b/b8/archive/2011/10/04/designing-the-start-screen.aspx
diff --git a/data/GrabberConfig/blogs.reuters.com.txt b/data/GrabberConfig/blogs.reuters.com.txt
deleted file mode 100644
index d3eb9966..00000000
--- a/data/GrabberConfig/blogs.reuters.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //div[@id='single']/h1
-body: //div[@id='postcontent']
-test_url: http://blogs.reuters.com/felix-salmon/2010/07/16/the-value-of-a-strong-brand-apple-edition/ \ No newline at end of file
diff --git a/data/GrabberConfig/blogs.scientificamerican.com.txt b/data/GrabberConfig/blogs.scientificamerican.com.txt
deleted file mode 100644
index 2102015d..00000000
--- a/data/GrabberConfig/blogs.scientificamerican.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# meta data
-title://h1[@class = 'postTitle']
-author:substring-before(substring-after(//span[@class = 'byline'],'By '),'|')
-date://span[@class = 'datestamp']
-
-#body content
-body://div[@id = 'singleBlogPost']
-
-#reclaim author info
-move_into(//div[@id = 'singleBlogPost'])://div[@id = 'aboutAuthorDiv']
-strip://p[@class = 'moreLink mobileHide']
-
-#cleanup comments, there might be some open <div> sections
-strip://div[@id = 'comments2']
-strip://h3[a[@href = '#add-comment']]
-test_url: http://blogs.scientificamerican.com/a-blog-around-the-clock/2012/07/10/science-blogs-definition-and-a-history/ \ No newline at end of file
diff --git a/data/GrabberConfig/blogs.smithsonianmag.com.txt b/data/GrabberConfig/blogs.smithsonianmag.com.txt
deleted file mode 100644
index 1bc65e77..00000000
--- a/data/GrabberConfig/blogs.smithsonianmag.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-# metadata
-author://div[@class = 'post']/div[@class='meta']/a[1]
-date://div[@id = 'rap']/h2[1]
-body://div[@class = 'post']
-
-# wrapping caption and image
-wrap_in(fieldset)://div[contains(@class, 'wp-caption')]
-
-
-# clean up
-strip://div[@class = 'post']/h3[@class = 'storytitle']
-strip://div[@class = 'post']/div[@class = 'social']
-strip://img[@style = 'display:none;']
-strip://img[@height='0' and @width='0']
-test_url: http://blogs.smithsonianmag.com/adventure/2011/10/tips-for-women-traveling-in-turkey/ \ No newline at end of file
diff --git a/data/GrabberConfig/blogs.technet.com.txt b/data/GrabberConfig/blogs.technet.com.txt
deleted file mode 100644
index 3d0fbadc..00000000
--- a/data/GrabberConfig/blogs.technet.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h3[@class="post-name"]
-author: //span[@class="user-name"]
-date: //div[@class="post-date"]
-body: //div[@class="post-content user-defined-markup"]
-strip_id_or_class: log-feedback-list
-tidy: no
-footnotes: no
-test_url: http://blogs.technet.com/b/dlemson/archive/2004/03/03/83304.aspx
-test_url: http://blogs.technet.com/b/isablog/archive/2009/01/07/a-pptp-client-might-fail-to-connect-to-a-vpn-server-on-the-internet-through-an-isa-server-2006.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/bloomberg.com.txt b/data/GrabberConfig/bloomberg.com.txt
deleted file mode 100644
index 0930cb43..00000000
--- a/data/GrabberConfig/bloomberg.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-date: //*[@itemprop='datePublished']/@datetime
-author: //meta[@name="sailthru.author"]/@content
-body: //*[@itemprop='articleBody' or @itemprop='description']
-
-strip_id_or_class: inline-newsletter
-strip_id_or_class: terminal-tout-container
-strip_id_or_class: lede
-
-test_url: http://www.bloomberg.com/news/articles/2015-12-30/will-your-job-disappear-by-2024-
-test_contains: Every week, hosts Tori Stilwell
-test_url: https://www.bloomberg.com/news/articles/2016-12-06/apple-to-start-publishing-ai-research-to-hasten-deep-learning
diff --git a/data/GrabberConfig/bluetouff.com.txt b/data/GrabberConfig/bluetouff.com.txt
deleted file mode 100644
index 543d3920..00000000
--- a/data/GrabberConfig/bluetouff.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body://div[@class='entry']
-date://div[@class='meta']
-strip://a[@class='FlattrButton']
-test_url: http://bluetouff.com/2012/03/02/polemique-google-vie-privee/ \ No newline at end of file
diff --git a/data/GrabberConfig/boagworld.com.txt b/data/GrabberConfig/boagworld.com.txt
deleted file mode 100644
index 3b3da991..00000000
--- a/data/GrabberConfig/boagworld.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class="entry-title"][2]
-author: string("Paul Boag")
-date: substring(//span[@class="meta"], 11)
-body: //article
-strip: //h2
-strip: //h1
-strip: //div[@id="callsToAction"]
-test_url: http://boagworld.com/working-in-web-design/dealing-with-the-dickheads/ \ No newline at end of file
diff --git a/data/GrabberConfig/boingboing.net.txt b/data/GrabberConfig/boingboing.net.txt
deleted file mode 100644
index 4f39661b..00000000
--- a/data/GrabberConfig/boingboing.net.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# This is far from perfect, but so is BoingBoing's markup
-title: //h2[@class="headline"]
-single_page_link: //h2[@class="headline"]/a
-#date: //p[@class="byline"]
-body: //div[@class="post"]
-
-strip_id_or_class: shareMe
-strip_id_or_class: authorbox
-strip_id_or_class: byline
-
-test_url: http://boingboing.net/2011/10/23/understanding-the-hyperrich-through-the-lens-of-tomorrows-history.html \ No newline at end of file
diff --git a/data/GrabberConfig/book.douban.com.txt b/data/GrabberConfig/book.douban.com.txt
deleted file mode 100644
index fe2d2cbf..00000000
--- a/data/GrabberConfig/book.douban.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //span[@property='v:description']
-date: //span[@property='v:dtreviewed']
-author: //span[@property='v:reviewer']
-prune: no
-
-test_url: http://book.douban.com/review/2422662/ \ No newline at end of file
diff --git a/data/GrabberConfig/bookforum.com.txt b/data/GrabberConfig/bookforum.com.txt
deleted file mode 100644
index 03b60039..00000000
--- a/data/GrabberConfig/bookforum.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-#metadata
-title://div[@class = 'Topper']/h1
-author://div[@class = 'Topper']/h3
-date://div[@class = 'Topper']/h6
-body://div[@class = 'Core']
-
-
-
-# clean up
-strip://div[@class = 'Topper']/h1
-strip://div[@class = 'Topper']/h3
-strip://div[@class = 'Topper']/h4
-strip://div[@class = 'Topper']/h5
-strip://div[@class = 'Topper']/h6
-strip://br[@clear = 'all']
-strip://div[@class = 'adCore']
-strip://div[@class = 'BookR']
-strip://div[@class = 'InfoBox']
-test_url: http://bookforum.com/inprint/018_04/8595 \ No newline at end of file
diff --git a/data/GrabberConfig/borderhouseblog.com.txt b/data/GrabberConfig/borderhouseblog.com.txt
deleted file mode 100644
index b4e116fe..00000000
--- a/data/GrabberConfig/borderhouseblog.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title://h1
-author://div[@class="meta"]/span/a
-date://div[@class="date"]
-body://div[@class="content article"]
-strip://div[@class="content article"]/h1
-
-test_url: http://borderhouseblog.com/?p=7832 \ No newline at end of file
diff --git a/data/GrabberConfig/bostonglobe.com.txt b/data/GrabberConfig/bostonglobe.com.txt
deleted file mode 100644
index e6871a01..00000000
--- a/data/GrabberConfig/bostonglobe.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# NOTE: If testing this configuration yields bad results, including junk text like "Try BostonGlobe.com today" and "THIS STORY APPEARED IN", please replace the Test URL with a current-day headline link from bostonglobe.com.
-
-title: //div[@class="header"]/h1
-author: substring-after(//div[@class="byline"]/h2[@class="author"],"By ")
-date: //div[@class="byline"]/p[last()]
-body: //div[@class="article-body"]
-
-strip_id_or_class: aside
-strip_id_or_class: promo
-strip_id_or_class: skip-nav
-strip_id_or_class: article-more
-strip_id_or_class: article-bar
-strip_id_or_class: post-comment
-
-# This removes image captions. If the parser starts saving images from bostonglobe.com (currently, it does not), then this directive should be removed.
-strip_id_or_class: figure
-
-test_url: http://bostonglobe.com/news/nation/2012/03/17/illinois-primary-could-pivotal/PsDzFZqvhEYyXbOcF9FOkO/story.html
-test_url: http://www.bostonglobe.com/news/bigpicture/2016/09/13/paralympics/qcL3h79ohDG6O69GRWLRuK/story.html
diff --git a/data/GrabberConfig/boundlessline.org.txt b/data/GrabberConfig/boundlessline.org.txt
deleted file mode 100644
index a836e1e2..00000000
--- a/data/GrabberConfig/boundlessline.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: substring-before(//title, '|')
-body: //div[@class="entry"]
-# Remove the author's picture
-strip: //div[@class="entry"]/a[1]
-test_url: http://www.boundlessline.org/2011/06/the-nyts-on-gender-over-the-weekend.html \ No newline at end of file
diff --git a/data/GrabberConfig/bowdoinorient.com.txt b/data/GrabberConfig/bowdoinorient.com.txt
deleted file mode 100644
index 932143d1..00000000
--- a/data/GrabberConfig/bowdoinorient.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //*[@class='articletitle']
-body: //*[(@id='articlebody')]
-date: //*[(@class='articledate')]
-author: //*[(@class='articleauthor')]
-autodetect_next_page: no
-test_url: http://bowdoinorient.com/article/8045 \ No newline at end of file
diff --git a/data/GrabberConfig/brainfacts.org.txt b/data/GrabberConfig/brainfacts.org.txt
deleted file mode 100644
index 9705f621..00000000
--- a/data/GrabberConfig/brainfacts.org.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //div[@class="standard"]/h1
-author: string("BrainFacts.org")
-date: //div[@class="meta"]/strong
-
-strip: //p[@class="skip"]
-strip: //div[@class="meta"]
-strip: //div[@class="standard"]/h1
-strip: //div[@class="modal"]
-strip: //div[@class="columnRight"]
-test_url: http://brainfacts.org/diseases-disorders/childhood-disorders/articles/2011/autism-the-pervasive-developmental-disorder/ \ No newline at end of file
diff --git a/data/GrabberConfig/brainpickings.org.txt b/data/GrabberConfig/brainpickings.org.txt
deleted file mode 100644
index c8aae090..00000000
--- a/data/GrabberConfig/brainpickings.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class='entry-title']
-body: //div[@id='main_body']
-strip: //div[@id='bottom_donation']
-strip: //div[@id='bottom_newsletter']
-strip: //div[@id='end_print']
-
-test_url: https://www.brainpickings.org/2016/05/26/river-of-shadows-rebecca-solnit-muybridge/
diff --git a/data/GrabberConfig/brandeins.de.txt b/data/GrabberConfig/brandeins.de.txt
deleted file mode 100644
index be326346..00000000
--- a/data/GrabberConfig/brandeins.de.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-
-body: //div[@class="articleTeaser"] | //section[@class="contentSection"]
-
-strip: //section[@class="greenBox italic"]
-
-author: //div[@class="articleAuthor"]
-# no publish date on page (the articles are from a monthly periodical)
-
-test_url: http://www.brandeins.de/archiv/2015/fuehrung/ministry-group-mach-doch-mal-ne-ansage/
diff --git a/data/GrabberConfig/brandingstrategyinsider.com.txt b/data/GrabberConfig/brandingstrategyinsider.com.txt
deleted file mode 100644
index fc020539..00000000
--- a/data/GrabberConfig/brandingstrategyinsider.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-date://h2[@class="date-header"]
-body://div[@class="entry-content"]
-test_url: http://www.brandingstrategyinsider.com/2011/12/top-twelve-branding-keys-for-2012.html \ No newline at end of file
diff --git a/data/GrabberConfig/brasil.elpais.com.txt b/data/GrabberConfig/brasil.elpais.com.txt
deleted file mode 100644
index 6a22dcb7..00000000
--- a/data/GrabberConfig/brasil.elpais.com.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-title: //meta[@name='DC.title']/@content
-title: //div[contains(@class, 'cabecera_noticia')]//h1
-date: //meta[@name='DC.date']/@content
-date: //meta[@name='date']/@content
-body: //div[@class='columna_texto']
-body: //div[@id='cuerpo_noticia']
-body: //div[@class='estructura_2col_1zq']//div[@class='margen_n']
-
-prune: no
-
-strip_id_or_class: disposicion_vertical
-strip_id_or_class: ampliar_foto
-strip_id_or_class: utilidades
-strip_id_or_class: info_relacionada
-strip_id_or_class: m-kiosko
-strip_id_or_class: info_complementa
-
-strip: //p[@class='nota_pie']
-strip: //div[starts-with(@id, 'sumario') and contains(., 'más información')]
-strip: //div[@id='coment' or @id='foros_not']
-
-test_url: http://brasil.elpais.com/brasil/2014/10/15/politica/1413334841_878730.html
-test_contains: O PT quer intensificar a presença do ex-presidente
-
-test_url: http://brasil.elpais.com/brasil/2014/10/13/internacional/1413225730_450761.html
-test_contains: Todos na localidade onde ele nasceu ainda falavam da façanha
diff --git a/data/GrabberConfig/brettterpstra.com.txt b/data/GrabberConfig/brettterpstra.com.txt
deleted file mode 100644
index 55da1787..00000000
--- a/data/GrabberConfig/brettterpstra.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='post full']
-title: //h1
-author: substring-after(//title, '- ')
-date: //span[@class='date']
-test_url: http://brettterpstra.com/byword-for-ios/ \ No newline at end of file
diff --git a/data/GrabberConfig/brisbanetimes.com.au.txt b/data/GrabberConfig/brisbanetimes.com.au.txt
deleted file mode 100644
index 27e6b70c..00000000
--- a/data/GrabberConfig/brisbanetimes.com.au.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='articleBody']
-test_url: http://www.brisbanetimes.com.au/opinion/blogs/blunt-instrument/losing-our-minds--for-24-hours-20120118-1q682.html \ No newline at end of file
diff --git a/data/GrabberConfig/brokernews.com.au.txt b/data/GrabberConfig/brokernews.com.au.txt
deleted file mode 100644
index 814da38a..00000000
--- a/data/GrabberConfig/brokernews.com.au.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-author: //span[@itemprop="author"]
-date: //span[@itemprop="datePublished"]
diff --git a/data/GrabberConfig/brookings.edu.txt b/data/GrabberConfig/brookings.edu.txt
deleted file mode 100644
index 17a47605..00000000
--- a/data/GrabberConfig/brookings.edu.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //div[@id='contentheader']/h1
-author: //p[@class='attribution']/span[@class='author']/*
-# Is there a way to pull multiple authors? My XPath here is just grabbing the first
-
-date: /html/head/meta[@name="date"]/@content
-body: //div[@class='main-content']
-
-strip: //p[@class='byline']
-strip: //div[@class='img-gallery']
-strip: //div[@class='callout']
-strip: //div[@class='add-your-view']
-convert_double_br_tags: yes
-test_url: http://www.brookings.edu/opinions/2011/1018_cyberattack_libya_goldsmith.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/brooksreview.net.txt b/data/GrabberConfig/brooksreview.net.txt
deleted file mode 100644
index d33d7d4e..00000000
--- a/data/GrabberConfig/brooksreview.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1
-body: //div[@class='article']
-body: //div[@class='post']
-date: //*[@id='single']/span
-prune: no
-test_url: http://brooksreview.net/2011/11/readability-agency/ \ No newline at end of file
diff --git a/data/GrabberConfig/bt.no.txt b/data/GrabberConfig/bt.no.txt
deleted file mode 100644
index 200c2e4e..00000000
--- a/data/GrabberConfig/bt.no.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h1[contains(@class,'articleTitle')]
-author: //span[@itemprop='name']
-date: //time[@class='published']
-body: //div[contains(@class,'bodyText')]
-
-strip_id_or_class: 'pull1'
-strip_id_or_class: 'relationArticle'
-strip: //span[@class='quote']
-
-# strip h2 if at end of article (typically a request for comments)
-strip: //div[contains(@class,'bodyText')]/node()[last()-1]/self::h2
-test_url: http://www.bt.no/meninger/debatt/Typisk-norsk-a-vare-god-nok-2884108.html \ No newline at end of file
diff --git a/data/GrabberConfig/buffed.de.txt b/data/GrabberConfig/buffed.de.txt
deleted file mode 100644
index 3dd36ce6..00000000
--- a/data/GrabberConfig/buffed.de.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-date: //meta[@itemProp='datePublished']/@content
-body: //div[@class='intro' or contains(@class, 'article_text')]
-prune: no
-strip_id_or_class: embedcode
-strip_id_or_class: EmbedSwitch
-strip_id_or_class: EmbedText
-strip_id_or_class: bildergalerie
-strip_id_or_class: subline_seohour_image
-strip_id_or_class: ova-player
-strip_id_or_class: jcarouseloutput
-strip_id_or_class: cbox_embedded
-
-test_url: http://www.buffed.de/SWTOR-Star-Wars-The-Old-Republic-PC-218697/News/SWTOR-Ab-Patch-24-Lore-Klamotten-faerben-1090051/
-test_url: http://www.buffed.de/feed.cfm?menu_alias=home \ No newline at end of file
diff --git a/data/GrabberConfig/buquad.com.txt b/data/GrabberConfig/buquad.com.txt
deleted file mode 100644
index f0fd08db..00000000
--- a/data/GrabberConfig/buquad.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1
-author: //h2/a
-date: substring-after(//h2, '|')
-strip_id_or_class: 'attachment'
-strip: //h3
-
-body: //div[@class='entry']
-test_url: http://buquad.com/2012/04/09/paul-ryan/ \ No newline at end of file
diff --git a/data/GrabberConfig/business.time.com.txt b/data/GrabberConfig/business.time.com.txt
deleted file mode 100644
index 5502beae..00000000
--- a/data/GrabberConfig/business.time.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# 2011-10-25 - carlo@... - Initial setup.
-
-single_page_link: //li[@class='print']/a/@href
-
-title: //h1
-author: //meta[@name="byline"]/@content
-date: //meta[@name="date"]/@content
-
-strip: //span[@class="see"]
-strip: //div[@class="byline"]
-strip: //div[@id="date2"]
-strip: //h1
-strip: //div[@class='post-rail-ad']
-strip: //div[@class='post-rail-content']
-strip: //aside[@class='post-rail']
-
-test_url: http://www.time.com/time/specials/packages/article/0,28804,2094921_2094923_2094924,00.html
diff --git a/data/GrabberConfig/business2community.com.txt b/data/GrabberConfig/business2community.com.txt
deleted file mode 100644
index 0dcc7ff8..00000000
--- a/data/GrabberConfig/business2community.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-date: substring-after(//p[@class='byline'],'Published')
-
-strip: //div[@class='article-meta']
-
-test_url: http://www.business2community.com/social-media/funky-ways-to-print-instagram-photos-0485340
diff --git a/data/GrabberConfig/businessinsider.com.txt b/data/GrabberConfig/businessinsider.com.txt
deleted file mode 100644
index 39eb7426..00000000
--- a/data/GrabberConfig/businessinsider.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title://div[@class="sl-layout-post"]/h1
-body: //div[contains(@class, 'post-content') or contains(@class, 'slide-module') or contains(@class, 'KonaBody')]
-strip: //div[contains(@class, "post-sidebar")]
-strip: //div[@id='related-links']
-strip: //div[@class='related-links-container']
-strip: //p[@class='source']
-author://div[@class="byline"]/a
-date://div[@class="byline"]/span[@class="date"]
-prune: no
-
-single_page_link: //a[contains(text(), 'View as one page')]
-
-strip://*[contains(@class,'sponsored-text')]
-strip: //div[@id='post_footer']
-
-test_url: http://www.businessinsider.com/microsoft-just-put-one-of-its-hardcore-technical-geniuses-on-xbox-2012-1
diff --git a/data/GrabberConfig/businessnews.com.tn.txt b/data/GrabberConfig/businessnews.com.tn.txt
deleted file mode 100644
index 6502b8e1..00000000
--- a/data/GrabberConfig/businessnews.com.tn.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //div[@id='article_detail']
-title: //meta[@property='og:title']/@content
-date: //div[@id='date_com_art']//a[@class='date']
-author: //div[@id='article_detail']//font[@class='auteur']
-
-strip_id_or_class: porte_titre_theme
-strip_id_or_class: cont_param
-strip_id_or_class: date_com_art
-
-prune: no
-
-test_url: http://www.businessnews.com.tn/details_article.php?a=31073&t=522&lang=fr&temp=1 \ No newline at end of file
diff --git a/data/GrabberConfig/businessweek.com.txt b/data/GrabberConfig/businessweek.com.txt
deleted file mode 100644
index f546b708..00000000
--- a/data/GrabberConfig/businessweek.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# include the lead graphic in the body, if available
-body: //div[contains(concat(' ', normalize-space(@id), ' '), ' lead_graphic ')] | //div[contains(concat(' ', normalize-space(@itemprop), ' '), ' articleBody ')]
-title: //h1[contains(concat(' ', normalize-space(@itemprop), ' '), ' headline ')]
-date: //time[contains(concat(' ', normalize-space(@itemprop), ' '), ' datePublished ')]
-
-strip_id_or_class: photo_credit
-strip_id_or_class: photo_caption
-strip_id_or_class: inline_gallery
-# pull quote, often inside a blockquote element
-strip_id_or_class: pq
-strip_id_or_class: credit
-strip_id_or_class: figcaption
-strip_id_or_class: related_item
-
-test_url: http://www.businessweek.com/magazine/buyback-insurance-a-good-deal-for-retailers-07282011.html
-test_url: http://www.businessweek.com/articles/2012-06-06/american-pain-the-largest-u-dot-s-dot-pill-mills-rise-and-fall
-test_url: http://www.businessweek.com/articles/2014-07-09/american-apparel-dov-charneys-sleazy-struggle-for-control
diff --git a/data/GrabberConfig/buzzfeed.com.txt b/data/GrabberConfig/buzzfeed.com.txt
deleted file mode 100644
index ea88ea47..00000000
--- a/data/GrabberConfig/buzzfeed.com.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-# Creator: Greg Leuch <greg@...>
-
-# It can be messy.
-tidy:no
-
-# The basic template.
-title: //h1[@data-print='title']
-author: //a[@data-print='author']
-date: //time[@data-print='date']
-body: //div[@data-print='body']
-body: //section[@data-print='body']
-
-find_string: rel:bf_image_src=
-replace_string: src=
-find_string: src="data:
-replace_string: disabled_src="data:
-
-native_ad_clue: //meta[@property="article:section" and @content="Advertiser"]
-
-# For various things...
-strip: *[@data-print="ignore"]
-test_url: http://www.buzzfeed.com/hgrant/35-reasons-why-dogs-hate-the-holidays
-# Native ad
-test_url: http://www.buzzfeed.com/bravo/ways-to-up-your-online-dating-game \ No newline at end of file
diff --git a/data/GrabberConfig/bygonebureau.com.txt b/data/GrabberConfig/bygonebureau.com.txt
deleted file mode 100644
index 63c82130..00000000
--- a/data/GrabberConfig/bygonebureau.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1
-author: //a[contains(@href, '/author/')]
-date: //*[@class='post-date']
-strip: //*[@class='post-date']
-strip: //h1
-test_url: http://bygonebureau.com/2011/06/20/an-existential-psychoanalysis/ \ No newline at end of file
diff --git a/data/GrabberConfig/cable.co.uk.txt b/data/GrabberConfig/cable.co.uk.txt
deleted file mode 100644
index 435bf3b5..00000000
--- a/data/GrabberConfig/cable.co.uk.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@class='page-content']//h1
-body: //div[@class='page-content']
-strip_id_or_class: editorial-bar-top
-strip_id_or_class: social-bottom
-strip_id_or_class: comment-form
-strip_id_or_class: pc-why
-
-prune: no
-tidy: no
-
-test_url: http://www.cable.co.uk/news/bt-vision-unveils-interactive-guide-application-800734218/ \ No newline at end of file
diff --git a/data/GrabberConfig/caffereggio.net.txt b/data/GrabberConfig/caffereggio.net.txt
deleted file mode 100644
index 08e1f05a..00000000
--- a/data/GrabberConfig/caffereggio.net.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class="pf-content"]
-
-test_url: http://www.caffereggio.net/2016/01/16/115327/
diff --git a/data/GrabberConfig/canonrumors.com.txt b/data/GrabberConfig/canonrumors.com.txt
deleted file mode 100755
index c22cf4f1..00000000
--- a/data/GrabberConfig/canonrumors.com.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-# Author: zinnober
-
-tidy: no
-prune: no
-
-# Set title
-title: //h2
-
-date: //li[@class='time']
-
-# Set author
-author: //a[contains(@rel, 'author')]
-
-# Content is here
-body: //div[@id='content']
-
-# Tidy up before article
-strip: //div[@class='meta']
-
-# Tidy up after article
-strip_id_or_class: nr_related_placeholder
-strip_id_or_class: twitter-share-button
-strip_id_or_class: afterpost
-strip_id_or_class: tags
-
-# Try it yourself
-test_url: http://www.canonrumors.com/2014/09/chuck-westfall-talks-canon-eos-7d-mark-ii/
-test_url: http://www.canonrumors.com/2014/09/canon-cinema-eos-captures-space-in-4k-for-new-imax-3d-film/
diff --git a/data/GrabberConfig/captaineconomics.fr.txt b/data/GrabberConfig/captaineconomics.fr.txt
deleted file mode 100644
index 036e0281..00000000
--- a/data/GrabberConfig/captaineconomics.fr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.captaineconomics.fr%2F-les-immigres-recemment-arrives-en-france-qui-sont-ils-insee
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post_content ')]
-test_url: http://www.captaineconomics.fr/-les-immigres-recemment-arrives-en-france-qui-sont-ils-insee
diff --git a/data/GrabberConfig/cardboardconnection.com.txt b/data/GrabberConfig/cardboardconnection.com.txt
deleted file mode 100644
index 49f34302..00000000
--- a/data/GrabberConfig/cardboardconnection.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class='producttabbed-title']
-body: //div[@class='postTabs_divs postTabs_curr_div']
-strip: //div[@class='ratingblock2']
-strip: //p[@id='breadcrumbs']
-strip: //div[@style='display: none']
-
-
-test_url: http://www.cardboardconnection.com/2012-topps-archives-baseball-cards \ No newline at end of file
diff --git a/data/GrabberConfig/cars.com.txt b/data/GrabberConfig/cars.com.txt
deleted file mode 100644
index 71c5c050..00000000
--- a/data/GrabberConfig/cars.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[contains(@class, 'basicInfo')]//h1
-
-body: //img[@id='chosenPhotoIMG'] | //div[@id='aboutThisVehicleBox']
-
-prune: no
-
-test_url: http://www.cars.com/go/search/detail.jsp?listingId=115364779 \ No newline at end of file
diff --git a/data/GrabberConfig/catb.org.txt b/data/GrabberConfig/catb.org.txt
deleted file mode 100644
index 2cd197fb..00000000
--- a/data/GrabberConfig/catb.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@class='article']
-strip: //div[@class='revhistory']
-strip: //div[@class='toc']
-tidy: no
-prune: no
-
-test_url: http://catb.org/~esr/faqs/smart-questions.html \ No newline at end of file
diff --git a/data/GrabberConfig/cbc.ca.txt b/data/GrabberConfig/cbc.ca.txt
deleted file mode 100644
index ba5faf3f..00000000
--- a/data/GrabberConfig/cbc.ca.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[contains(@class, 'headline')]/h1
-author: //h5[contains(@class, 'byline')]
-date: substring-after(//h4[contains(@class, 'posted')], 'Posted: ')
-body: //div[@id="storyboard"]
-test_url: http://www.cbc.ca/news/world/story/2012/01/16/cruise-ship-monday.html \ No newline at end of file
diff --git a/data/GrabberConfig/cbn.com.txt b/data/GrabberConfig/cbn.com.txt
deleted file mode 100644
index de8d8839..00000000
--- a/data/GrabberConfig/cbn.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[contains(@class, 'articleText')]
-date: //div[contains(@class, 'articleDate')]
-author: //a[contains(@id, 'articleDetails_lnkByLine')]
-prune: no
-
-test_url: http://www.cbn.com/cbnnews/world/2013/June/Chilly-G-8-Obama-Putin-Agree-to-Disagree-on-Syria/
-test_url: http://www.cbn.com/cbnnews/world/2013/June/UK-Agency-Accused-of-Hacking-Foreign-Diplomats/
-test_url: http://www.cbn.com/cbnnews/feed/ \ No newline at end of file
diff --git a/data/GrabberConfig/cbsnews.com.txt b/data/GrabberConfig/cbsnews.com.txt
deleted file mode 100644
index 04d20230..00000000
--- a/data/GrabberConfig/cbsnews.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-date: //meta[@name="published"]/@content
-date: //div[@class="timeLine"]
-title: //div[@id='contentBody']//h1
-author: //dl[@class="storyBlogByline"]/dd/a
-body: //div[@id='storyMediaBox'] | //div[contains(@class, 'storyText')]
-
-# Content Pruning
-strip: //div[@class="scrollingArrows"]
-strip: //div[@class="timeLine"]
-strip: //dl[@class="storyBlogByline"]
-strip: //span[@class='image-credit']
-
-prune: no
-
-test_url: http://www.cbsnews.com/8301-201_162-57366361/rescued-americans-dad-proud-of-the-u.s/
diff --git a/data/GrabberConfig/chareidi.org.txt b/data/GrabberConfig/chareidi.org.txt
deleted file mode 100644
index de34a7d8..00000000
--- a/data/GrabberConfig/chareidi.org.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: //h1
-test_url: http://www.chareidi.org/archives5772/tetzaveh/TZV72adraft.htm \ No newline at end of file
diff --git a/data/GrabberConfig/chinamining.org.txt b/data/GrabberConfig/chinamining.org.txt
deleted file mode 100644
index d00d65de..00000000
--- a/data/GrabberConfig/chinamining.org.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //*[@id='Content']/span[1]
-author: substring-after(substring-before(//*[@id='Content']/span[2], ')'), '(')
-date: substring-before(substring-after(//*[@id='Content']/span[2], 'Updated: '), 'Counter')
-
-strip: //*[@id='Content']/span[1]
-strip: //*[@id='Content']/span[2]
-
-body: //*[@id='Content']
-
-test_url: http://www.chinamining.org/News/2011-07-22/1311319069d48087.html \ No newline at end of file
diff --git a/data/GrabberConfig/choice.com.au.txt b/data/GrabberConfig/choice.com.au.txt
deleted file mode 100644
index 02714755..00000000
--- a/data/GrabberConfig/choice.com.au.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-
-body: //div[@id='content']//div[@id='mainBlogContentWrapper']//*[self::p or self::img or self::ul] | //div[@class='mainArticleIntro')]
-
-date: //span[@class='date']
diff --git a/data/GrabberConfig/chomsky.info.txt b/data/GrabberConfig/chomsky.info.txt
deleted file mode 100644
index 21c945e1..00000000
--- a/data/GrabberConfig/chomsky.info.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //*[@class='title']
-author: //*[@class='author']
-prune: no
-
-test_url: https://chomsky.info/20150820-2/
-test_contains: The first prime-time Republican primary debate
diff --git a/data/GrabberConfig/chrisltd.com.txt b/data/GrabberConfig/chrisltd.com.txt
deleted file mode 100644
index 86d0f5db..00000000
--- a/data/GrabberConfig/chrisltd.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //header/h1/b[contains(@class, 'title')]
-author: substring-after(//article/header/div, 'By ')
-date: //header/h1/span[contains(@class, 'date')]
-body: //div[@id='main]/article
-strip: //header
-test_url: http://chrisltd.com/blog/2012/03/fix-widows-indesign/ \ No newline at end of file
diff --git a/data/GrabberConfig/christianitytoday.com.txt b/data/GrabberConfig/christianitytoday.com.txt
deleted file mode 100644
index 86be14ce..00000000
--- a/data/GrabberConfig/christianitytoday.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title://div[@class='title']
-author://div[@class='byline']/b
-date:substring-after(//div[@class='byline'], 'posted')
-body://div[@id='body']
-wrap_in(h2)://span[@class='subhead']
-wrap_in(i)://p[@class='bio']
-wrap_in(i)://p[@class='copyright']
-strip://div[@class='title']
-strip://div[@class='deck']
-strip://div[@class='byline']
-strip://div[@class='copyright']
-strip://br
-test_url: http://www.christianitytoday.com/ct/2012/aprilweb-only/my-god-forsaken-me.html \ No newline at end of file
diff --git a/data/GrabberConfig/christies.com.txt b/data/GrabberConfig/christies.com.txt
deleted file mode 100644
index b3c76519..00000000
--- a/data/GrabberConfig/christies.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-tidy: no
-prune: no
-date: //article//time[@pubdate]
-title: //article/header/h2
-body: //article
-test_url: http://www.christies.com/LotFinder/custom/lot_details_MultiLanguage.aspx?from=salesummary&intObjectID=5556662&sid=e536ed1a-b763-41c4-afcf-c94815ec6eee&LID=3 \ No newline at end of file
diff --git a/data/GrabberConfig/chrome.google.com.txt b/data/GrabberConfig/chrome.google.com.txt
deleted file mode 100644
index 5a1d043d..00000000
--- a/data/GrabberConfig/chrome.google.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //pre[@id='cx-desc-text']
-body: //div[contains(@class, 'overview-tab-right-bar-info')]
-title: //h1[contains(@class, 'detail-dialog-title')]
-tidy: no
-prune: no
-replace_string(<noscript>): <div>
-replace_string(</noscript>): </div>
-
-test_url: https://chrome.google.com/webstore/detail/pnaiinchjaonopoejhknmgjingcnaloc \ No newline at end of file
diff --git a/data/GrabberConfig/chronicle.com.txt b/data/GrabberConfig/chronicle.com.txt
deleted file mode 100644
index 227a03c7..00000000
--- a/data/GrabberConfig/chronicle.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1[contains(@class, "entry-title")]
-author: //p[contains(@class, "byline")]
-
-# all (?) other articles
-body: //div[@class="content-item__story"]
-date: //p[contains(@class, "dateline")]
-
-# note that if you're not a Chronicle subscriber (personally or institutionally), you'll only see the first couple of paragraphs of the article, and Instapaper $
-test_url: http://chronicle.com/article/In-a-Land-of-Second-Chances/128375/
-test_url: http://chronicle.com/blogs/wiredcampus/university-run-boot-camps-offer-students-marketable-skills-but-not-course-credit/57494
diff --git a/data/GrabberConfig/ciaosamin.com.txt b/data/GrabberConfig/ciaosamin.com.txt
deleted file mode 100644
index ee09060c..00000000
--- a/data/GrabberConfig/ciaosamin.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body://div[contains(@class, 'entry-content')]
-date://h2[contains(@class, 'date-header')]
-title://h3[contains(@class, 'post-title')]
-test_url: http://ciaosamin.com/ciao/2015/12/28/recipe-million-dollar-caramels
diff --git a/data/GrabberConfig/cicero.de.txt b/data/GrabberConfig/cicero.de.txt
deleted file mode 100644
index b8913639..00000000
--- a/data/GrabberConfig/cicero.de.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-# fforst@...
-
-# Use link to print article for single page view
-single_page_link: //a[@class="print"]
-
-# set body
-tidy: no
-body: //div[@class='artikel-content']
-
-# strip title and subtitle since we got it already
-strip: //div[@class='issue']
-strip: //div[@class='artikel-content']/h2
-
-# some authors are known and have a link, others don't
-author: //a[contains(@href, 'autor?')]
-
-#date
-date: //span[@class='article-date']
-
-# Strip author since we got him
-strip_id_or_class: author
-
-#strip captions
-strip_id_or_class: field-name-field-image-credit
-strip_id_or_class: field-name-field-article-image-subtitle
-
-# remove community functions
-strip: //div[@class='meta']
-strip: //div[@id='comments']
-
-# remove "continue on the next page" text
-strip: //p[text()="[SEITE]"]
-test_url: http://www.cicero.de/weltbuehne/ihre-wut-ist-global-krise-jugend-revolten-aufstaende-zelte/43049 \ No newline at end of file
diff --git a/data/GrabberConfig/cio.com.txt b/data/GrabberConfig/cio.com.txt
deleted file mode 100644
index 9898309b..00000000
--- a/data/GrabberConfig/cio.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
diff --git a/data/GrabberConfig/ciperchile.cl.txt b/data/GrabberConfig/ciperchile.cl.txt
deleted file mode 100644
index d7e9b762..00000000
--- a/data/GrabberConfig/ciperchile.cl.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //*[(@id = "articlebody")]
-strip_id_or_class: rotulo
-
-test_url: http://ciperchile.cl/2011/04/18/las-operaciones-secretas-que-ordenaba-karadima-para-aniquilar-a-su-competencia/ \ No newline at end of file
diff --git a/data/GrabberConfig/cjr.org.txt b/data/GrabberConfig/cjr.org.txt
deleted file mode 100644
index df4c7cc4..00000000
--- a/data/GrabberConfig/cjr.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //p[@class='subhead' or @class='attribution'] | //div[@class='article-body']
-prune: no
-
-single_page_link: //li[@class='print']/a
-
-test_url: http://www.cjr.org/behind_the_news/from_breaking_news_to_baseless.php \ No newline at end of file
diff --git a/data/GrabberConfig/classyllama.com.txt b/data/GrabberConfig/classyllama.com.txt
deleted file mode 100644
index 1864eee8..00000000
--- a/data/GrabberConfig/classyllama.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-date: //div[@id='content']//p[contains(@class, 'date')]/span
-author: substring-after(//div[@id='content']//div[contains(@class, 'over-under-bars')]/p[last()]/text(), 'Posted by ')
-body: //div[@id='content']//div[@class='pane-content']
-strip_id_or_class: trackback-url
-strip_id_or_class: over-under-bars
-test_url: http://www.classyllama.com/content/layout-caching \ No newline at end of file
diff --git a/data/GrabberConfig/clientk.com.txt b/data/GrabberConfig/clientk.com.txt
deleted file mode 100644
index d5a22ccb..00000000
--- a/data/GrabberConfig/clientk.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title://div[@class="entrytitle"]/a
-author:substring-after(substring-before(//div[@class="entrytime"], "|"), "By ")
-date:substring-before(substring-after(//div[@class="entrytime"], "|"), "- Posted")
-body://div[@class="entrybody"]
-strip://div[@class="entrybody"]//p[@class="singleinfo"]
-test_url: http://clientk.com/2011/12/19/the-impact-of-more/ \ No newline at end of file
diff --git a/data/GrabberConfig/cloudacademy.com.txt b/data/GrabberConfig/cloudacademy.com.txt
deleted file mode 100644
index f5b67840..00000000
--- a/data/GrabberConfig/cloudacademy.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fcloudacademy.com%2Fblog%2Fberkshelf-manage-chef-cookbooks%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: http://cloudacademy.com/blog/berkshelf-manage-chef-cookbooks/ \ No newline at end of file
diff --git a/data/GrabberConfig/clubic.com.txt b/data/GrabberConfig/clubic.com.txt
deleted file mode 100644
index 07001449..00000000
--- a/data/GrabberConfig/clubic.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: //h1
-author: //a[@class='auteur']
-body: //div[@class='editorial']
-next_page_link: //a[contains(text(),'Page suivante')]
-strip: //a[contains(text(),'Page suivante')]
-strip: //a[contains(text(),'Page précédente')]
-
-body: //div[@id='content']
-strip_id_or_class: breadcrumb
-strip_id_or_class: kadmer-ad
-strip_id_or_class: slideshow-head
-prune: no
-
-test_url: http://www.clubic.com/carte-graphique/carte-graphique-amd/radeon-hd-7770/article-478936-1-radeon-hd-7750-7770.html
-test_url: http://www.clubic.com/mag/diaporama/photo-space-impressionnantes-photos-atterrissage-barge-84782/
diff --git a/data/GrabberConfig/cmswire.com.txt b/data/GrabberConfig/cmswire.com.txt
deleted file mode 100644
index 0b76377a..00000000
--- a/data/GrabberConfig/cmswire.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[contains(@id,'article-body')]
-strip://div[contains(@id,'disqus_count_block')]
-strip://div[contains(@id,'col-left')]
-strip://div[contains(@id,'col-right')]
-
-test_url: http://www.cmswire.com/cms/customer-experience/for-apps-and-appstores-the-singularity-is-approaching-014888.php \ No newline at end of file
diff --git a/data/GrabberConfig/cn.engadget.com.txt b/data/GrabberConfig/cn.engadget.com.txt
deleted file mode 100644
index 63f6f7ea..00000000
--- a/data/GrabberConfig/cn.engadget.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h2[@class="posttitle"]
-body: //div[@class="postbody"]
-prune: no
-
-test_url: http://cn.engadget.com/2013/06/29/google-play-music-all-access/
diff --git a/data/GrabberConfig/cn.reuters.com.txt b/data/GrabberConfig/cn.reuters.com.txt
deleted file mode 100755
index 28f10472..00000000
--- a/data/GrabberConfig/cn.reuters.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='maincontent']//h1
-body: //div[@id='resizeableText']
-
-single_page_link: concat(//link[@rel='canonical']/@href, '?sp=true')
-
-test_url: http://cn.reuters.com/article/CNAnalysesNews/idCNKBS0FF0NM20140710
-test_url: http://cn.reuters.feedsportal.com/CNAnalysesNews
-# multipage link
-test_url: http://cn.reuters.com/article/idCNKBS0FF0UL20140710 \ No newline at end of file
diff --git a/data/GrabberConfig/cnet.com.au.txt b/data/GrabberConfig/cnet.com.au.txt
deleted file mode 100644
index d5719d40..00000000
--- a/data/GrabberConfig/cnet.com.au.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[contains(@class, 'postBody')]
-date: //div[@id='nameAndTime']/time
-author: //div[@id='nameAndTime']/span[@class='author']
-
-strip_id_or_class: image-credit
-strip_id_or_class: noAutolink
-strip_id_or_class: related
-strip_id_or_class: cite
-
-prune: no
-tidy: no
-
-# early end
-replace_string(Download today's podcast</a>): Download today's podcast</a></div></body></html>
-
-test_url: http://www.cnet.com/8301-13952_1-57367607-81/the-404-981-where-the-world-is-a-vampire-podcast/
diff --git a/data/GrabberConfig/cnet.com.txt b/data/GrabberConfig/cnet.com.txt
deleted file mode 100644
index 22be3110..00000000
--- a/data/GrabberConfig/cnet.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[contains(@class, 'postBody')]
-date: //div[@id='nameAndTime']/time
-author: //div[@id='nameAndTime']/span[@class='author']
-
-strip_id_or_class: image-credit
-strip_id_or_class: noAutolink
-strip_id_or_class: related
-strip_id_or_class: sponsor
-strip_id_or_class: sharebarWrapper
-strip_id_or_class: collections-topics-and-tags
-
-prune: no
-tidy: no
-
-# early end
-replace_string(Download today's podcast</a>): Download today's podcast</a></div></body></html>
-
-test_url: http://www.cnet.com/8301-13952_1-57367607-81/the-404-981-where-the-world-is-a-vampire-podcast/
-test_url: http://www.cnet.com/news/firefox-maker-mozilla-we-dont-need-googles-money-anymore/
diff --git a/data/GrabberConfig/cnn.com.txt b/data/GrabberConfig/cnn.com.txt
deleted file mode 100644
index 6f69e4e8..00000000
--- a/data/GrabberConfig/cnn.com.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-body: //div[@id='cnnContentContainer']//div[contains(@class, 'cnn_strycntntlft')]
-title: //div[@class="cnn_storyarea"]/h1
-author: //div[@class="cnnByline"]/strong
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Sun')
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Mon')
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Tue')
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Wed')
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Thu')
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Fri')
-date: substring-after(//div[@class="cnn_strytmstmp"], 'Sat')
-strip: //div[@class="cnn_storyarea"]/h1
-strip_id_or_class: cnnByline
-strip_id_or_class: cnn_strytmstmp
-strip_id_or_class: cnn_strycaptiontxt
-strip_id_or_class: cnn_strybtntoolsbttm
-strip_id_or_class: cnn_strybtntools
-strip_id_or_class: cnn_strybtmcntnt
-strip_id_or_class: sharebar
-#strip_id_or_class: cnn_containerwht
-strip_id_or_class: cnn_stryathrtmp
-replace_string(<a name="em0"></a>): <!-- a name -->
-test_url: http://www.cnn.com/2012/05/13/us/new-york-police-policy/index.html?eref=rss_topstories
-test_url: http://rss.cnn.com/rss/edition.rss \ No newline at end of file
diff --git a/data/GrabberConfig/code.activestate.com.txt b/data/GrabberConfig/code.activestate.com.txt
deleted file mode 100644
index 83a21e19..00000000
--- a/data/GrabberConfig/code.activestate.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@id='content']
-title: //div[@id='page_header']/h1
-
-strip_id_or_class: 'lineno'
-strip_id_or_class: 'block-toolbar-button'
-strip_id_or_class: 'recipe_score'
-strip: //div[@id='recipe_tools']
-strip: //div[@id='addcomment']
-
-test_url: http://code.activestate.com/recipes/500261-named-tuples/ \ No newline at end of file
diff --git a/data/GrabberConfig/code.fivefilters.org.txt b/data/GrabberConfig/code.fivefilters.org.txt
deleted file mode 100644
index f8a88cae..00000000
--- a/data/GrabberConfig/code.fivefilters.org.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='readme']
-
-test_url: http://code.fivefilters.org/full-text-rss
diff --git a/data/GrabberConfig/code.google.com.txt b/data/GrabberConfig/code.google.com.txt
deleted file mode 100644
index 6e9c00a7..00000000
--- a/data/GrabberConfig/code.google.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@id="gc-pagecontent"]
-strip: //a[@class="backtotop"]
-prune: no
-
-test_url: http://code.google.com/apis/analytics/docs/tracking/gaTrackingEcommerce.html \ No newline at end of file
diff --git a/data/GrabberConfig/codebase64.org.txt b/data/GrabberConfig/codebase64.org.txt
deleted file mode 100644
index d992d2f1..00000000
--- a/data/GrabberConfig/codebase64.org.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fcodebase64.org%2Fdoku.php%3Fid%3Dbase%3Ademo_coding_introduction
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' page ')]
-
-strip_id_or_class: dw__toc
-
-test_url: http://codebase64.org/doku.php?id=base:demo_coding_introduction
diff --git a/data/GrabberConfig/codeproject.com.txt b/data/GrabberConfig/codeproject.com.txt
deleted file mode 100644
index d1191acc..00000000
--- a/data/GrabberConfig/codeproject.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id="contentdiv"]
-date: //span[@class="date"]
-test_url: http://www.codeproject.com/Articles/499902/Profiling-Entity-Framework-5-in-code \ No newline at end of file
diff --git a/data/GrabberConfig/codinghorror.com.txt b/data/GrabberConfig/codinghorror.com.txt
deleted file mode 100644
index adf6e5a0..00000000
--- a/data/GrabberConfig/codinghorror.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body: //div[@class='blogbody']
-strip: //h3[@class='title']
-date: //h2[@class='date']
-#Should Atwood just be a literal?
-author: substring-before( substring-after(//div[@class='posted'], 'y'), 'V')
-
-# tim.kingman@... 2011-07-26
-# Prune:no to retain all-link ULs that are part of the body content like
-# http://www.codinghorror.com/blog/2011/07/building-a-pc-part-vii-rebooting.html
-# Then explicitly strip the "Posted By" and prev/next links that Prune:yes would have removed.
-
-prune: no
-strip: //div[@class='posted']/following-sibling::*
-strip: //div[@class='posted']
-test_url: http://www.codinghorror.com/blog/2011/07/building-a-pc-part-vii-rebooting.html \ No newline at end of file
diff --git a/data/GrabberConfig/collegehumor.com.txt b/data/GrabberConfig/collegehumor.com.txt
deleted file mode 100644
index 318e6ff4..00000000
--- a/data/GrabberConfig/collegehumor.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //h1[@class='title']
-author: //p[@class='byline']/a[1]
-date: //*[@class='date']
-
-body: //div[@class='article_body']
-strip: //p[@class='ca_intro']
-strip: //div[@id='action_bar']
-strip: //div[@class='below_content']
-strip: //div[@id='announcement']
-strip: //div[@id='leftovers']
-strip: //div[@class='form']
-strip: //div[@id='email_overlay']
-strip: //a[@class='close']
-test_url: http://www.collegehumor.com/article/6599562/how-it-happened-the-necktie \ No newline at end of file
diff --git a/data/GrabberConfig/commitstrip.com.txt b/data/GrabberConfig/commitstrip.com.txt
deleted file mode 100644
index 4dd1956c..00000000
--- a/data/GrabberConfig/commitstrip.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //img[starts-with(@class, 'aligncenter size-full wp-image-')]
-
-test_url: http://www.commitstrip.com/en/2015/11/10/coder-epitaphs/
-test_url: http://www.commitstrip.com/en/2015/11/12/pay-to-pitch-to-randoms-the-next-big-idea/
-test_url: http://www.commitstrip.com/en/2015/11/13/the-last-ever-line-of-code/
diff --git a/data/GrabberConfig/communities-dominate.blogs.com.txt b/data/GrabberConfig/communities-dominate.blogs.com.txt
deleted file mode 100644
index 800a907d..00000000
--- a/data/GrabberConfig/communities-dominate.blogs.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class="entry-body"]
-test_url: http://communities-dominate.blogs.com/brands/2012/03/brutal-truth-about-lumia-cannot-sustain-even-1-to-1-replacement-of-symbian-windows-phone-strategy-do.html \ No newline at end of file
diff --git a/data/GrabberConfig/computer.org.txt b/data/GrabberConfig/computer.org.txt
deleted file mode 100644
index 8345cf50..00000000
--- a/data/GrabberConfig/computer.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip_id_or_class:column-3
-strip_id_or_class:portlet-boundary
-strip_id_or_class:banner
-
-test_url: http://www.computer.org/portal/web/buildyourcareer/careerwatch/jt19 \ No newline at end of file
diff --git a/data/GrabberConfig/computerbase.de.txt b/data/GrabberConfig/computerbase.de.txt
deleted file mode 100644
index c6957c30..00000000
--- a/data/GrabberConfig/computerbase.de.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title://h1
-
-author://span[@class="article-authornames"]/a
-
-body: //div[@class='article-view__content']
-
-replace_string("padding-bottom:): "
-
-
-strip://div[@class='adbox-wrapper__label']
-strip://div[@class='adbox-rectangle']
-strip://div[@class='adbox-rectangle']
-strip://div[contains(@class,'article-view__share-links-top')]
-
-test_url: http://www.computerbase.de/news/2012-06/verbraucherzentrale-mahnt-blizzard-fuer-diablo-3-ab/
diff --git a/data/GrabberConfig/computerworld.com.txt b/data/GrabberConfig/computerworld.com.txt
deleted file mode 100644
index a93446af..00000000
--- a/data/GrabberConfig/computerworld.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
-
-test_url: http://www.computerworld.com/article/3054550/data-storage/scientists-could-use-dna-to-shrink-a-data-center-into-a-sugar-cube.html
diff --git a/data/GrabberConfig/computerworld.dk.txt b/data/GrabberConfig/computerworld.dk.txt
deleted file mode 100644
index d819109c..00000000
--- a/data/GrabberConfig/computerworld.dk.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip: //div[contains(@class, 'articleAdtechAd')]
-title: //div[@id='article']/h1
-title: //div[contains(@class, 'article')]/h1
-body: //div[@id='articleText']
-test_url: http://www.computerworld.dk/art/56748/test-din-viden-med-computerworlds-store-sommerquiz?a=fp_1&i=0 \ No newline at end of file
diff --git a/data/GrabberConfig/contemporist.com.txt b/data/GrabberConfig/contemporist.com.txt
deleted file mode 100644
index c3120fe8..00000000
--- a/data/GrabberConfig/contemporist.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# get author from string like "Posted by <author> on <date>"
-author: substring-before(substring-after(//div[@class='post']/p[@class='post-meta'], 'by'), 'on')
-
-# get date from string like "Posted by <author> on <date>"
-date: substring-after(//div[@class='post']/p[@class='post-meta'], 'on')
-
-# this keeps thumbnail images
-prune: no
-test_url: http://www.contemporist.com/2011/11/02/landing-200-lamp-by-kim-hyunjoo \ No newline at end of file
diff --git a/data/GrabberConfig/contrepoints.org.txt b/data/GrabberConfig/contrepoints.org.txt
deleted file mode 100644
index 8a6a1250..00000000
--- a/data/GrabberConfig/contrepoints.org.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# Contrepoints.org
-# As of 2015-04, it's a wordpress-powered website.
-
-title: //h1[contains(concat(' ',normalize-space(@class),' '),' page-title ')]//span[contains(concat(' ',normalize-space(@class),' '),' inner-text ')]
-date: //time[contains(concat(' ',normalize-space(@class),' '),' art-date ')]
-author: //h1[contains(concat(' ',normalize-space(@class),' '),' author-name ')]
-body: //article[contains(concat(' ',normalize-space(@class),' '),' plain-art ')]
-
-# no toolbar, meta, etc, but misses excerpt
-# body: //div[contains(concat(' ',normalize-space(@class),' '),' entry ')]
-
-# Thus, we need to strip useless elements from the "plain-art"
-strip: //div[contains(concat(' ',normalize-space(@class),' '),' plain-post-topbar ')]
-strip: //div[contains(concat(' ',normalize-space(@class),' '),' single-type-block ')]
-strip: //header[contains(concat(' ',normalize-space(@class),' '),' entry-header ')]
-
-# And no pruning is needed because we stripped unwanted elements.
-prune: no
-
-test_url: http://www.contrepoints.org/2015/04/25/205709-leconomie-selon-ray-dalio
-test_url: http://www.contrepoints.org/2015/04/25/205734-huile-et-gaz-de-schiste-revolution-durable \ No newline at end of file
diff --git a/data/GrabberConfig/conversaciones.nokia.com.txt b/data/GrabberConfig/conversaciones.nokia.com.txt
deleted file mode 100644
index 966cc861..00000000
--- a/data/GrabberConfig/conversaciones.nokia.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class='article_header']/h1
-body: //div[@class='article_header']/p | //div[@class='article_body']
-strip_id_or_class: share_this
-strip_id_or_class: sociable
-prune: no
-
-test_url: http://conversaciones.nokia.com/2011/10/07/cinco-atajos-en-el-nokia-n8/ \ No newline at end of file
diff --git a/data/GrabberConfig/cooper.com.txt b/data/GrabberConfig/cooper.com.txt
deleted file mode 100644
index fc156f7b..00000000
--- a/data/GrabberConfig/cooper.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[contains(@class,'post-body')]
-date: //abbr[@class='published']
-
-test_url: http://www.cooper.com/journal/2015/6/creating-personas
diff --git a/data/GrabberConfig/core77.com.txt b/data/GrabberConfig/core77.com.txt
deleted file mode 100644
index cf1fa93c..00000000
--- a/data/GrabberConfig/core77.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id="permalink"]/div[@class="post"]
-
-strip: //div[@id='backArrow']
-strip: //div[@id='fwdArrow']
-strip: //div[@class="post-title"]
-strip: //div[@class="sharing"]
-test_url: http://www.core77.com/blog/columns/why_design_education_must_change_17993.asp \ No newline at end of file
diff --git a/data/GrabberConfig/counterpunch.org.txt b/data/GrabberConfig/counterpunch.org.txt
deleted file mode 100644
index 12ca19f7..00000000
--- a/data/GrabberConfig/counterpunch.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class='main']//h1[contains(@class, 'article-title')]
-author: //div[@class='mainauthorstyle']
-body: //div[@itemprop="articleBody"]
-date: //meta[@itemprop="datePublished"]/@content
-#strip: //td[@width='140']
-
-test_url: http://www.counterpunch.org/2011/09/28/the-dangerous-cult-of-the-guardian/
diff --git a/data/GrabberConfig/crimemagazine.com.txt b/data/GrabberConfig/crimemagazine.com.txt
deleted file mode 100644
index 9cf0bccc..00000000
--- a/data/GrabberConfig/crimemagazine.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-autodetect_next_page: no
-test_url: http://www.crimemagazine.com/son-sam \ No newline at end of file
diff --git a/data/GrabberConfig/crimethinc.com.txt b/data/GrabberConfig/crimethinc.com.txt
deleted file mode 100644
index b5a8018a..00000000
--- a/data/GrabberConfig/crimethinc.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class="readingtext"]
-title: substring-after(substring-after(//title, ':'), ':')
-test_url: http://www.crimethinc.com/texts/recentfeatures/nightmares.php \ No newline at end of file
diff --git a/data/GrabberConfig/crn.de.txt b/data/GrabberConfig/crn.de.txt
deleted file mode 100644
index 61d5d6a7..00000000
--- a/data/GrabberConfig/crn.de.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-author: //p[contains(@class,'author')]/a
-date: //div[contains(@class,'date')]
-test_url: http://www.crn.de/netzwerke-tk/artikel-93103.html \ No newline at end of file
diff --git a/data/GrabberConfig/csmonitor.com.txt b/data/GrabberConfig/csmonitor.com.txt
deleted file mode 100644
index 70ab9885..00000000
--- a/data/GrabberConfig/csmonitor.com.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: //h1[contains(@class, 'head')]
-
-# standard page
-body: //div[@id='mainColumn']//div[contains(@class, 'list-article-full')]
-# print page
-body: //div[@id='mainColumn']
-
-author: //a[contains(@class, 'ui-author')]
-
-single_page_link: //div[@class='storyToolbar']//a[contains(@href, '/print/')]
-
-strip_id_or_class: storyToolbar
-strip_id_or_class: promotion-tag
-
-tidy: no
-prune: no
-
-test_url: http://www.csmonitor.com/World/Middle-East/2011/1108/Imminent-Iran-nuclear-threat-A-timeline-of-warnings-since-1979/Earliest-warnings-1979-84
diff --git a/data/GrabberConfig/csnphilly.com.txt b/data/GrabberConfig/csnphilly.com.txt
deleted file mode 100644
index c14a934a..00000000
--- a/data/GrabberConfig/csnphilly.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# author's name is not isolated as a tag.... ugh
-convert_double_br_tags: yes
-body: //csn_blogST_main
-
-#junk above and around the article
-strip: /html/body/div[4]/div[3]/div/div/div/section/div/div/div/div/div/div
-strip: /html/body/div[4]/header
-strip_id_or_class: article-right-sidebar
-strip_id_or_class: rsn-gigya-sharebar-container
-strip_id_or_class: article-bottom
-strip_id_or_class: hider
-strip_id_or_class: footer
-strip_id_or_class: masthead
-strip_id_or_class: block-menu-menu-rsn-login-or-register
-strip_id_or_class: block-menu-menu-header-links
-strip_id_or_class: block-rsn-follow-bar-follow-bar
-strip_id_or_class: block-rsn-weather-rsn-weather-scoreboard
-strip_id_or_class: logo
-strip_id_or_class: element-invisible
-strip_id_or_class: site-name
-strip: //div[contains(@style, 'none')]
-test_url: http://www.csnphilly.com/eagles/can-stoutland-save-danny-watkins-career \ No newline at end of file
diff --git a/data/GrabberConfig/csoonline.com.txt b/data/GrabberConfig/csoonline.com.txt
deleted file mode 100644
index 9898309b..00000000
--- a/data/GrabberConfig/csoonline.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
diff --git a/data/GrabberConfig/css-tricks.com.txt b/data/GrabberConfig/css-tricks.com.txt
deleted file mode 100644
index 3d8174aa..00000000
--- a/data/GrabberConfig/css-tricks.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title://article[contains(@id, "post-")]/h1
-date://article[contains(@id, "post-")]/p[@class="time"]/time
-body://article[contains(@id, "post-")]
-strip://article[contains(@id, "post-")]/p[@class="time"]/time
-prune:yes
-test_url: http://css-tricks.com/off-canvas-menu-with-css-target/ \ No newline at end of file
diff --git a/data/GrabberConfig/cucharasonica.com.txt b/data/GrabberConfig/cucharasonica.com.txt
deleted file mode 100644
index e691fe83..00000000
--- a/data/GrabberConfig/cucharasonica.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://cucharasonica.com/2011/09/queen-busca-candidatos-para-su-propia-banda-tributo \ No newline at end of file
diff --git a/data/GrabberConfig/cw.com.tw.txt b/data/GrabberConfig/cw.com.tw.txt
deleted file mode 100644
index 6e3a91ee..00000000
--- a/data/GrabberConfig/cw.com.tw.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-author://span[contains(@class,'reporter')]
-
-date://span[contains(@class,'date')]
-
-body://div[contains(@class,'mainContaner')]
-
-strip://div[contains(@class,'mainHeaer')]
-strip://div[contains(@class,'keyW')]
-strip://div[contains(@class,'wonderful')]
-strip://div[contains(@class,'pages')]
-strip://div[contains(@class,'Topics TopicsW3')]
-
-next_page_link://li[@class='pageNext']/a[contains(.,'下一頁')]
-test_url: http://www.cw.com.tw/article/article.action?id=5032848 \ No newline at end of file
diff --git a/data/GrabberConfig/cwnp.com.txt b/data/GrabberConfig/cwnp.com.txt
deleted file mode 100644
index 169fdf84..00000000
--- a/data/GrabberConfig/cwnp.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //div[@class='entry-pad']//h2
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-pad ')]
-strip: //h1
-strip: //p
-strip: //h2
-strip: //div[@class='clear']
-
-prune: no
-tidy: no
-
-autodetect_on_failure: no
-
-test_url: https://www.cwnp.com/wotd.php
-test_url: https://www.cwnp.com/qotd.php
diff --git a/data/GrabberConfig/cyrille-borne.com.txt b/data/GrabberConfig/cyrille-borne.com.txt
deleted file mode 100644
index 7b41aa0b..00000000
--- a/data/GrabberConfig/cyrille-borne.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.cyrille-borne.com%2Farticle511%2Fun-an-de-zte-open-c-plus-tard
-
-body: //article//section
-test_url: http://www.cyrille-borne.com/article511/un-an-de-zte-open-c-plus-tard \ No newline at end of file
diff --git a/data/GrabberConfig/da.feedsportal.com.txt b/data/GrabberConfig/da.feedsportal.com.txt
deleted file mode 100644
index 2bd66be8..00000000
--- a/data/GrabberConfig/da.feedsportal.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-single_page_link: //a
-tidy: no
-prune: no
-
-test_url: http://da.feedsportal.com/c/585/f/413794/s/17037b5a/l/0L0Stelegraaf0Bnl0Cbinnenland0C10A2757860C0I0IKlacht0Itegen0Idr0B0IFrank0Iniet0I0Eontvankelijk0I0I0Bhtml0Dcid0Frss/ia1.htm
diff --git a/data/GrabberConfig/dagogtid.no.txt b/data/GrabberConfig/dagogtid.no.txt
deleted file mode 100644
index 1531472c..00000000
--- a/data/GrabberConfig/dagogtid.no.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //span[@class = 'overskriftEkstrastor']
-author: //em/a
-
-test_url: http://dagogtid.no/nyhet.cfm?nyhetid=2414 \ No newline at end of file
diff --git a/data/GrabberConfig/dailydot.com.txt b/data/GrabberConfig/dailydot.com.txt
deleted file mode 100644
index 978ed1ce..00000000
--- a/data/GrabberConfig/dailydot.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-tidy: no
-body: //article
-
-test_url: http://www.dailydot.com/entertainment/tumblr-christopher-price-topherchris/ \ No newline at end of file
diff --git a/data/GrabberConfig/dailykos.com.txt b/data/GrabberConfig/dailykos.com.txt
deleted file mode 100644
index 6d4cb82a..00000000
--- a/data/GrabberConfig/dailykos.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@id='article-1']//div[contains(@class, 'article-body')]
-title: //div[@class='meta']//a[@id='titleHref']
-date: //div[@class='meta']//p[@class='date']
-
-strip_id_or_class: invisible
-strip_id_or_class: divider-doodle
-
-prune: no
-
-test_url: http://www.dailykos.com/story/2012/01/26/1058790/-Newt-Gingrich-s-campaign-admits-he-lied-during-debate-about-ABC-News-interview-with-his-ex-wife
diff --git a/data/GrabberConfig/dailymail.co.uk.txt b/data/GrabberConfig/dailymail.co.uk.txt
deleted file mode 100644
index 8535b19f..00000000
--- a/data/GrabberConfig/dailymail.co.uk.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-body: //div[@id='js-article-text']
-strip: //div[@class='explore-links']
-strip: //div[@id='js-article-text']/br[position()=1]
-strip_id_or_class: print-or-mail-links
-strip_id_or_class: shareArticles
-strip_id_or_class: googleAds
-strip_id_or_class: digg-button
-strip_id_or_class: article-icon-links-container
-strip_id_or_class: clickToEnlarge
-strip_id_or_class: articleIconLinksContainer
-strip_id_or_class: related-carousel
-strip_id_or_class: reader-comments
-strip_id_or_class: most-watched
-strip_id_or_class: most-read
-
-find_string:blkBorder img-share
-replace_string: nothing
-
-tidy: no
-
-test_url: http://www.dailymail.co.uk/news/article-1375423/Royal-wedding-Texan-billionaire-Joe-Albritton-invited-Prince-Charles.html \ No newline at end of file
diff --git a/data/GrabberConfig/dailysabah.com.txt b/data/GrabberConfig/dailysabah.com.txt
deleted file mode 100644
index 67b108b6..00000000
--- a/data/GrabberConfig/dailysabah.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.dailysabah.com%2Feurope%2F2015%2F11%2F09%2Fcatalan-parliament-votes-to-secede-from-spain-by-2017
-
-body: //div[@id='newsDescription']//div[contains(concat(' ',normalize-space(@class),' '),' txt ')]
-test_url: http://www.dailysabah.com/europe/2015/11/09/catalan-parliament-votes-to-secede-from-spain-by-2017
diff --git a/data/GrabberConfig/dailystar.com.lb.txt b/data/GrabberConfig/dailystar.com.lb.txt
deleted file mode 100644
index 3b153042..00000000
--- a/data/GrabberConfig/dailystar.com.lb.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='ec-blog-headline']
-body: //*[@id="divDetails"]
-date: //*[@id="ctl00_ContentPlaceHolder1_tdDate"]
-author: //*[@id="ctl00_ContentPlaceHolder1_anchorAuthor"]/a
-autodetect_next_page: no
-test_url: http://dailystar.com.lb/Opinion/Columnist/2012/Oct-10/190803-americas-new-modesty-in-the-mideast.ashx#axzz2928JP5xE \ No newline at end of file
diff --git a/data/GrabberConfig/dailytelegraph.com.au.txt b/data/GrabberConfig/dailytelegraph.com.au.txt
deleted file mode 100644
index 571e8111..00000000
--- a/data/GrabberConfig/dailytelegraph.com.au.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1[@class="heading"]
-author: //cite[@class='author']
-date: //li[contains(@class, 'date-and-time')]
-
-
diff --git a/data/GrabberConfig/dansdata.com.txt b/data/GrabberConfig/dansdata.com.txt
deleted file mode 100644
index 60669480..00000000
--- a/data/GrabberConfig/dansdata.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-autodetect_next_page: no
-tidy: no
-prune: no
-body: //div[@class='NoOverflow']
-test_url: http://www.dansdata.com/gz129.htm \ No newline at end of file
diff --git a/data/GrabberConfig/dantri.com.vn.txt b/data/GrabberConfig/dantri.com.vn.txt
deleted file mode 100644
index f19fee7c..00000000
--- a/data/GrabberConfig/dantri.com.vn.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[contains(@class, 'fon31 mt2')]
-body: //h2[contains(@class, 'fon33 mt1')] | //div[contains(@class, 'fon34 mt3')]
-
-prune: no
-
-test_url: http://dantri.com.vn/su-kien/chang-trai-mot-minh-dap-xe-vuot-450km-de-vieng-mo-dai-tuong-869763.htm
-test_url: http://dantri.com.vn/trangchu.rss \ No newline at end of file
diff --git a/data/GrabberConfig/daringfireball.net.txt b/data/GrabberConfig/daringfireball.net.txt
deleted file mode 100644
index 251cc670..00000000
--- a/data/GrabberConfig/daringfireball.net.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class="article"]/h1
-author: //div[@id="Sidebar"]/p/strong
-date: //h6[@class="dateline"]
-body: //div[@class="article"]
-strip: //h6[@class="dateline"]
-strip: //div[@class="article"]/h1
-test_url: http://daringfireball.net/2011/10/apps_are_the_new_channels \ No newline at end of file
diff --git a/data/GrabberConfig/dcurt.is.txt b/data/GrabberConfig/dcurt.is.txt
deleted file mode 100644
index 524c4bf1..00000000
--- a/data/GrabberConfig/dcurt.is.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: (//article//h2)[1]
-body: //article[contains(@class, 'post')]
-date: //time[@id='top_time']/@datetime
-
-prune: no
-tidy: no
-
-test_url: http://dcurt.is/predictions-txt \ No newline at end of file
diff --git a/data/GrabberConfig/deadline.com.txt b/data/GrabberConfig/deadline.com.txt
deleted file mode 100644
index 782bdeea..00000000
--- a/data/GrabberConfig/deadline.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fdeadline.com%2F2016%2F03%2Fsteven-spielberg-harrison-ford-team-up-for-indiana-jones-5-disney-sets-july-2019-release-1201720725%2F
-
-body: //article[contains(concat(' ',normalize-space(@class),' '),' post ')]
-strip_id_or_class: pad
-strip_id_or_class: recent-comments
-strip_id_or_class: tags
-strip_id_or_class: copyrighta
-
-test_url: http://deadline.com/2016/03/steven-spielberg-harrison-ford-team-up-for-indiana-jones-5-disney-sets-july-2019-release-1201720725/
diff --git a/data/GrabberConfig/deadspin.com.txt b/data/GrabberConfig/deadspin.com.txt
deleted file mode 100644
index e6ca16ae..00000000
--- a/data/GrabberConfig/deadspin.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-http_header(user-agent): PHP/5.3 \ No newline at end of file
diff --git a/data/GrabberConfig/defomicron.net.txt b/data/GrabberConfig/defomicron.net.txt
deleted file mode 100644
index 9f11258c..00000000
--- a/data/GrabberConfig/defomicron.net.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //article/h1
-author: //hgroup/h3/a
-date: //time
-body: //article
-strip: //aside
-footnotes: yes
-prune: no
-tidy: no
-test_url: https://defomicron.net/2012/09/ios-6/ \ No newline at end of file
diff --git a/data/GrabberConfig/deia.com.txt b/data/GrabberConfig/deia.com.txt
deleted file mode 100644
index d2f78239..00000000
--- a/data/GrabberConfig/deia.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='widget full_article']
-strip: //div[@class='Herramientas']
-
-test_url: http://www.deia.com/2015/10/03/politica/euskadi/el-envilecimiento-de-la-politica-y-de-los-medios-de-comunicacion
diff --git a/data/GrabberConfig/delong.typepad.com.txt b/data/GrabberConfig/delong.typepad.com.txt
deleted file mode 100644
index c4b922e4..00000000
--- a/data/GrabberConfig/delong.typepad.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-strip_id_or_class: banner
-strip_id_or_class: gamma
-strip_id_or_class: module-list
-test_url: http://delong.typepad.com/sdj/2011/02/in-which-suresh-naidu-visits-the-new-jerusalem.html \ No newline at end of file
diff --git a/data/GrabberConfig/democracynow.org.txt b/data/GrabberConfig/democracynow.org.txt
deleted file mode 100644
index b0050b4f..00000000
--- a/data/GrabberConfig/democracynow.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(@class, 'blog_body')]
-
-prune: no
-
-test_url: http://www.democracynow.org/blog/2014/1/9/the_fbi_the_nsa_and_a \ No newline at end of file
diff --git a/data/GrabberConfig/der-postillon.com.txt b/data/GrabberConfig/der-postillon.com.txt
deleted file mode 100644
index a53f1b38..00000000
--- a/data/GrabberConfig/der-postillon.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.der-postillon.com%2F2013%2F03%2Fpornodarsteller-arbeitet-ein-jahr-lang.html
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-body ')]
-
-test_url: http://www.der-postillon.com/2013/03/pornodarsteller-arbeitet-ein-jahr-lang.html
diff --git a/data/GrabberConfig/derbund.ch.txt b/data/GrabberConfig/derbund.ch.txt
deleted file mode 100755
index 1363eff6..00000000
--- a/data/GrabberConfig/derbund.ch.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Author: cirnod@gmail.com
-
-tidy: no
-prune: no
-
-body: //div[@id="article"]/h3 | //*[@id="mainContent"]
-
-# General Cleanup
-#strip_id_or_class: info_panel
-
-
-# Try yourself
-test_url: http://www.derbund.ch/bern/nachrichten/Fossilienforscher-stehen-auf-Heavy-Metal/story/20919522
diff --git a/data/GrabberConfig/derstandard.at.txt b/data/GrabberConfig/derstandard.at.txt
deleted file mode 100644
index 61ad6fc6..00000000
--- a/data/GrabberConfig/derstandard.at.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-title: //div[@id='content-header']/h1
-author: //span[@class='author']
-body: //div[@id='objectContent']
-strip: //ul[@class='lookupLinksArtikel']
-
-strip: //meta
-strip: //div[@itemprop='publisher']
-strip: //div[@id='content-header']
-strip: //div[@id='pageTop']
-strip: //div[@id='toolbar']
-strip: //div[@id='articleTools']
-strip: //div[@id='weiterLesen']
-strip: //div[@id='communityCanvas']
-strip: //div[@class='credits']
-strip: //div[@id='feature-cover']
-strip: //div[@id='feature-meta']
-strip: //li[@class='empty']
-strip: //ul[@class='lookup-links']
-
-prune: no
-tidy: no
-
-test_url: http://derstandard.at/1318726018343/Breitband-LTE-Was-bringt-die-neue-Mobilfunk-Generation
-test_url: http://derstandard.at/2000033602592/40-Jahre-fuer-einen-der-nicht-gemeinsam-leben-wollte
-test_url: http://derstandard.at/2000017141382/Feature-Format
-test_url: http://derstandard.at/2000031826169/Die-Mittagspause-ist-den-meisten-heilig
-test_url: http://derstandard.at/2000032076109/Fordern-wir-die-totale-Ueberwachung
diff --git a/data/GrabberConfig/des-livres-pour-changer-de-vie.fr.txt b/data/GrabberConfig/des-livres-pour-changer-de-vie.fr.txt
deleted file mode 100644
index 56b0ea27..00000000
--- a/data/GrabberConfig/des-livres-pour-changer-de-vie.fr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.des-livres-pour-changer-de-vie.fr%2Fbit-literacy-2%2F
-
-body: //div[@id='getsocialmain']
-test_url: http://www.des-livres-pour-changer-de-vie.fr/bit-literacy-2/ \ No newline at end of file
diff --git a/data/GrabberConfig/designbuildsource.com.au.txt b/data/GrabberConfig/designbuildsource.com.au.txt
deleted file mode 100644
index 93d3507e..00000000
--- a/data/GrabberConfig/designbuildsource.com.au.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-date: substring-after(//p[@class='post_date'], 'on')
-
diff --git a/data/GrabberConfig/designsponge.com.txt b/data/GrabberConfig/designsponge.com.txt
deleted file mode 100644
index 2cd2f1f6..00000000
--- a/data/GrabberConfig/designsponge.com.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-# Author: zinnober
-
-tidy: no
-prune: no
-
-# Set title
-title: //header/h1
-
-# Set author
-author: //a[rel='author']
-
-# Content is here
-body: //article
-
-# Tidy up before article
-strip: //header
-
-# Tidy up article
-strip: //div[contains(@id, 'gallery-')]
-replace_string(<a rel="attachment): <p rel="attachment
-
-
-# Tidy up after article
-strip: //div[@class='sm']
-strip_id_or_class: related
-strip_id_or_class: comments
-strip: //footer
-
-# Try it yourself
-test_url: http://www.designsponge.com/2010/06/seattle-design-guide.html
-test_url: http://www.designsponge.com/2012/04/sneak-peek-liz-cook.html
diff --git a/data/GrabberConfig/designtagebuch.de.txt b/data/GrabberConfig/designtagebuch.de.txt
deleted file mode 100644
index 9020847f..00000000
--- a/data/GrabberConfig/designtagebuch.de.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-tidy: no
-body: //div[@class='main']
-
-author: substring-before(substring-after(//div[@class='meta-single'], 'erstellt von '), ' am')
-date: substring-before(substring-after(//div[@class='meta-single'], ' am '), ' | ')
-
-strip_id_or_class: pagelink
-strip_id_or_class: wp-polls
-
-next_page_link: //div[@class='post-page-next']/a
-test_url: http://www.designtagebuch.de/die-gefuehlte-lesbarkeit/ \ No newline at end of file
diff --git a/data/GrabberConfig/details.com.txt b/data/GrabberConfig/details.com.txt
deleted file mode 100644
index d1d8a29a..00000000
--- a/data/GrabberConfig/details.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class="content-headline"]
-body: //div[@class="headers-container"] | //div[@class="content-container"]
-prune: no
-tidy: no
-
-single_page_link: //li[@class='utility-print']/a
-
-test_url: http://www.details.com/culture-trends/critical-eye/201108/best-new-designers-innovations \ No newline at end of file
diff --git a/data/GrabberConfig/deutsche-apotheker-zeitung.de.txt b/data/GrabberConfig/deutsche-apotheker-zeitung.de.txt
deleted file mode 100644
index 36709cab..00000000
--- a/data/GrabberConfig/deutsche-apotheker-zeitung.de.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-# Author: zinnober
-
-prune: yes
-tidy: yes
-
-title: //h1
-date: //p[@class='news_datum']
-author: //span[@class='author']
-
-body: //div[@class='tagesnews-content']
-
-# General clenaup
-strip_id_or_class: dachzeile
-strip: //h3
-strip: //p[@class='bodytext']//a
-strip_id_or_class: autor_datum
-strip_id_or_class: comments
-strip_id_or_class: banner-
-
-strip: //p[contains(., 'Lesen Sie')]
-strip: //p[contains(., '– in DAZ')]
-
-# Fix image captions
-replace_string(<p class="image_caption">): <p><small><em>
-replace_string(</dd>): </em></small></dd>
-
-test_url: http://www.deutsche-apotheker-zeitung.de/pharmazie/news/2014/09/03/weniger-nebenwirkungen-aber-kein-zusatznutzen/13715.html
-test_url: http://www.deutsche-apotheker-zeitung.de/recht/news/2014/09/02/urteile-zum-cannabis-eigenanbau-bfarm-geht-in-berufung/13716.html
-
diff --git a/data/GrabberConfig/developers.facebook.com.txt b/data/GrabberConfig/developers.facebook.com.txt
deleted file mode 100644
index 7609b72f..00000000
--- a/data/GrabberConfig/developers.facebook.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //div[@class="bodyText"]/h1
-author: //div[@class="picture"]/a/img/@alt
-test_url: https://developers.facebook.com/blog/post/2012/03/22/developer-spotlight--foodspotting/ \ No newline at end of file
diff --git a/data/GrabberConfig/devlinsangle.blogspot.co.at.txt b/data/GrabberConfig/devlinsangle.blogspot.co.at.txt
deleted file mode 100644
index 6f1d4e27..00000000
--- a/data/GrabberConfig/devlinsangle.blogspot.co.at.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-date: //h2[@class='date-header']
-body: //div[@class='post hentry']
-title: //h3
-strip: //div[@class='post-footer']
-
-test_url: http://devlinsangle.blogspot.co.at/2012/03/difference-between-teaching-and_01.html \ No newline at end of file
diff --git a/data/GrabberConfig/diagonalperiodico.net.txt b/data/GrabberConfig/diagonalperiodico.net.txt
deleted file mode 100644
index f0681bac..00000000
--- a/data/GrabberConfig/diagonalperiodico.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='field__items']
-title: //div[@class='art_titulo']
-
-test_url: https://www.diagonalperiodico.net/global/27947-cuanto-mas-tiempo-nos-aferremos-este-sistema-peor-y-menores-seran-nuestras-opciones
diff --git a/data/GrabberConfig/dictionary.reference.com.txt b/data/GrabberConfig/dictionary.reference.com.txt
deleted file mode 100644
index b8243d0c..00000000
--- a/data/GrabberConfig/dictionary.reference.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[contains(@class, 'source-data')]
-strip: //button
-
-prune: no
-
-test_url: http://dictionary.reference.com/browse/propaganda
diff --git a/data/GrabberConfig/diepresse.com.txt b/data/GrabberConfig/diepresse.com.txt
deleted file mode 100644
index ced189cc..00000000
--- a/data/GrabberConfig/diepresse.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='article']/h1
-date: substring-before(//p[@class='articletime'],'|')
-body: //div[@id='articletext']
-strip: //div[@class='inlineDiashow']
-
-test_url: http://diepresse.com/home/politik/aussenpolitik/701905/TibeterProteste_Nonne-verbrennt-sich-selbst?_vl_backlink=/home/politik/index.do \ No newline at end of file
diff --git a/data/GrabberConfig/digiphoto.techbang.com.txt b/data/GrabberConfig/digiphoto.techbang.com.txt
deleted file mode 100644
index 80ce5ff3..00000000
--- a/data/GrabberConfig/digiphoto.techbang.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# default parser works great
-# only add "author" and "next page link" reference
-# 2012-04-13
-
-next_page_link: //div[@class = 'pagination']/a[@class = 'next_page']
-
-author: //*[@class = 'author metadata']/a
-test_url: http://digiphoto.techbang.com/posts/2433--commercial-photography-communication-is-the-key-to-a-good-work \ No newline at end of file
diff --git a/data/GrabberConfig/digital-photography-school.com.txt b/data/GrabberConfig/digital-photography-school.com.txt
deleted file mode 100644
index 18ce370e..00000000
--- a/data/GrabberConfig/digital-photography-school.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='post-title']/h1
-author: //a[@href='#author']
-body: //div[@class='post-content']
-strip: //div[@class='post-meta']
-
-test_url: http://www.digital-photography-school.com/10-ways-to-develop-yourself-photographically \ No newline at end of file
diff --git a/data/GrabberConfig/digitalspy.co.uk.txt b/data/GrabberConfig/digitalspy.co.uk.txt
deleted file mode 100644
index f48bdfdb..00000000
--- a/data/GrabberConfig/digitalspy.co.uk.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@class="article_header"]/h1
-date: //div[@class="article_pub"]/span[@class="time"]
-author: //div[@class="article_pub"]/span[@class="editors"]/a/text()
-body: //div[@class="article_body clear_left"]
-test_url: http://www.digitalspy.co.uk/movies/at-the-movies/a364066/top-5-super-bowl-movie-trailers-the-avengers-battleship-more.html \ No newline at end of file
diff --git a/data/GrabberConfig/dilbert.com.txt b/data/GrabberConfig/dilbert.com.txt
deleted file mode 100644
index b8788553..00000000
--- a/data/GrabberConfig/dilbert.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //a[@class="post-title"]/text()
-title: //meta[@name="twitter:title"]/@content
-body: //img[@class="img-responsive img-comic"]
-author: string('Scott Adams')
-date: //meta[@property="article:publish_date"]/@content
-
-test_url: http://dilbert.com/blog/entry/death_by_hypnosis_or_not/
-test_url: http://dilbert.com/strips/comic/2013-10-22
-test_url: http://feed.dilbert.com/dilbert/daily_strip
diff --git a/data/GrabberConfig/dinamalar.com.txt b/data/GrabberConfig/dinamalar.com.txt
deleted file mode 100644
index bc315cf1..00000000
--- a/data/GrabberConfig/dinamalar.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-title: //div[@class='newsdetbd']
-body: //div[@id='innerleft']
-#//p[@class = 'plnht']
-strip_image_src: /albums/
-strip: //div[@class='mrrt']
-prune: yes
-strip_id_or_class: 'fdpd'
-strip_id_or_class: 'epapt'
-strip_id_or_class: 'newsrtwd'
-strip_id_or_class: 'padtp'
-strip_id_or_class: 'newdt'
-strip_id_or_class: 'newdlt'
-strip: //div[@id='selNotes']
-strip_id_or_class: 'clsNotes'
-strip_id_or_class: 'clear'
-strip_id_or_class: 'cmtwrap'
-strip_id_or_class: 'sess'
-strip_id_or_class: 'parents'
-test_url: http://www.dinamalar.com/News_Detail.asp?Id=295725 \ No newline at end of file
diff --git a/data/GrabberConfig/distributistreview.com.txt b/data/GrabberConfig/distributistreview.com.txt
deleted file mode 100644
index 9fe9e44a..00000000
--- a/data/GrabberConfig/distributistreview.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post_content_wrapper ')]
-strip_id_or_class: post_share_text
-strip_id_or_class: post_info_cat
-strip_id_or_class: about_the_author
-strip_id_or_class: widgettitle
-strip_id_or_class: post_related
-
-test_url: http://distributistreview.com/distributism-economics-as-if-people-mattered/
diff --git a/data/GrabberConfig/dn.pt.txt b/data/GrabberConfig/dn.pt.txt
deleted file mode 100755
index 051b8cb9..00000000
--- a/data/GrabberConfig/dn.pt.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-single_page_link: concat('http://www.dn.pt/Common/print.aspx?content_id=', //input[@type='hidden' and @name='link-comments']/@value)
-#<input type="hidden" name="link-comments" class="link-comments" value="3972244">
-
-title: //h1
-author: //div[@class="Author"]
-
-strip: //div[@class="Patrocinio"]
-
-test_url: http://www.dn.pt/inicio/opiniao/interior.aspx?content_id=3972244&seccao=Alberto%20Gon%E7alves&tag=Opini%E3o%20-%20Em%20Foco&page=1 \ No newline at end of file
diff --git a/data/GrabberConfig/dn.se.txt b/data/GrabberConfig/dn.se.txt
deleted file mode 100644
index 9584abad..00000000
--- a/data/GrabberConfig/dn.se.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-title: //h1[contains(@class, 'article__headline')]
-
-body: //div[contains(@class, 'article__body-content') or contains(@class, 'article__lead') or contains(@class, 'image-box__container')]
-body: //div[@id="article-content"]
-
-
-# Ads
-strip_id_or_class: advert-space
-
-# Read more, recommend, comments etc
-strip_id_or_class: fbc-recommend
-strip_id_or_class: recommend
-strip_id_or_class: article-readers
-strip_id_or_class: article-addons
-strip_id_or_class: hook
-#strip_id_or_class: right
-strip_id_or_class: footer
-
-strip_id_or_class: ad-head
-strip_id_or_class: atc-share-title
-
-# Other news
-strip: //div[@id="mirrors"]
-
-# Author
-author: //div[@id="byline"]/div/p/strong
-
-find_string: <noscript>
-replace_string: <!-- removed -->
-find_string: </noscript>
-replace_string: <!-- removed -->
-
-#parser: html5php
-prune: no
-tidy: no
-
-# Date
-date: substring(substring-after(//p[@class="published"], 'Publicerad '), 0, 11)
-
-test_url: http://www.dn.se/nyheter/varlden/landade-flygplan-mitt-i-villaomrade
-test_contains: Ett tekniskt haveri tvingade
-test_url: http://www.dn.se/rss/senaste-nytt
diff --git a/data/GrabberConfig/dobreprogramy.pl.txt b/data/GrabberConfig/dobreprogramy.pl.txt
deleted file mode 100644
index 972293bc..00000000
--- a/data/GrabberConfig/dobreprogramy.pl.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //*[@class="news"]//h1[@class="title"]
-author: //*[@class="news"]//*[@class="newsInfo"]/a
-date: substring-before(//*[@class="news"]//*[@class="newsInfo"]/text(), ',')
-body: //*[@class="news"]//*[@class="newsContent"]
-footnotes: no
-test_url: http://www.dobreprogramy.pl/Sony-konczy-z-Foldinghome-na-PS3,Aktualnosc,36899.html \ No newline at end of file
diff --git a/data/GrabberConfig/doctac.com.txt b/data/GrabberConfig/doctac.com.txt
deleted file mode 100644
index 1c518a9b..00000000
--- a/data/GrabberConfig/doctac.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-strip: //*[(@id = "featured")]
-
-author:substring-after( //div[@class='posttitle']/h2[@class='author'],'by ')
-
-date: concat(//div[@class='month'],' ',//div[@class='day'])
-
-#doctac doesn't provide a year, but month/day is better than nothing
-test_url: http://www.doctac.com/mac/iphone/instapaper-update-app/ \ No newline at end of file
diff --git a/data/GrabberConfig/domusweb.it.txt b/data/GrabberConfig/domusweb.it.txt
deleted file mode 100644
index 20566ee3..00000000
--- a/data/GrabberConfig/domusweb.it.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# TODO: clean up the extra junk at the end of articles
-
-# general text formatting
-prune: no
-convert_double_br_tags:yes
-
-# where to find the basic metadata
-author://a[@class='articleauthor']
-date://a[starts-with(@href,'/en/search/published/')]
-title:substring-before(//h2[@class='title'],'&mdash;')
-body://div[@id='maincontainer']
-
-dissolve://div[starts-with(@id,'commentableblock')]
-
-# clean up the crap
-strip://div[contains(@class,'domusnetwork')]
-strip://div[contains(@class,'relative_wrapper')]
-
-strip://div[contains(@class,'captionsubimage')]/img[contains(@class,'arrow')]
-wrap_in(em): //div[contains(@class,'captionsubimage')]/span
-test_url: http://www.domusweb.it/en/design/in-praise-of-lost-time/ \ No newline at end of file
diff --git a/data/GrabberConfig/dorkly.com.txt b/data/GrabberConfig/dorkly.com.txt
deleted file mode 100644
index 34f084cb..00000000
--- a/data/GrabberConfig/dorkly.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.dorkly.com%2Fpost%2F77499%2Fgeekiest-office-supplies-ever-made%3Fref%3Dhomepage
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-
-strip_id_or_class: related-links
-strip_id_or_class: pagination
-
-next_page_link: //div[@class = 'pagination']/a[@class = 'next icon-circle-next']
-
-test_url: http://www.dorkly.com/post/77499/geekiest-office-supplies-ever-made?ref=homepage
-test_url: http://www.dorkly.com/post/73816/a-comic-of-ice-and-fire-a-hero-emerges
diff --git a/data/GrabberConfig/dou.ua.txt b/data/GrabberConfig/dou.ua.txt
deleted file mode 100644
index 0f983112..00000000
--- a/data/GrabberConfig/dou.ua.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@itemprop="name"]
-
-author: //div[contains(@class, 'author')]//div[contains(@class, 'name')]/a
-
-date: //div[contains(@class, 'b-info')]//span[contains(@class, 'date')]
-
-body: //div[contains(@class, 'b-typo')]
-test_url: http://dou.ua/lenta/interviews/andrej-havryuchenko/?from=sb_mostcomm \ No newline at end of file
diff --git a/data/GrabberConfig/douban.com.txt b/data/GrabberConfig/douban.com.txt
deleted file mode 100644
index d72a2223..00000000
--- a/data/GrabberConfig/douban.com.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# This filter is tested on:
-# http://www.douban.com/note/215003067/
-# http://www.douban.com/note/213540049/
-# http://www.douban.com/group/topic/31140104/
-
-title: //div[@class='note-header']/h1
-title: //div[@id='content']/h1
-
-author: //div[@class='info']/ul/li/a
-author: //h3/span/a
-
-date://div[@class='note-header']/div/span
-date://h3/span[contains(@class, 'color-green')]
-
-body://div[contains(@class, 'note')]
-body://div[contains(@class, 'topic-content')]
-
-strip://h3
-
-convert_double_br_tags: yes
-test_url: http://www.douban.com/group/topic/31140104/ \ No newline at end of file
diff --git a/data/GrabberConfig/doughellmann.com.txt b/data/GrabberConfig/doughellmann.com.txt
deleted file mode 100644
index 144025d9..00000000
--- a/data/GrabberConfig/doughellmann.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-single_page_link: //a[.="Read more…"]/@href
diff --git a/data/GrabberConfig/dpreview.com.txt b/data/GrabberConfig/dpreview.com.txt
deleted file mode 100644
index 001c810f..00000000
--- a/data/GrabberConfig/dpreview.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# next_page_link for product review
-# example: http://www.dpreview.com/reviews/lytro/
-next_page_link: //img[@alt = 'Next page']/../@href
-
-# next_page_link for other articles
-# example: http://www.dpreview.com/articles/6126592906/first-impressions-using-the-fujifilm-x-pro1
-next_page_link: //*[@class = 'pages']/*/td[@class = 'next enabled']/a
-single_page_link: //a[contains(.,'Print view')]
-test_url: http://www.dpreview.com/articles/6126592906/first-impressions-using-the-fujifilm-x-pro1 \ No newline at end of file
diff --git a/data/GrabberConfig/dr.dk.txt b/data/GrabberConfig/dr.dk.txt
deleted file mode 100644
index d8ec1acf..00000000
--- a/data/GrabberConfig/dr.dk.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //meta[@property='og:title']/@content
-author: //div[@class='articleFunctions']//a
-date: //meta[@name='pubdate']/@content
-
-# Can you strip elements from the body only? It is required here (`//div[@class='articleContent']/p` breaks for some reason)
-body: //div[@class='articleContent']
-
-tidy: no
-test_url: http://www.dr.dk/Nyheder/Udland/2011/10/24/150115.htm \ No newline at end of file
diff --git a/data/GrabberConfig/dramasonline.com.txt b/data/GrabberConfig/dramasonline.com.txt
deleted file mode 100644
index 4898353b..00000000
--- a/data/GrabberConfig/dramasonline.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@class='postext']
-
-strip_id_or_class: ratingblock
-strip_id_or_class: hreview-aggregate
-strip: //div[contains(@style, 'display: none;')]
-
-tidy: no
-prune: no
-
-test_url: http://www.dramasonline.com/jago-pakistan-jago-7th-december-2012-ali-gul-pir/ \ No newline at end of file
diff --git a/data/GrabberConfig/drdobbs.com.txt b/data/GrabberConfig/drdobbs.com.txt
deleted file mode 100644
index b1a9db6f..00000000
--- a/data/GrabberConfig/drdobbs.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-single_page_link: //a[contains(@href, '/article/print')]
-test_url: http://www.drdobbs.com/architecture-and-design/240001128 \ No newline at end of file
diff --git a/data/GrabberConfig/drgoulu.com.txt b/data/GrabberConfig/drgoulu.com.txt
deleted file mode 100644
index b4fb71bb..00000000
--- a/data/GrabberConfig/drgoulu.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.drgoulu.com%2F2012%2F10%2F07%2Fcomment-stocker-lenergie%2F
-
-body: //section[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: http://www.drgoulu.com/2012/10/07/comment-stocker-lenergie/
diff --git a/data/GrabberConfig/drive2.ru.txt b/data/GrabberConfig/drive2.ru.txt
deleted file mode 100644
index d500cb81..00000000
--- a/data/GrabberConfig/drive2.ru.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //div[@class = "description"]
-body: //div[@id = "post"]
-
-strip_id_or_class: vcard
-strip_id_or_class: journallist
-strip_id_or_class: infobox
-strip_id_or_class: terms
-strip_id_or_class: replieslist
-strip_id_or_class: communityside
-
-
-test_url: http://www.drive2.ru/cars/audi/a6/a6_c5/elysey/journal/288230376151836654/ \ No newline at end of file
diff --git a/data/GrabberConfig/droidgamers.com.txt b/data/GrabberConfig/droidgamers.com.txt
deleted file mode 100644
index 4bb7e76c..00000000
--- a/data/GrabberConfig/droidgamers.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-strip_id_or_class: actions
-strip_id_or_class: article-info
-strip_id_or_class: bt-social-share
-strip_id_or_class: author_bio
-strip_id_or_class: dsq-brlink
-
-test_url: http://www.droidgamers.com/index.php/game-news/android-game-news/10346-carpazzzi-soft-and-bulkypix-globally-launches-mad-aces-onto-google-play-this-morning \ No newline at end of file
diff --git a/data/GrabberConfig/dropbox.com.txt b/data/GrabberConfig/dropbox.com.txt
deleted file mode 100644
index 3b51569f..00000000
--- a/data/GrabberConfig/dropbox.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //a[@id='download_button_link']
-
-test_url: https://www.dropbox.com/s/qmocfrco2t0d28o/Fluffbeast.docx
diff --git a/data/GrabberConfig/drupal.org.txt b/data/GrabberConfig/drupal.org.txt
deleted file mode 100644
index 2da3eb1c..00000000
--- a/data/GrabberConfig/drupal.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title://h1
-author://div[@class="submitted"]/a
-date:substring-after(//div[@class="meta"],'modified: ')
-date:substring-after(//div[@class="submitted"],'on ')
-body://div[@class="node-content"]
-strip://div[@class="meta"]
-strip_id_or_class:book-navigation
-test_url: http://drupal.org/node/1327354 \ No newline at end of file
diff --git a/data/GrabberConfig/dushumashang.com.txt b/data/GrabberConfig/dushumashang.com.txt
deleted file mode 100644
index 6a50a77e..00000000
--- a/data/GrabberConfig/dushumashang.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# This filter is tested on:
-# http://www.dushumashang.com/2389
-# http://www.dushumashang.com/2415
-# http://www.dushumashang.com/2355
-
-body://div[@class='main_content']
-#body://section[@class='entry_content fl']
-title://h2
-author://span[@class='article_author']/a
-date://span[@class='pub_date']/time
-
-strip://span[@class='article_author']
-strip://span[@class='pub_date']
-strip://div[@class='page_turn']
-strip://span[@class='source_link']/em
-wrap_in(strong)://span[@class='source_link']/a
-test_url: http://www.dushumashang.com/2355 \ No newline at end of file
diff --git a/data/GrabberConfig/eandt.theiet.org.txt b/data/GrabberConfig/eandt.theiet.org.txt
deleted file mode 100644
index ba9d312d..00000000
--- a/data/GrabberConfig/eandt.theiet.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1
-date: //div[@class="et_dateUnderTitle"]
-author: substring-after(//div[@class="et_authorUnderTitle"], 'By ')
-body: //div[@id="et_leftCol640split"]
-
-strip: //div[@id="et_leftCol640splitRight"]
-strip: //div[@class="et_light_greybgboxlower"]
-test_url: http://eandt.theiet.org/magazine/2011/12/this-festive-waste.cfm \ No newline at end of file
diff --git a/data/GrabberConfig/eastoftheweb.com.txt b/data/GrabberConfig/eastoftheweb.com.txt
deleted file mode 100644
index 36708da3..00000000
--- a/data/GrabberConfig/eastoftheweb.com.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: //div[@class='title_text']
-
-author: //div[@class='author_text']
-
-body: //div[@class='story_text']/..
-
-strip: //b
-
-strip_id_or_class: back_to_top
-strip_id_or_class: author_text
-strip_id_or_class: title_text
-
-wrap_in(center): //a
-
-dissolve: //a
-
-footnotes: no
-test_url: http://www.eastoftheweb.com/short-stories/UBooks/Horl.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/ebay.com.txt b/data/GrabberConfig/ebay.com.txt
deleted file mode 100644
index f17e1f72..00000000
--- a/data/GrabberConfig/ebay.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //h1[@class='it-ttl'] | //div[@id='mainImgHldr'] | //span[@id='prcIsum']
-
-strip_image_src: imgLoading_30x30.gif
-
-test_url: http://www.ebay.com/itm/BRAND-NEW-FM-Transmitter-Ca-r-Charger-iPhone-4S-4-4G-3GS-3G-2G-iPod-Touch-/190657497204 \ No newline at end of file
diff --git a/data/GrabberConfig/ecetia.com.txt b/data/GrabberConfig/ecetia.com.txt
deleted file mode 100644
index d67e9103..00000000
--- a/data/GrabberConfig/ecetia.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://ecetia.com/2011/09/vida-de-jugon-vii-las-tres-es \ No newline at end of file
diff --git a/data/GrabberConfig/echo-online.de.txt b/data/GrabberConfig/echo-online.de.txt
deleted file mode 100644
index f72862b7..00000000
--- a/data/GrabberConfig/echo-online.de.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-# Author: Marvin Dickhaus
-# 2014-10-08
-
-#Tidy just messes up the DOM
-tidy: no
-
-title: //h1
-body: //h2 | //div[@id='artikelteaser'] | //div[@id='artikeltext']
-
-#Strip
-strip_image_src: artikel_a_merken.gif
-strip: //div[@class='zusatzinfo']
-
-#Author: substring is used to remove the " Von " prefix.
-author: substring(//li[@class='artikelautor'], 5)
-
-date: //li[@class='artikeldatum']
-
-#The first two URLs will at some point no longer show
-#the full article. There is a time-based paywall
-#installed. Using the feed should present valid output
-#test_url: http://www.echo-online.de/art1231,5503063
-#test_url: http://www.echo-online.de/art1168,5502598
-test_url: http://www.echo-online.de/lokales/darmstadt/index.rss
-
diff --git a/data/GrabberConfig/econlog.econlib.org.txt b/data/GrabberConfig/econlog.econlib.org.txt
deleted file mode 100644
index 729affd4..00000000
--- a/data/GrabberConfig/econlog.econlib.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class="title"]
-author: //div[@class="hosted"]/a
-date: substring-after(//div[@class="dateline"]/text(), '|')
-
-strip: //a[@class="top" and @href="#"]
-test_url: http://econlog.econlib.org/archives/2012/04/blinder_on_heal.html \ No newline at end of file
diff --git a/data/GrabberConfig/economia.estadao.com.br.txt b/data/GrabberConfig/economia.estadao.com.br.txt
deleted file mode 100644
index 936a191d..00000000
--- a/data/GrabberConfig/economia.estadao.com.br.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-date: //div[@class="bb-md-noticia-fecha"]
-body: //div[@class="corpo"]
-dissolve: //div[@class="bb-md-noticia-extras"]
-strip: //strong
-strip_id_or_class: bb-md-noticia-foto-autor
-strip_id_or_class: bb-md-noticia-foto-bajada
-test_url: http://economia.estadao.com.br/noticias/economia,cmn-aprova-r-67-bi-em-credito-para-20-setores-da-economia,118501,0.htm \ No newline at end of file
diff --git a/data/GrabberConfig/economie.gouv.fr.txt b/data/GrabberConfig/economie.gouv.fr.txt
deleted file mode 100644
index b0db03c1..00000000
--- a/data/GrabberConfig/economie.gouv.fr.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[contains(@class, 'txtVisu')]
-prune: no
-
-test_url: http://www.economie.gouv.fr/dgccrf/Publications/Vie-pratique/Fiches-pratiques/Assurance \ No newline at end of file
diff --git a/data/GrabberConfig/economist.com.txt b/data/GrabberConfig/economist.com.txt
deleted file mode 100644
index 8db5fdd6..00000000
--- a/data/GrabberConfig/economist.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-body: //div[@class='main-content']
-body: //article[contains(@class, 'resp-node')]
-date: //time[@class='date-created']
-strip: //aside
-prune: no
-
-autodetect_next_page: no
-
-test_url: http://www.economist.com/node/21528429
-
-test_url: http://www.economist.com/news/essays/21623373-which-something-old-and-powerful-encountered-vault
-test_contains: the calfskin pages are smooth
-test_contains: Books will evolve online and off
diff --git a/data/GrabberConfig/ecowatch.com.txt b/data/GrabberConfig/ecowatch.com.txt
deleted file mode 100644
index b115cc67..00000000
--- a/data/GrabberConfig/ecowatch.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-date: //meta[@property="article:published_time"]/@content
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-strip_id_or_class: print-no
-strip_id_or_class: subscribe
-strip_id_or_class: pagination
-strip: //p[starts-with(., 'Read page ')]
-
-next_page_link: //link[@rel="next"]
-
-test_url: http://ecowatch.com/2015/09/16/gop-climate-change-denial/ \ No newline at end of file
diff --git a/data/GrabberConfig/edge-online.com.txt b/data/GrabberConfig/edge-online.com.txt
deleted file mode 100644
index cf585815..00000000
--- a/data/GrabberConfig/edge-online.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //h2[@class='strapline'] | //article[contains(@class, 'node-article')]
-date: //time[@pubdate]/@datetime
-author: //span[@class='author-name']
-prune: no
-tidy: no
-strip: //footer
-
-replace_string(<p>[ pagebreak ]</p>): <!-- pagebreak -->
-
-single_page_link: //a[contains(@href, '?page=show')]
-
-test_url: http://www.edge-online.com/features/telling-modern-warfares-story \ No newline at end of file
diff --git a/data/GrabberConfig/edition.channel5belize.com.txt b/data/GrabberConfig/edition.channel5belize.com.txt
deleted file mode 100644
index 6d5f170a..00000000
--- a/data/GrabberConfig/edition.channel5belize.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='singlePage']//h2
-body: //div[@id='singlePage']//div[contains(@class, 'post')]
-strip: //a[@title='Email This Story']
-strip_id_or_class: sociable
-
-prune: no
-
-test_url: http://edition.channel5belize.com/archives/86016
-test_url: http://edition.channel5belize.com/feed \ No newline at end of file
diff --git a/data/GrabberConfig/edition.cnn.com.txt b/data/GrabberConfig/edition.cnn.com.txt
deleted file mode 100644
index 6fc82d24..00000000
--- a/data/GrabberConfig/edition.cnn.com.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-body: //div[@id='cnnContentContainer']//div[contains(@class, 'cnn_strycntntlft')]
-strip: //a[starts-with(@name, 'em')]
-strip: //div[@id='cnnCVP2']
-strip_id_or_class: cnn_strylftcexpbx
-strip_id_or_class: cnn_strylctcqrelt
-strip_id_or_class: cnn_strybtntoolsbttm
-strip_id_or_class: cnn_stryftsbttm
-strip_id_or_class: cnn_strybtmcntnt
-strip_id_or_class: cnn_stryshrwdgtbtm
-strip_id_or_class: cnnGalleryContainer
-strip_id_or_class: cnn_strycrcntr
-strip_id_or_class: cnn_html_slideshow
-prune: no
-
-test_url: http://edition.cnn.com/2011/US/04/29/severe.weather/index.html
-test_url: http://edition.cnn.com/2013/08/15/world/africa/nigeria-boko-haram-commander-killed/index.html?eref=edition
-test_url: http://rss.cnn.com/rss/edition.rss
-test_url: http://rss.cnn.com/rss/edition_technology.rss \ No newline at end of file
diff --git a/data/GrabberConfig/eetimes.com.txt b/data/GrabberConfig/eetimes.com.txt
deleted file mode 100644
index 300db307..00000000
--- a/data/GrabberConfig/eetimes.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[contains(@class, 'grayshowlinks')]
-
-next_page_link: //div[@id='sitecontentcol']//a[.='Next >']
-# Doesn't work (site doesn't always load full content in print view)
-#single_page_link: //div[@id='sitecontentcol']//a[contains(@href, 'print=yes')]
-
-test_url: http://www.eetimes.com/document.asp?doc_id=1319966&
-test_url: http://www.eetimes.com/rss_simple.asp \ No newline at end of file
diff --git a/data/GrabberConfig/ekultura.hu.txt b/data/GrabberConfig/ekultura.hu.txt
deleted file mode 100644
index 3756027c..00000000
--- a/data/GrabberConfig/ekultura.hu.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[@class='style6 nevek']
-
-body: //div[@class='bal3']
-
-
-prune: yes
-
-tidy: yes
-convert_double_br_tags: yes
-
-test_url: http://ekultura.hu/olvasnivalo/egyeb/cikk/2010-12-15/interju-galvolgyi-judit-2010-december \ No newline at end of file
diff --git a/data/GrabberConfig/elance.com.txt b/data/GrabberConfig/elance.com.txt
deleted file mode 100644
index d4b0a9b8..00000000
--- a/data/GrabberConfig/elance.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='jobDesc-bd']/p
-
-test_url: http://www.elance.com/j/xml-technical-intergration/23687172/ \ No newline at end of file
diff --git a/data/GrabberConfig/elderscrollsonline.com.txt b/data/GrabberConfig/elderscrollsonline.com.txt
deleted file mode 100644
index fa3892c6..00000000
--- a/data/GrabberConfig/elderscrollsonline.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-date: //time
-title: //h1[contains(@class, "alpha")]
-body: //article[contains(@class, "news-post")]
-
-# fix dates - dates as they are won't work as strtotime doesn't understand format (03.28.2013)
-replace_string(<time class="gamma">01.): <time class="gamma">January.
-replace_string(<time class="gamma">02.): <time class="gamma">February.
-replace_string(<time class="gamma">03.): <time class="gamma">March.
-replace_string(<time class="gamma">04.): <time class="gamma">April.
-replace_string(<time class="gamma">05.): <time class="gamma">May.
-replace_string(<time class="gamma">06.): <time class="gamma">June.
-replace_string(<time class="gamma">07.): <time class="gamma">July.
-replace_string(<time class="gamma">08.): <time class="gamma">August.
-replace_string(<time class="gamma">09.): <time class="gamma">September.
-replace_string(<time class="gamma">10.): <time class="gamma">October.
-replace_string(<time class="gamma">11.): <time class="gamma">November.
-replace_string(<time class="gamma">12.): <time class="gamma">December.
-
-prune: no
-
-test_url: http://elderscrollsonline.com/en/rss
-test_url: http://elderscrollsonline.com/en/news/post/2013/03/27/developer-question-of-the-week-17 \ No newline at end of file
diff --git a/data/GrabberConfig/elektroniknet.de.txt b/data/GrabberConfig/elektroniknet.de.txt
deleted file mode 100644
index 2485eab7..00000000
--- a/data/GrabberConfig/elektroniknet.de.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-date: //time
-next_page_link: //li[@class='next']//a
-
-# 1 page
-test_url: http://www.elektroniknet.de/elektronik-automotive/wirtschaft/aus-quattro-gmbh-wird-audi-sport-136464.html
-test_contains: etwa 1.200 Mitarbeiter an den Standorten Neckarsulm und Ingolstadt
-
-# 2 pages
-test_url: http://www.elektroniknet.de/elektronik-automotive/sonstiges/machine-learning-wird-demnaechst-massiv-an-bedeutung-gewinnen-136362.html
-test_contains: Ende 2014 übernahm er seine heutige Position als CEO von MBRDNA
diff --git a/data/GrabberConfig/elmalpensante.com.txt b/data/GrabberConfig/elmalpensante.com.txt
deleted file mode 100644
index 435c6c20..00000000
--- a/data/GrabberConfig/elmalpensante.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-single_page_link: //a[contains(@href, 'print_contenido')]
-title: //h2
-author: //div[@class="autor"]
-test_url: http://www.elmalpensante.com/index.php?doc=display_contenido&id=668 \ No newline at end of file
diff --git a/data/GrabberConfig/elpais.com.txt b/data/GrabberConfig/elpais.com.txt
deleted file mode 100644
index 7552afa5..00000000
--- a/data/GrabberConfig/elpais.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-title: //meta[@name='DC.title']/@content
-title: //div[contains(@class, 'cabecera_noticia')]//h1
-date: //meta[@name='DC.date']/@content
-date: //meta[@name='date']/@content
-body: //div[@class='columna_texto']
-body: //div[@id='cuerpo_noticia']
-body: //div[@class='estructura_2col_1zq']//div[@class='margen_n']
-
-prune: no
-
-strip_id_or_class: disposicion_vertical
-strip_id_or_class: ampliar_foto
-strip_id_or_class: utilidades
-strip_id_or_class: info_relacionada
-strip_id_or_class: m-kiosko
-strip_id_or_class: info_complementa
-
-strip: //div[starts-with(@id, 'sumario') and contains(., 'más información')]
-strip: //div[@id='coment' or @id='foros_not']
-
-test_url: http://elpais.com/elpais/2012/02/06/gente/1328526783_491687.html
-test_url: http://elpais.com/diario/2012/02/07/cultura/1328569202_850215.html
diff --git a/data/GrabberConfig/emaratalyoum.com.txt b/data/GrabberConfig/emaratalyoum.com.txt
deleted file mode 100644
index 749491b7..00000000
--- a/data/GrabberConfig/emaratalyoum.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@id='article-body' or contains(@class, 'articleinlinegallery')]
-
-prune: no
-
-test_url: http://www.emaratalyoum.com/politics/news/2015-10-10-1.828836
-test_url: http://www.emaratalyoum.com/sports/arab-and-international/2013-08-29-1.601844
-test_url: http://www.emaratalyoum.com/sports/arab-and-international/2013-08-29-1.601842
-test_url: http://www.emaratalyoum.com/public-sports-1.533088?ot=ot.AjaxPageLayout \ No newline at end of file
diff --git a/data/GrabberConfig/en.espnf1.com.txt b/data/GrabberConfig/en.espnf1.com.txt
deleted file mode 100644
index 2ca0216b..00000000
--- a/data/GrabberConfig/en.espnf1.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@id='content']
-strip: //div[@class='rl']
-strip: //p[@class='authdesc']
-strip: //p[@class='strybtm']
-strip: //div[@id='stryFtrLft']
-strip: //div[@id='f1Conversation']
-strip: //div[@id='cmtSpncrRuler']
-strip: //div[@id='stryComments']
-strip: //div[@id='athrData']
-test_url: http://en.espnf1.com/monaco/motorsport/story/50529.html \ No newline at end of file
diff --git a/data/GrabberConfig/engadget.com.txt b/data/GrabberConfig/engadget.com.txt
deleted file mode 100644
index f5f7cf51..00000000
--- a/data/GrabberConfig/engadget.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[contains(@class, 'o-article_block')]
-
-prune: no
-
-test_url: http://www.engadget.com/2011/05/20/screen-grabs-the-mentalist-takes-the-ipad-to-new-heights/ \ No newline at end of file
diff --git a/data/GrabberConfig/engineering.tumblr.com.txt b/data/GrabberConfig/engineering.tumblr.com.txt
deleted file mode 100644
index 48f301fe..00000000
--- a/data/GrabberConfig/engineering.tumblr.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h2
-body: //div[@class="post_content"]
-author: //p[@class="author"]/a
-date: //p[@class="date"]
-strip: //h2
-strip: //header
-test_url: http://engineering.tumblr.com/post/21276808338/tumblr-firehose \ No newline at end of file
diff --git a/data/GrabberConfig/english.aljazeera.net.txt b/data/GrabberConfig/english.aljazeera.net.txt
deleted file mode 100644
index 97365994..00000000
--- a/data/GrabberConfig/english.aljazeera.net.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //span[@id='DetailedTitle']
-body: //div[@id='ctl00_cphBody_dvArticleInfoBlock'] | //td[@class='DetailedSummary']
-strip_id_or_class: sidebar
-strip_id_or_class: Skyscrapper_Body
-strip: //td[@class='DetailedSummary']/table[position() != 1]
-prune: no
-test_url: http://english.aljazeera.net//news/middleeast/2011/04/20114681444376835.html \ No newline at end of file
diff --git a/data/GrabberConfig/enikos.gr.txt b/data/GrabberConfig/enikos.gr.txt
deleted file mode 100644
index ddd51c4b..00000000
--- a/data/GrabberConfig/enikos.gr.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id='article']//div[contains(@class, 'inside')]
-
-strip_id_or_class: tags
-strip_id_or_class: actions
-strip_id_or_class: google-ads
-
-prune: no
-
-test_url: http://www.enikos.gr/politics/98606,To_oxi_toy_Agorastoy_stoys_Germanoys.html \ No newline at end of file
diff --git a/data/GrabberConfig/entertainment.timesonline.co.uk.txt b/data/GrabberConfig/entertainment.timesonline.co.uk.txt
deleted file mode 100644
index a756c457..00000000
--- a/data/GrabberConfig/entertainment.timesonline.co.uk.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-author://div[@class = 'article-author']/span[@class = 'byline']
-title://h1[@class = 'heading']
-body://div[@id = 'related-article-links']
-strip://div[@id = 'comment-sort-order']
-strip://div[@id = 'my-profile']
-strip://div[@class = 'article-author']
-strip://div[@class = 'bg-f8f1d8 width-385 text-left']
-strip://div[@id = 'login-status']
-strip://div[@class = 'puff-padding']
-test_url: http://entertainment.timesonline.co.uk/tol/arts_and_entertainment/the_tls/article7177738.ece \ No newline at end of file
diff --git a/data/GrabberConfig/entwickler.de.txt b/data/GrabberConfig/entwickler.de.txt
deleted file mode 100644
index 316f3991..00000000
--- a/data/GrabberConfig/entwickler.de.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class="post-title"]
-body: //section[@class="article-content"]
-author: //div[@class="post-bottom-meta"]/span[@class="post-author"]
-date: //div[@class="post-date"]/time/@datetime
-
-test_url: https://entwickler.de/online/mobile-welt-offline-welt-was-der-offline-first-ansatz-fuer-app-entwickler-heisst-140602.html
-test_url: https://entwickler.de/online/development/plex-docker-joomla-165345.html
diff --git a/data/GrabberConfig/ericsuh.com.txt b/data/GrabberConfig/ericsuh.com.txt
deleted file mode 100644
index d25140c5..00000000
--- a/data/GrabberConfig/ericsuh.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-date: //h6[@class='datetime']/child::text()
-author: string("Eric J. Suh")
-footnotes: yes
-test_url: http://www.ericsuh.com/blog/posts/2012/8/strange-numbers.html \ No newline at end of file
diff --git a/data/GrabberConfig/es.hu.txt b/data/GrabberConfig/es.hu.txt
deleted file mode 100644
index 21691a56..00000000
--- a/data/GrabberConfig/es.hu.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: concat(//div[@class='doc_author'], ' - ', upper-case(//div[@class='doc_title']))
-
-body: //div[@class='doc']
-
-prune: yes
-
-tidy: yes
-convert_double_br_tags: yes
-
-strip: //a[contains(@href, 'www.facebook.com/pages/Elet-es-Irodalom/')]
-test_url: http://www.es.hu/2010-12-08_vissza-a-partpenzt \ No newline at end of file
diff --git a/data/GrabberConfig/escapistmagazine.com.txt b/data/GrabberConfig/escapistmagazine.com.txt
deleted file mode 100644
index fd453a19..00000000
--- a/data/GrabberConfig/escapistmagazine.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class='headline']/div[@class='name']
-
-strip_image_src: 'http://cdn.themis-media.com/media/global/images/library/deriv/115/115825.png'
-
-next_page_link: //a[@class='next_page']
-
-strip_comments: no
-test_url: http://www.escapistmagazine.com/articles/view/columns/criticalintel/10302-I-Hate-Magic \ No newline at end of file
diff --git a/data/GrabberConfig/esglobal.org.txt b/data/GrabberConfig/esglobal.org.txt
deleted file mode 100644
index 6408f441..00000000
--- a/data/GrabberConfig/esglobal.org.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='blog-content']
-
-test_url: http://www.esglobal.org/el-caos-en-el-este-los-socios-de-la-ue-necesitan-que-se-les-preste-atencion/
diff --git a/data/GrabberConfig/espacepolitique.revues.org.txt b/data/GrabberConfig/espacepolitique.revues.org.txt
deleted file mode 100644
index c4acb26e..00000000
--- a/data/GrabberConfig/espacepolitique.revues.org.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fespacepolitique.revues.org%2F284
-
-body: //div[@id='text']
-
-strip_id_or_class: paranumber
-strip_id_or_class: go-top
-
-test_url: http://espacepolitique.revues.org/284
diff --git a/data/GrabberConfig/espn.go.com.txt b/data/GrabberConfig/espn.go.com.txt
deleted file mode 100644
index 06476296..00000000
--- a/data/GrabberConfig/espn.go.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //div[@class='headline'] | //div[@class='mod-header']/h3
-body: //div[contains(@class, 'article')]
-strip: //div[contains(@class, 'mod-inline')]
-strip: //*/span[@class='page-actions']
-strip: //div[@class='page-actions']/*
-strip: //div[@class='headline'] | //div[@class='mod-header']/h3
-strip: //div[@class='mod-blog-navigation']
-strip: //div[@class='monthday']
-strip: //div[@class='time']
-strip: //div[@class='timeofday']
-strip: //div[contains(@class, 'mod-conversations')]
-test_url: http://espn.go.com/boston/mlb/story/_/id/7092528/terry-francona-victim-latest-red-sox-smear-campaign \ No newline at end of file
diff --git a/data/GrabberConfig/esquire.com.txt b/data/GrabberConfig/esquire.com.txt
deleted file mode 100644
index b9cb1e55..00000000
--- a/data/GrabberConfig/esquire.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1
-author: //div[@id='byline']
-
-body: //div[@id='printBody']
-
-single_page_link: concat('http://www.esquire.com/print-this/', substring-after(//link[@rel='canonical']/@href, 'esquire.com/'))
-
-prune: no
-
-test_url: http://www.esquire.com/features/impossible/price-is-right-perfect-bid-0810
-test_url: http://www.esquire.com/blogs/politics/police-getting-leftover-armoured-iraq-trucks-112513 \ No newline at end of file
diff --git a/data/GrabberConfig/estadao.com.br.txt b/data/GrabberConfig/estadao.com.br.txt
deleted file mode 100644
index 5ed8f7e4..00000000
--- a/data/GrabberConfig/estadao.com.br.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h1[contains(concat(' ',normalize-space(@class),' '),' titulo ')]
-body: //article[contains(concat(' ',normalize-space(@class),' '),' texto ')]
-
-test_url: http://ciencia.estadao.com.br/noticias/geral,22-mil-toneladas-de-fosforo-do-saara-fertilizam-a-amazonia,1640532
diff --git a/data/GrabberConfig/eternabuenosaires.com.txt b/data/GrabberConfig/eternabuenosaires.com.txt
deleted file mode 100644
index bfa2c5dc..00000000
--- a/data/GrabberConfig/eternabuenosaires.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://eternabuenosaires.com/2011/09/calle-adolfo-bioy-casares \ No newline at end of file
diff --git a/data/GrabberConfig/eurogamer.net.txt b/data/GrabberConfig/eurogamer.net.txt
deleted file mode 100644
index 8931becb..00000000
--- a/data/GrabberConfig/eurogamer.net.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //p[@class='strapline'] | //div[@class='cover-image'] | //article[@class='hd']
-strip: //div[@class='social top']
-strip: //p[@class='byline']
-
-date: //span[@itemprop='datePublished']
-author: //a[@itemprop='author']/text()
-
-test_url: http://www.eurogamer.net/articles/2014-08-20-bungie-ordered-to-return-shares-to-composer-marty-odonnell
-test_url: http://www.eurogamer.net/articles/2014-08-20-invisible-inc-does-espionage-justice
diff --git a/data/GrabberConfig/evo.co.uk.txt b/data/GrabberConfig/evo.co.uk.txt
deleted file mode 100644
index ccb4f879..00000000
--- a/data/GrabberConfig/evo.co.uk.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-author: substring-after(//div[@class='articleauthor'],'By ')
-
-# Blog posts
-date: //div[@class='articledate']
-# News
-date: //div[@class='articledate_b']
-
-body: //div[@class='articletext']
-
-convert_double_br_tags: yes
-test_url: http://www.evo.co.uk/carreviews/evolongtermtests/280072/bmw_330d_sport_touring.html \ No newline at end of file
diff --git a/data/GrabberConfig/explosm.net.txt b/data/GrabberConfig/explosm.net.txt
deleted file mode 100644
index f2d0a20f..00000000
--- a/data/GrabberConfig/explosm.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //img[@id='main-comic']
-author: substring(//small[@class="author-credit-name"], 4)
-
-test_url: http://explosm.net/comics/3954/
diff --git a/data/GrabberConfig/expressen.se.txt b/data/GrabberConfig/expressen.se.txt
deleted file mode 100644
index d81d3251..00000000
--- a/data/GrabberConfig/expressen.se.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1[contains(@class, 'b-headline_article')]
-body: //div[contains(@class, 'b-article_print')]
-
-single_page_link: //div[contains(@class, 'b-page__footer__actions')]//a[contains(@href, 'print=true')]
-
-prune: no
-
-test_url: http://www.expressen.se/kultur/1.2683904/medan-natet-dras-at
-test_url: http://www.expressen.se/gt/polis-om-styckmordet-extremt-markligt-fall/
-test_url: http://www.expressen.se/Pages/OutboundFeedsPage.aspx?id=3642159&viewstyle=rss \ No newline at end of file
diff --git a/data/GrabberConfig/extracine.com.txt b/data/GrabberConfig/extracine.com.txt
deleted file mode 100644
index 52b598da..00000000
--- a/data/GrabberConfig/extracine.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://extracine.com/2011/09/straw-dogs-la-original \ No newline at end of file
diff --git a/data/GrabberConfig/f1actual.com.txt b/data/GrabberConfig/f1actual.com.txt
deleted file mode 100644
index 6ef2738a..00000000
--- a/data/GrabberConfig/f1actual.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://f1actual.com/2011/09/previo-gran-premio-de-singapur \ No newline at end of file
diff --git a/data/GrabberConfig/facebook.com.txt b/data/GrabberConfig/facebook.com.txt
deleted file mode 100644
index 3aefc615..00000000
--- a/data/GrabberConfig/facebook.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-body: //div[@id='imagestage']
-body: //div[contains(@class, 'userContentWrapper')]
-body: //div[@id='m_story_permalink_view' or contains(@data-sigil, 'm-story-view')]
-strip_id_or_class: commentable
-strip: //div[contains(@data-sigil, 'm-mentions-expand')]
-
-http_header(user-agent): PHP/5.3
-strip_id_or_class: copyright
-# this remove the cookie policy banner
-strip_id_or_class: fbPageBannerInner
-
-prune: no
-tidy: no
-
-#single_page_link: concat("https://m.", substring-after(//link[@rel="alternate" and @media="handheld"]/@href, "//www."))
-#if_page_contains: //link[@rel="alternate" and @media="handheld"]
-
-test_url: https://www.facebook.com/permalink.php?story_fbid=10154584776550183&id=294468630182
-test_contains: holding an extraordinary session in Brussels this month
-test_url: https://www.facebook.com/notes/protect-the-graph/retiring-sha-1-certificates/1814716098768533
diff --git a/data/GrabberConfig/facta.co.jp.txt b/data/GrabberConfig/facta.co.jp.txt
deleted file mode 100644
index f130568a..00000000
--- a/data/GrabberConfig/facta.co.jp.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='content']
-
-test_url: http://facta.co.jp/blog/archives/20111026001026.html
diff --git a/data/GrabberConfig/falter.at.txt b/data/GrabberConfig/falter.at.txt
deleted file mode 100644
index 2bfcc9b4..00000000
--- a/data/GrabberConfig/falter.at.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //h1
-author: //a[contains(@href, '/kategorie/autoren')]
-date: //a[contains(@href, '/falter/ausgabe')]
-body: //article[@class='spanMain']
-
-# cleanup
-strip_id_or_class: 'respond'
-strip: //img[@src='http://www.falter.at/web/_pics/falterlogo_dblau.gif']
-strip_id_or_class: 'meta'
-strip_id_or_class: 'servicebox'
-strip_id_or_class: 'related'
-strip_id_or_class: 'twitter-share-button'
-strip: //br
-test_url: http://www.falter.at/falter/2013/03/26/der-dandy-auf-der-sinkenden-galeere/ \ No newline at end of file
diff --git a/data/GrabberConfig/fanfiction.net.txt b/data/GrabberConfig/fanfiction.net.txt
deleted file mode 100644
index e7cab4d4..00000000
--- a/data/GrabberConfig/fanfiction.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //*[@id = 'story text']
-author: //a[starts-with(@href, '/u/')]
-next_page_link: substring-after(//input[contains(@value, 'Next')]/@onclick, "self.location='")
-autodetect_next_page:yes
-strip_id_or_class: 'a2a_kit'
-test_url: http://www.fanfiction.net/s/6497403/1/Spartan_Love \ No newline at end of file
diff --git a/data/GrabberConfig/fastcompany.com.txt b/data/GrabberConfig/fastcompany.com.txt
deleted file mode 100644
index bf8375ee..00000000
--- a/data/GrabberConfig/fastcompany.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-author: //div[@class='byline']//a
-date: //meta[@property='article:published_time']/@content
-body: //figure[@class='jumbotron'] | //div[@itemprop='body']
-
-prune: no
-
-#strip_id_or_class: article-top-wrapper
-#strip_id_or_class: footer-message
-#strip_id_or_class: print-logo
-#strip: //cite
-#strip://*[@class='timestamp']
-#strip://div[@id='page_right']
-#strip://section[@id='header_region']
-#strip://h1[@class='node-title']
-#strip://div[@class='node-submitted']
-#strip_id_or_class: skipnav
-
-test_url: http://www.fastcompany.com/3000226/link-between-quietness-and-productivity
-test_contains: Some of you may have tried to reach me this morning
-test_url: http://www.fastcompany.com/3003586/6-simple-rituals-reach-your-potential-every-day
diff --git a/data/GrabberConfig/faz.net.txt b/data/GrabberConfig/faz.net.txt
deleted file mode 100644
index 47048a1b..00000000
--- a/data/GrabberConfig/faz.net.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-# Author: zinnober
-# Complete rewrite of the faz.net template as the standard one is broken
-# I tried to consider as many page variants as possible, which was some serious work
-
-tidy: no
-prune: no
-
-# Title
-title: //p[@class='Content HeadlineShort']
-
-# Set author
-author: substring-after(//span[@class='Autor'], 'von ')
-author: //span[@class='caps last']/span[@class='caps last']
-author: //a[@rel='author']
-
-# Set date
-date: //span[@class='Datum']
-date: //span[@class='Datum'],/span
-
-# Fetch full multipage articles
-next_page_link: //a[@title='Nächste Seite']
-
-# Content is here
-body: //div[@class='Artikel']
-
-# Tidy up before article
-strip: //div[@id='FAZHeaderNeu']
-strip: //h2[@itemprop='headline']
-strip: //span[@class='Datum']
-strip: //span[@class='Autor']
-strip_id_or_class: ArticlePagerTop
-
-# General cleanup
-strip: //div[@class='clear']
-strip: //a[@title='Zur Homepage FAZ.NET']
-strip: //iframe
-replace_string( · ):
-
-# Remove tracking and ads
-strip_image_src: /l.gif?
-strip: //div[contains(@style, 'background-image')]
-strip: //img[@width='1']
-strip_id_or_class: invisible
-strip_id_or_class: Anzeige
-strip_id_or_class: billboard
-
-# Remove various text boxes and social media foo
-strip_id_or_class: WeitereBeitraege
-strip_id_or_class: WBListe
-strip_id_or_class: AutorenModul
-strip_id_or_class: Community
-strip_id_or_class: SocialMediaStatus
-strip_id_or_class: RelatedLinkBox
-strip_id_or_class: MultimediaNavigation
-strip_id_or_class: IndexTitel
-
-# Fix picture caps and pictures (use better resolution and remove clutter)
-strip_id_or_class: LightBoxOverlay
-strip_id_or_class: exitLarge
-strip_id_or_class: PagerBox
-strip_id_or_class: Bildnachweis
-strip_id_or_class: Bildueberschrift
-strip_id_or_class: Bildbeschreibung
-strip_id_or_class: ArtikelBild610
-strip_id_or_class: MediaLink
-strip_id_or_class: FotoBoxInnerLeft
-strip_id_or_class: BilderRelatedLinks
-
-# Remove clutter after article
-strip_id_or_class: ArticlePagerBottom
-strip_id_or_class: backToHome
-strip_id_or_class: ArtikelAbbinder
-strip_id_or_class: lesermeinungscontainer
-strip_id_or_class: ThemenLinks
-strip_id_or_class: rechtehinweis
-strip_id_or_class: FAZArtikelMap
-strip_id_or_class: FAZArtikelKommentare
-strip_id_or_class: ArtikelKommentieren
-strip_id_or_class: FAZArtikelFunktionen
-strip_id_or_class: mailLB
-strip_id_or_class: FAZContentRight
-strip_id_or_class: stageModule
-strip_id_or_class: ContentFooter
-strip_id_or_class: ServicesFooter
-strip_id_or_class: FAZFooter
-
-# Clean up stuff present just in some articles
-strip_id_or_class: Teaser620
-strip_id_or_class: TeaserMultimedia
-strip_id_or_class: VideoBox
-
-# Remove as soon as Wallabag maight be able to embed flash video
-strip_id_or_class: mmoObjectAsTeaserInArticle
-strip_id_or_class: additionalStylesAudioVideo
-strip_id_or_class: hideMMElements
-
-# Try it yourself
-test_url: http://www.faz.net/aktuell/feuilleton/zum-tod-von-margaret-thatcher-die-reizfigur-12141919.html#Drucken
-test_url: http://www.faz.net/aktuell/politik/inland/allensbach-analyse-im-namen-des-volkes-13106492.html
-test_url: http://www.faz.net/aktuell/feuilleton/kino/video-filmkritiken/video-filmkritik-when-animals-dream-zerrissene-jugend-13105772.html
-
diff --git a/data/GrabberConfig/feeds.feedblitz.com.txt b/data/GrabberConfig/feeds.feedblitz.com.txt
deleted file mode 100644
index 1c08d8f7..00000000
--- a/data/GrabberConfig/feeds.feedblitz.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-http_header(referer): http://feedblitz.com
diff --git a/data/GrabberConfig/fertigung.de.txt b/data/GrabberConfig/fertigung.de.txt
deleted file mode 100644
index 90145e58..00000000
--- a/data/GrabberConfig/fertigung.de.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-title: //title
-
-body: //div[@id='content']
-
-strip: (//div[@id='content']/h2)[1]
-
-strip: //h2[contains(., 'mehr News')]/following::*
-strip: //h2[contains(., 'mehr News')]
-
-strip: //div[contains(@class, 'indizar')]/following::*
-strip: //div[contains(@class, 'indizar')]
-
-strip: //h1[contains(@class, 'single')]/preceding::*
-strip: //h1[contains(@class, 'single')]
-
-strip_id_or_class: plista_widget
-
-prune: no
-
-next_page_link: //a[contains(., 'Weiter')]
-
-test_url: http://www.fertigung.de/2013/04/igus-neuer-energiekettenkatalog/
-test_url: http://www.fertigung.de/2013/04/dynamisch-und-hochpraezise/ \ No newline at end of file
diff --git a/data/GrabberConfig/fictionpress.com.txt b/data/GrabberConfig/fictionpress.com.txt
deleted file mode 100644
index 19ec16b0..00000000
--- a/data/GrabberConfig/fictionpress.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: id('storytext')
-author: //a[starts-with(@href, '/u/')]
-#next_page_link: substring-after(//input[contains(@value, 'Next')]/@onclick, "self.location='")
-strip_id_or_class: 'a2a_kit'
-test_url: http://www.fictionpress.com/s/2897964/1/All_We_Knew \ No newline at end of file
diff --git a/data/GrabberConfig/ficwad.com.txt b/data/GrabberConfig/ficwad.com.txt
deleted file mode 100644
index 081f0bb0..00000000
--- a/data/GrabberConfig/ficwad.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h4
-author: //span[@class="author"]
-body: //div[@id="story"]
-strip_id_or_class: summary
-strip_id_or_class: meta
-strip_id_or_class: storyfoot
-convert_double_br_tags: yes
-prune: no
-
-# Note: this site still has trouble because single <br> tags are stripped, but I don't see a way to fix that with this interface.
-
-test_url: http://www.ficwad.com/story/158977 \ No newline at end of file
diff --git a/data/GrabberConfig/filmstarts.de.txt b/data/GrabberConfig/filmstarts.de.txt
deleted file mode 100644
index 6929847f..00000000
--- a/data/GrabberConfig/filmstarts.de.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //div[@class='title large']
-author: //meta[@name='author']/@content
-
-body: //div[@id="col_main"]
-
-strip: //div[@class='richTextPlayer']
-strip: //div[contains(@class, "samekind")]
-strip: //div[contains(@class, "shareThis")]
-strip: //div[@class="jtp"]
-strip: //div[@id="showdisqus"]
-strip: //div[@class="disqus_toggle"]
-strip: //div[@class="lighten margin_20b"]
-
-test_url: http://www.filmstarts.de/nachrichten/18503731.html
diff --git a/data/GrabberConfig/finance.yahoo.com.txt b/data/GrabberConfig/finance.yahoo.com.txt
deleted file mode 100644
index 0c967db0..00000000
--- a/data/GrabberConfig/finance.yahoo.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //meta[@property='og:title']/@content
-body: //div[@id='y-article-bd']
-body: //div[contains(@class, 'yom-art-content')]
-strip: //div[contains(@class, 'related-companies')]
-strip: //div[@id='y-article-related']
-strip: //div[@id='ypf-article-related']
-prune: no
-tidy: no
-
-single_page_link: //div[@class='ft']//a[contains(@href, 'page=all')]
-
-test_url: http://finance.yahoo.com/news/canadian-orebodies-gives-notice-exercise-130000032.html \ No newline at end of file
diff --git a/data/GrabberConfig/findtheswagger.tumblr.com.txt b/data/GrabberConfig/findtheswagger.tumblr.com.txt
deleted file mode 100644
index 43aef750..00000000
--- a/data/GrabberConfig/findtheswagger.tumblr.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-date: //div[@class='notes']/a
-body: //div[@id='content']
-
-strip_id_or_class: tags
-strip_id_or_class: permalink
-strip_id_or_class: notes
-strip_id_or_class: post_nav
-strip: //div[@id='content']//h2
-strip_id_or_class: right_column
-test_url: http://findtheswagger.tumblr.com/post/11589145141/moe-resners-end-of-an-era-1957-giants-final \ No newline at end of file
diff --git a/data/GrabberConfig/finexpert.e15.cz.txt b/data/GrabberConfig/finexpert.e15.cz.txt
deleted file mode 100644
index 7cf8feb5..00000000
--- a/data/GrabberConfig/finexpert.e15.cz.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-strip_id_or_class: article-linktoanother
-
-test_url: http://finexpert.e15.cz/budiz-teplo-eu-stedre-zadotuje-nejen-plynovy-kotel \ No newline at end of file
diff --git a/data/GrabberConfig/firstthings.com.txt b/data/GrabberConfig/firstthings.com.txt
deleted file mode 100644
index ce972bac..00000000
--- a/data/GrabberConfig/firstthings.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class='articleTitle']
-author: //div[@class='articleAuthor']
-body: //div[@class='articleContent']
-prune: no
-convert_double_br_tags: yes
-
-test_url: http://www.firstthings.com/article/2011/05/the-trouble-with-ayn-rand \ No newline at end of file
diff --git a/data/GrabberConfig/fivechapters.com.txt b/data/GrabberConfig/fivechapters.com.txt
deleted file mode 100644
index 9614d2f6..00000000
--- a/data/GrabberConfig/fivechapters.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='entry']
-test_url: http://www.fivechapters.com/2014/the-saddest-writer-in-america-part-two/
diff --git a/data/GrabberConfig/fivefilters.org.txt b/data/GrabberConfig/fivefilters.org.txt
deleted file mode 100644
index f37f02b9..00000000
--- a/data/GrabberConfig/fivefilters.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //section[contains(@class, 'container')]
-prune: no
-
-test_url: http://fivefilters.org/kindle-it/
diff --git a/data/GrabberConfig/fivethirtyeight.com.txt b/data/GrabberConfig/fivethirtyeight.com.txt
deleted file mode 100644
index d0a0a772..00000000
--- a/data/GrabberConfig/fivethirtyeight.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: substring-after(//title, 'Right:')
-body: //div[@class = 'post-body']
-author: substring-after(//*[@class='post-author'], 'by')
-date: concat(//*[@class='date-header'], ' ', //*[@class='post-timestamp']/a)
-convert_double_br_tags: yes
-
-test_url: http://www.fivethirtyeight.com/2010/07/does-rnc-have-structural-problems.html \ No newline at end of file
diff --git a/data/GrabberConfig/flyingmachinestudios.com.txt b/data/GrabberConfig/flyingmachinestudios.com.txt
deleted file mode 100644
index 2053f801..00000000
--- a/data/GrabberConfig/flyingmachinestudios.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip_id_or_class: linenos
-test_url: http://www.flyingmachinestudios.com/programming/whoops-dci-refactoring/ \ No newline at end of file
diff --git a/data/GrabberConfig/fm4.orf.at.txt b/data/GrabberConfig/fm4.orf.at.txt
deleted file mode 100644
index 1e2ef6e0..00000000
--- a/data/GrabberConfig/fm4.orf.at.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-author: //div[@class='authorDescription']/h2
-body: //div[@id='story']
-title: //h1[@class='detail']
-
-date: translate(translate(substring-before(substring-after(//p[@class='date'],'Erstellt am:'), ' Uhr'), '. ', '.'), '-', ' ')
-strip: //p[@class='date']
-
-strip: //p[@class='credit']
-
-tidy: no
-prune: no
-parser: html5lib
-
-test_url: http://fm4.orf.at/stories/1689156/
diff --git a/data/GrabberConfig/fnal.gov.txt b/data/GrabberConfig/fnal.gov.txt
deleted file mode 100644
index e404ccb8..00000000
--- a/data/GrabberConfig/fnal.gov.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: normalize(//h1)
-
-author: //td/p[position()=last()]/em
-
-# I swear, this is really the best way to do this
-date: normalize(//td[contains(@style, "color: #ffffff")])
-
-# my god, it's full of tables
-body: /table/tbody/tr[5]//table/tbody//table/tbody/tr/td
-strip: //h1
-
-# the following two lines strip the byline at the end of the article (the byline is a <p> that consists of an em dash and then some text in an <em>). I have no idea why I can't just strip //p[position()=last()], but trying to do so includes a bunch of other crap in the output.
-strip: //p[position()=last()]/em
-strip: //p[position()=last()]/child::text()
-test_url: http://www.fnal.gov/pub/today/archive_2011/today11-11-09_MuonDepartmentReadMore.html \ No newline at end of file
diff --git a/data/GrabberConfig/focus-numerique.com.txt b/data/GrabberConfig/focus-numerique.com.txt
deleted file mode 100644
index 493e4980..00000000
--- a/data/GrabberConfig/focus-numerique.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.focus-numerique.com%2Fpourquoi-ccd-va-disparaitre-news-9396.html
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' bloc_news ')]
-strip_id_or_class: mail_reactions_news
-
-test_url: http://www.focus-numerique.com/pourquoi-ccd-va-disparaitre-news-9396.html
diff --git a/data/GrabberConfig/focus.de.txt b/data/GrabberConfig/focus.de.txt
deleted file mode 100644
index 6da3687e..00000000
--- a/data/GrabberConfig/focus.de.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-title: //h1
-
-author: //div[@class='articleContent small']/div[@class='textBlock']//span[@class='created']
-
-date: //div[@class='articleHead']/span[@class='created']
-
-body: //div[@id='article']
-
-strip: //span[@class='markerText']
-strip: //div[@class='articleContent small']/div[@class='textBlock']//span[@class='created']
-strip: //div[@class='sidebar']
-strip: //div[@class='starbar']
-strip: //div[@class='actions clearfix']
-strip: //div[@id='commentForm']
-strip: //div[@id='commentSent']
-strip: //div[@id='comments']
-strip: //div[@class='similarityBlock']
-
-test_url: http://www.focus.de/politik/ausland/ein-jahr-nach-bombenanschlag-u-bahn-attentaeter-von-minsk-hingerichtet_aid_724958.html \ No newline at end of file
diff --git a/data/GrabberConfig/fok.nl.txt b/data/GrabberConfig/fok.nl.txt
deleted file mode 100644
index 012f07df..00000000
--- a/data/GrabberConfig/fok.nl.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# skip cookie warning
-single_page_link: concat(//form/@action, '?allowcookies=yes')
-
-test_url: http://fok.nl/687116 \ No newline at end of file
diff --git a/data/GrabberConfig/foley.com.txt b/data/GrabberConfig/foley.com.txt
deleted file mode 100644
index 56ff407b..00000000
--- a/data/GrabberConfig/foley.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-http_header(user-agent): Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.92 Safari/535.2
-
-test_url: http://www.foley.com/rss/rss.aspx?id=2
-test_url: https://www.foley.com/solicitor-general-sides-with-sandoz-on-interpretation-of-biosimilar-statute-12-13-2016/
-test_contains: The Solicitor General of the United States
diff --git a/data/GrabberConfig/folklore.org.txt b/data/GrabberConfig/folklore.org.txt
deleted file mode 100644
index ed23a0b6..00000000
--- a/data/GrabberConfig/folklore.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: /html/body/table[3]/tbody/tr/td[1]/table[2]/tbody/tr[1]/td[2]
-date: /html/body/table[3]/tbody/tr/td[1]/table[2]/tbody/tr[2]/td[2]
-body: //div[@class='main']
-test_url: http://www.folklore.org/StoryView.py?story=Calculator_Construction_Set.txt \ No newline at end of file
diff --git a/data/GrabberConfig/food.com.txt b/data/GrabberConfig/food.com.txt
deleted file mode 100644
index a70da766..00000000
--- a/data/GrabberConfig/food.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@id='print-area']
-title: //h1[contains(@class, 'section-title')]
-single_page_link: //a[@id='prntrec']
-strip_image_src: food-logo-small
-strip_id_or_class: timer
-strip_id_or_class: photo-sm
-strip_id_or_class: page-header
-
-prune: no
-
-test_url: http://www.food.com/recipe/couldnt-be-easier-bbq-pork-tenderloin-crock-pot-317152 \ No newline at end of file
diff --git a/data/GrabberConfig/fool.com.txt b/data/GrabberConfig/fool.com.txt
deleted file mode 100644
index 89cb8b9a..00000000
--- a/data/GrabberConfig/fool.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@class='entry-content']
-date: //meta[@name="date"]/@content
-author: //meta[@name="author"]/@content
-
-strip_id_or_class: ecapShell
-strip_id_or_class: noindent
-strip_id_or_class: targetedPromotion
-
-prune: no
-
-test_url: http://www.fool.com/investing/general/2012/01/27/dfc-global-beats-up-on-analysts-yet-again.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/forbes.com.txt b/data/GrabberConfig/forbes.com.txt
deleted file mode 100644
index 36d4757a..00000000
--- a/data/GrabberConfig/forbes.com.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-title: //hgroup//h1
-title: //span[@class='mainarttitle']
-
-body: //div[@id='leftRail']//div[contains(@class, 'body')]
-
-author: //meta[@name="author"]/@content
-author: //span[@class='mainartauthor']
-
-date: substring-before(//hgroup//h6, '@')
-date: //span[@class='mainartdate']
-
-prune: no
-strip: //aside
-strip_id_or_class: sticky_sharing
-strip_id_or_class: pagination
-strip_id_or_class: controlsbox
-strip_id_or_class: storyboxes
-strip_id_or_class: sponsoredlinks
-strip_id_or_class: nextpage
-strip_id_or_class: contextuallinks
-strip_id_or_class: article_actions
-strip_id_or_class: engagement_block
-
-single_page_link: //a[contains(@href, '/print/')]
-
-http_header(user-agent): Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
-
-test_url: http://www.forbes.com/forbes/2011/0509/technology-frog-design-jan-chipchase-ethnographer-birth-cool_print.html
-test_url: http://www.forbes.com/sites/bruceupbin/2012/09/11/the-iphone-5-winners-and-losers/
diff --git a/data/GrabberConfig/foreignaffairs.com.txt b/data/GrabberConfig/foreignaffairs.com.txt
deleted file mode 100644
index cf8b742f..00000000
--- a/data/GrabberConfig/foreignaffairs.com.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-# TIDY
-#tidy: no
-# PRUNE
-#prune: no
-
-# SINGLE PAGE
-single_page_link: //div[@class='showlinks']/a
-
-# TITLE
-title: //h1[@class="title"]
-
-# AUTHOR
-author: //div[contains(@class,"field-field-article-display-authors")]/div/div/a/text()
-
-# DATE
-date: //div[contains(@class,"field-field-article-issue")]/div/div/a/text() | //span[@class="date-display-single"]
-
-# BODY
-body: //div[contains(@class,"content-resize")]
-
-# Remove clutter
-strip: //div[@class="article-sidebar"]
-strip: //div[@class="showlinks"]
-strip: //div[contains(@class,"premium-box")]
-strip: //div[contains(@class,"premium-box")]
-strip: //table[contains(@border,"2")]
-
-# Fix picture captions
-wrap_in(small): //p/img/following-sibling::em
-wrap_in(small): //p[img]/text()
-
-# Fix sub-headlines
-wrap_in(h3): //div[contains(@class,"field-field-article-subtitle")]/div/div/text()
-test_url: http://www.foreignaffairs.com/articles/138810/pierre-n-leval/the-long-arm-of-international-law \ No newline at end of file
diff --git a/data/GrabberConfig/foreignpolicy.com.txt b/data/GrabberConfig/foreignpolicy.com.txt
deleted file mode 100644
index 749ad37d..00000000
--- a/data/GrabberConfig/foreignpolicy.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //h1[contains(concat(' ',normalize-space(@class),' '),' feature-hed ')]
-author: substring-after(//p[contains(concat(' ',normalize-space(@class),' '),' feature-byline ')], 'BY ')
-date: //div[contains(concat(' ',normalize-space(@class),' '),' timestamp ')]//time
-body: //div[contains(concat(' ',normalize-space(@class),' '),' feature-body ')]
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-inner ')]
-
-strip_id_or_class: share-links
-
-prune: no
-
-test_url: http://www.foreignpolicy.com/articles/2014/07/22/the_end_game_in_gaza_netanyahu_hamas
-test_url: http://www.foreignpolicy.com/articles/2011/08/01/a_murderers_manifesto_and_me
-test_url: http://www.foreignpolicy.com/articles/2012/02/29/five_years_in_damascus
-test_url: http://foreignpolicy.com/2016/04/26/fear-this-man-cyber-warfare-hacking-team-david-vincenzetti/
diff --git a/data/GrabberConfig/forsvaret.no.txt b/data/GrabberConfig/forsvaret.no.txt
deleted file mode 100644
index ec9e5807..00000000
--- a/data/GrabberConfig/forsvaret.no.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //div[@class="articleHeader"]/h1
-author: //p[@class="byline"]
-date: //p[contains(@class,"publishedDate")]/span
-# remove the right menu
-strip: //div[contains(@class,"aside")]
-# remove some SharePoint webpart label junk
-strip: //div[@id="ctl00_PlaceHolderMain_ArticleLeadField_label"]
-strip: //div[@id="ctl00_PlaceHolderMain_PublishingPageContentField_label"]
-test_url: https://forsvaret.no/aktuelt/historisk-medaljeutdeling
-test_contains: Samarbeidet med Marinen har vært en sann glede
diff --git a/data/GrabberConfig/foxnews.com.txt b/data/GrabberConfig/foxnews.com.txt
deleted file mode 100644
index e19c77db..00000000
--- a/data/GrabberConfig/foxnews.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-prune: no
-
-author: //meta[@name="dc.publisher"]/@content
-date: //meta[@name="dc.date"]/@content
-strip: //p[contains(@class, 'contributor vcard')]
-replace_string(<ul><li><div class="photo">): <div class="photo">
-strip: //p[a[contains(., 'Click here to read more on this story ')]]
-
-test_url: http://www.foxnews.com/entertainment/2011/05/04/dwayne-johnson-guys-grow-pair-driving-hybrid/ \ No newline at end of file
diff --git a/data/GrabberConfig/france24.com.txt b/data/GrabberConfig/france24.com.txt
deleted file mode 100644
index 6356e048..00000000
--- a/data/GrabberConfig/france24.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.france24.com%2Fen%2F20150427-togo-gnassingbe-poised-extend-power-election%2F
-
-body: //article[contains(concat(' ',normalize-space(@class),' '),' article-long ')]//div[contains(concat(' ',normalize-space(@class),' '),' bd ')]
-title: //h1[@class="title"]
-author://p[@class="author"]
-date://p[@class="modification"]
-
-find_string: <p class="modification">Latest update :
-replace_string: <p class="modification">
-
-
-test_url: http://www.france24.com/en/20150427-togo-gnassingbe-poised-extend-power-election/ \ No newline at end of file
diff --git a/data/GrabberConfig/frankdenneman.nl.txt b/data/GrabberConfig/frankdenneman.nl.txt
deleted file mode 100644
index c6011002..00000000
--- a/data/GrabberConfig/frankdenneman.nl.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "content")]
-test_url: http://frankdenneman.nl/
diff --git a/data/GrabberConfig/freelancer.com.txt b/data/GrabberConfig/freelancer.com.txt
deleted file mode 100644
index 78d37729..00000000
--- a/data/GrabberConfig/freelancer.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id="projectDetailsContent"]//td
-
-test_url: http://www.freelancer.com/projects/PHP-Website-Design/debug-Forum-website-code.html \ No newline at end of file
diff --git a/data/GrabberConfig/freytag-film.com.txt b/data/GrabberConfig/freytag-film.com.txt
deleted file mode 100644
index c83f8303..00000000
--- a/data/GrabberConfig/freytag-film.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class = 'instapaperbody']
-convert_double_br_tags: no
-date: //div[@class='instadate']
-title: //h2[@class = 'instatitle']
-test_url: http://freytag-film.com/blog/artikel/shooting_a_feature_film_in_10_days \ No newline at end of file
diff --git a/data/GrabberConfig/fria.nu.txt b/data/GrabberConfig/fria.nu.txt
deleted file mode 100644
index 9d8eff97..00000000
--- a/data/GrabberConfig/fria.nu.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.fria.nu/artikel/112079
-test_url: http://www.fria.nu/taxonomy/term/1928/all/feed \ No newline at end of file
diff --git a/data/GrabberConfig/friatidningen.se.txt b/data/GrabberConfig/friatidningen.se.txt
deleted file mode 100644
index 1e4abc5a..00000000
--- a/data/GrabberConfig/friatidningen.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.friatidningen.se/artikel/112074 \ No newline at end of file
diff --git a/data/GrabberConfig/frontburner.dmagazine.com.txt b/data/GrabberConfig/frontburner.dmagazine.com.txt
deleted file mode 100644
index 73f44324..00000000
--- a/data/GrabberConfig/frontburner.dmagazine.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Ffrontburner.dmagazine.com%2F2015%2F04%2F23%2Fthe-barrett-brown-review-of-arts-and-letters-and-jail-a-sign-of-things-to-come%2F
-
-body: //div[@id='article-body']
-test_url: http://frontburner.dmagazine.com/2015/04/23/the-barrett-brown-review-of-arts-and-letters-and-jail-a-sign-of-things-to-come/
diff --git a/data/GrabberConfig/ft.com.txt b/data/GrabberConfig/ft.com.txt
deleted file mode 100644
index 407c2453..00000000
--- a/data/GrabberConfig/ft.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='storyContent']
-
-strip_id_or_class: shareArt
-strip_id_or_class: promobox
-
-test_url: http://www.ft.com/cms/s/2/19fe32bc-d6db-11e5-8887-98e7feb46f27.html
diff --git a/data/GrabberConfig/ftchinese.com.txt b/data/GrabberConfig/ftchinese.com.txt
deleted file mode 100644
index 5c94d9b0..00000000
--- a/data/GrabberConfig/ftchinese.com.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# Modified to define the single_page_link
-# This filter is tested on:
-# http://www.ftchinese.com/story/001047373
-# http://www.ftchinese.com/story/001047631
-# http://www.ftchinese.com/story/001047622/?print=y
-# http://www.ftchinese.com/story/001049052
-# http://www.ftchinese.com/story/001049088
-
-title:substring-before(//title, '-')
-author: //div[@class='byline']/a
-date: //a[@class='storytime']
-#Set date in print view
-#date: //div[@class='byline']/a/following-sibling::a
-body: //div[@id="bodytext"]
-strip://div[@class='pagination']
-single_page_link://div[@class='pagination']/a[.='全文']
-#next_page_link: //div[@class='pagination']//a[.='下一页']
-test_url: http://www.ftchinese.com/story/001049088 \ No newline at end of file
diff --git a/data/GrabberConfig/futura-sciences.com.txt b/data/GrabberConfig/futura-sciences.com.txt
deleted file mode 100644
index 7ba1d943..00000000
--- a/data/GrabberConfig/futura-sciences.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http://www.futura-sciences.com/magazines/espace/infos/actu/d/astronomie-surprenants-panaches-ceres-62066/
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' grid ') and (contains(concat(' ',normalize-space(@class),' '),' col-gauche '))]
-
-strip_id_or_class: ficheprevnext
-strip_id_or_class: bar
-strip_id_or_class: border-full
-strip_id_or_class: httplogbar-wrapper
-strip_id_or_class: diaporamafullscreenariane
-strip_id_or_class: ariane
-strip_id_or_class: diaporamafullscreen
-
-test_url: http://www.futura-sciences.com/magazines/espace/infos/actu/d/astronomie-surprenants-panaches-ceres-62066/
-test_url: http://www.futura-sciences.com/magazines/high-tech/infos/actu/d/technologie-bientot-plus-besoin-machine-laver-62157/#xtor=RSS-8
diff --git a/data/GrabberConfig/futurezone.at.txt b/data/GrabberConfig/futurezone.at.txt
deleted file mode 100644
index d975544f..00000000
--- a/data/GrabberConfig/futurezone.at.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-single_page_link: //a[@class='print']
-
-parser: html5php
-tidy: no
-prune: no
-
-body: //article
-strip: //section[@class='heroheader']
-strip: //section[contains(concat(' ', normalize-space(@class), ' '), ' tags ')]
-strip: //div[@class='gallery-title-container']
-strip: //figcaption/span
-strip: //div[contains(concat(' ', normalize-space(@class), ' '), ' controls ')]
-strip: //i[@class='icon zoom']
-
-author: normalize-space(substring-after(//article/p[1], 'Autor: '))
-strip: //article/p[1]
-
-date: substring-after(//div[contains(concat(' ', normalize-space(@class), ' '), ' editedby ')]/span, 'Erstellt am ')
-strip: //div[contains(concat(' ', normalize-space(@class), ' '), ' editedby ')]
-
-test_url: http://futurezone.at/produkte/sony-xperia-x-im-test-mittelklasse-zum-premium-preis/209.178.838
diff --git a/data/GrabberConfig/galwayindependent.com.txt b/data/GrabberConfig/galwayindependent.com.txt
deleted file mode 100644
index d45b7acf..00000000
--- a/data/GrabberConfig/galwayindependent.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //div[@class='leftCol']/h1
-
-prune: no
diff --git a/data/GrabberConfig/gamasutra.com.txt b/data/GrabberConfig/gamasutra.com.txt
deleted file mode 100644
index 75d46179..00000000
--- a/data/GrabberConfig/gamasutra.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# default view title
-title: //span[@class='newsTitle']
-# print view title
-title: //h3[@class='title']
-
-# default view author
-author: //span[@class='newsAuth']/a
-author: substring-after(//span[@class='newsAuth'], 'by ')
-
-# default view date
-date: //td[@class='newsDate']
-
-# default view body
-body: //td[@class='featureText']
-body: //td[@class='newsText']
-
-strip: //h3[@class='title']
-
-single_page_link: concat(//meta[@property="og:url"]/@content, '?print=1')
-if_page_contains: //a[contains(@class, "articleNav")]
-
-test_url: http://www.gamasutra.com/view/feature/132559/staying_power_rethinking_feedback_.php
diff --git a/data/GrabberConfig/gameblog.fr.txt b/data/GrabberConfig/gameblog.fr.txt
deleted file mode 100644
index 227d39ac..00000000
--- a/data/GrabberConfig/gameblog.fr.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[@id='GBTVPlayer'] | //div[contains(@class, 'col490')]
-author: //span[contains(concat(' ',normalize-space(@class),' '),' author ')]
-date: //header[@id='gbArticleHeader']//div//time/@datetime
-
-prune: no
-
-strip_id_or_class: noprint
-strip: //div[@id='gbNewsTextContent']/following-sibling::*
-
-test_url: http://www.gameblog.fr/news/26330-les-sims-3-showtime-s-annonce-en-video
-test_url: http://www.gameblog.fr/news/26306-mise-a-jour-du-dashboard-de-la-xbox-360-disponible
diff --git a/data/GrabberConfig/gamechurch.com.txt b/data/GrabberConfig/gamechurch.com.txt
deleted file mode 100644
index c9eea5f8..00000000
--- a/data/GrabberConfig/gamechurch.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1[@class='title']
-
-date: substring-before(substring-after(//div[@class='comment-bubble']/.., 'Posted'), 'by')
-
-body: //div[@class='the-content']
-
-strip: //div[@class='article-image responsive']
-
-strip_id_or_class: 'pullquote'
-test_url: http://gamechurch.com/virtual-gun-control-the-best-amendment/ \ No newline at end of file
diff --git a/data/GrabberConfig/gamekult.com.txt b/data/GrabberConfig/gamekult.com.txt
deleted file mode 100644
index 96e5192e..00000000
--- a/data/GrabberConfig/gamekult.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //article[@id='story-page']/h1
-date: //p[@class="byline"]/time/@datetime
-body: //div[@class="summary"]
-
-strip: //select[@id="news_changing_node"]
-
-test_url: http://www.gamekult.com/actu/toukiden-2-demo-vita-japonaise-le-24-mai-A163469.html
diff --git a/data/GrabberConfig/gamer.no.txt b/data/GrabberConfig/gamer.no.txt
deleted file mode 100644
index e76a59d9..00000000
--- a/data/GrabberConfig/gamer.no.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@class='pageContent description']
-date: //div[@class='authorsAndDateTime']/span[@title]
-single_page_link: //div[@class='pages']/a[last()-1]
-
-# fix images and captions
-wrap_in(figure): //div[contains(concat(' ', @class, ' '), ' image')]
-wrap_in(figcaption): //div[contains(concat(' ', @class, ' '), ' image')]/div[@class='text']/text()
-
-# get rid of videos
-strip_id_or_class: 'video full'
-test_url: http://www.gamer.no/artikler/142455/slik-blei-ambisiose-dragons-dogma-skapt/ \ No newline at end of file
diff --git a/data/GrabberConfig/gamereactor.no.txt b/data/GrabberConfig/gamereactor.no.txt
deleted file mode 100644
index 6f7c1b9b..00000000
--- a/data/GrabberConfig/gamereactor.no.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@id='content']/div/h1
-
-author: //a[@itemprop='reviewer']
-
-date: //time[@itemprop='dtreviewed']/@datetime
-
-body: //div[@id='breadtext']
-
-# fix for NOT magically removing anchors with text identical to title
-dissolve: //a[text()=//div[@id='content']/div/h1/text()]
-test_url: http://www.gamereactor.no/previews/177481/The+Evil+Within/?sid=38b5bd30f56f1b7214de4ff5bed4b76f \ No newline at end of file
diff --git a/data/GrabberConfig/ganglia.info.txt b/data/GrabberConfig/ganglia.info.txt
deleted file mode 100644
index 2ae27b48..00000000
--- a/data/GrabberConfig/ganglia.info.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@id = "mid")]
-test_url: http://ganglia.info/
diff --git a/data/GrabberConfig/gasteroprod.com.txt b/data/GrabberConfig/gasteroprod.com.txt
deleted file mode 100644
index 8eda0c36..00000000
--- a/data/GrabberConfig/gasteroprod.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# These should work, but don't. They were given by Firefox XPather extension
-title: //article//header//a//h1
-body: //article//section
-test_url: http://gasteroprod.com/blog/faut-il-continuer-a-supporter-internet-explorer-6.html \ No newline at end of file
diff --git a/data/GrabberConfig/gatopardo.com.txt b/data/GrabberConfig/gatopardo.com.txt
deleted file mode 100644
index 2ab144f5..00000000
--- a/data/GrabberConfig/gatopardo.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@class='panel']
-strip: //div[@style='float:right']
-strip: //span[@class='titulosHomePublicidad']
-strip: //div[@id='TitTop5Der']
-strip: //img[@src='/ImagesGatoPardo/LogoGatopardo.png']
-
-prune: yes
-test_url: http://www.gatopardo.com/ReportajesGP.php?R=95 \ No newline at end of file
diff --git a/data/GrabberConfig/gawker.com.txt b/data/GrabberConfig/gawker.com.txt
deleted file mode 100644
index 27e4b4bb..00000000
--- a/data/GrabberConfig/gawker.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@class="post-body"]
-
-# Remove 'content is restricted'
-strip: //div[@id='agegate_IDHERE']
-
-http_header(user-agent): PHP/5.3
-
-test_url: http://gawker.com/#!5782070/russian-bomb-squad-successfully-defuses-sex-toy \ No newline at end of file
diff --git a/data/GrabberConfig/geeksofdoom.com.txt b/data/GrabberConfig/geeksofdoom.com.txt
deleted file mode 100644
index 89eb402f..00000000
--- a/data/GrabberConfig/geeksofdoom.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-author: substring-after(//span[@class='storyauthor'],'Posted by')
-date: //span[@class='storydate']
-test_url: http://www.geeksofdoom.com/2012/03/14/robert-rodriguez-says-machete-kills-and-sin-city-2-will-film-this-year/ \ No newline at end of file
diff --git a/data/GrabberConfig/geenstijl.nl.txt b/data/GrabberConfig/geenstijl.nl.txt
deleted file mode 100644
index a664b4d9..00000000
--- a/data/GrabberConfig/geenstijl.nl.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id = 'article']
-strip: //div[@id = 'klasbox']
-test_url: http://www.geenstijl.nl/mt/archieven/2010/10/vrouw_lange_frans_wou_baas_b_d.html \ No newline at end of file
diff --git a/data/GrabberConfig/getnews.jp.txt b/data/GrabberConfig/getnews.jp.txt
deleted file mode 100644
index e28d4b8b..00000000
--- a/data/GrabberConfig/getnews.jp.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='post']
-strip: //ul[@id='bookmark_single']
-test_url: http://getnews.jp/archives/117312 \ No newline at end of file
diff --git a/data/GrabberConfig/getpocket.com.txt b/data/GrabberConfig/getpocket.com.txt
deleted file mode 100644
index e6ca16ae..00000000
--- a/data/GrabberConfig/getpocket.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-http_header(user-agent): PHP/5.3 \ No newline at end of file
diff --git a/data/GrabberConfig/giantbomb.com.txt b/data/GrabberConfig/giantbomb.com.txt
deleted file mode 100644
index 61de51b2..00000000
--- a/data/GrabberConfig/giantbomb.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# 2011-11-19 - carlo@... - Initial setup.
-
-strip_id_or_class: user-review-detail
-strip: //h1
-
-body: //div[@class="wiki-content"] | //div[@class="section-bd"] | //div[@class="news-story"]
-
-author: //span[@class="reviewer"] | //p[@class="byline"]/a/text()
-date: //span[@class="dtreviewed"]
-
-test_url: http://www.giantbomb.com/the-elder-scrolls-v-skyrim/61-33394/ \ No newline at end of file
diff --git a/data/GrabberConfig/giga.de.txt b/data/GrabberConfig/giga.de.txt
deleted file mode 100644
index e2689eae..00000000
--- a/data/GrabberConfig/giga.de.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-tidy:no
-title://h2[@class="title"]
-# author:"Ben Miller"
-date://div[@id="stats"]/span
-strip_id_or_class:stats
-strip_id_or_class:breadcrumbs
-strip_id_or_class:gn-why-content
-strip_id_or_class:single-social
-strip_id_or_class:sidebar-ads
-strip_id_or_class:sidebar-top
-strip_id_or_class:footer
-strip_id_or_class:post_meta
-# strip_id_or_class:
-# strip_id_or_class:
-# strip_id_or_class:
-# strip_id_or_class:
-# strip_id_or_class:
-# strip_id_or_class:
-
-test_url: http://www.giga.de/benm/2011/10/17/probleme-mit-ios-5-wenn-die-daten-weg-sind/#more-58033 \ No newline at end of file
diff --git a/data/GrabberConfig/gigaom.com.txt b/data/GrabberConfig/gigaom.com.txt
deleted file mode 100644
index cc8fdfa0..00000000
--- a/data/GrabberConfig/gigaom.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-date: //meta[@name='dcterms.created']/@content
-title: //meta[@property='og:title']/@content
-author: //section[@class="post-meta"]//a[@rel="author"]
-
-body: //div[starts-with(@id, 'post-content-')]
-
-strip_id_or_class: sharedaddy
-
-prune: no
-
-test_url: http://gigaom.com/2011/10/24/groupon-google-lawsuit/
-test_url: http://gigaom.com/2012/12/26/snapchat-rises-why-pokes-decline-shows-facebooks-inability-to-invent/ \ No newline at end of file
diff --git a/data/GrabberConfig/gihyo.jp.txt b/data/GrabberConfig/gihyo.jp.txt
deleted file mode 100644
index d3534b29..00000000
--- a/data/GrabberConfig/gihyo.jp.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //p[@id='skip']//a[contains(@href, 'skip')]
-
-test_url: http://gihyo.jp/dev/serial/01/machine-learning/0010 \ No newline at end of file
diff --git a/data/GrabberConfig/gist.github.com.txt b/data/GrabberConfig/gist.github.com.txt
deleted file mode 100644
index 90207862..00000000
--- a/data/GrabberConfig/gist.github.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class="highlight"]/pre
-
-prune: no
-tidy: no
-
-test_url: https://gist.github.com/1258908 \ No newline at end of file
diff --git a/data/GrabberConfig/gizmodo.co.uk.txt b/data/GrabberConfig/gizmodo.co.uk.txt
deleted file mode 100644
index 2eb82a6d..00000000
--- a/data/GrabberConfig/gizmodo.co.uk.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id="leadimage" or @class="postcontent"]
-author: //div[@class="contentauthor"]
-date: //div[@class="timestamp"]
-
-prune: no
-
-test_url: http://www.gizmodo.co.uk/2013/02/bbc-forcing-poor-old-sir-david-attenborough-to-go-on-twitter/ \ No newline at end of file
diff --git a/data/GrabberConfig/gizmodo.com.au.txt b/data/GrabberConfig/gizmodo.com.au.txt
deleted file mode 100644
index d8e8c6c2..00000000
--- a/data/GrabberConfig/gizmodo.com.au.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id='content_post' or @class="post-body" or contains(@class, 'illustration top')]
-author: (//cite//span[@class="plus-icon"])[1]
-date: //span[@class="date"]
-date: //time
-
-prune: no
-
-test_url: http://www.gizmodo.com.au/2016/01/these-hateful-eightfigures-are-delightfully-retro/
-test_contains: NECA have fully unveiled
diff --git a/data/GrabberConfig/gizmodo.com.txt b/data/GrabberConfig/gizmodo.com.txt
deleted file mode 100644
index 535041cd..00000000
--- a/data/GrabberConfig/gizmodo.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-#body: //div[@class="post-body" or contains(@class, 'illustration top')]
-body: //div[contains(@class, 'image-annotation-box') or contains(@class, 'post-content')]
-#author: (//cite//span[@class="plus-icon"])[1]
-author: //span[contains(@class, 'display-name')]
-date: //span[@class="date"]
-
-prune: no
-
-http_header(user-agent): PHP/5.3
-
-test_url: http://gizmodo.com/5880147/kuhn-rikon-improves-their-spice-grinder-with-grade-school-science
-test_url: http://gizmodo.com/what-van-goghs-paintings-would-look-like-if-they-came-874035680
-test_url: http://gizmodo.com/vip.xml \ No newline at end of file
diff --git a/data/GrabberConfig/gizmodo.uol.com.br.txt b/data/GrabberConfig/gizmodo.uol.com.br.txt
deleted file mode 100644
index d963d684..00000000
--- a/data/GrabberConfig/gizmodo.uol.com.br.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1
-
-body: //div[@id='destaques']//div[contains(@class, 'img')] | //div[@id='maincontent']//p
-
-test_url: http://gizmodo.uol.com.br/nvidia-gtx-titan-z/
-test_url: http://gizmodo.uol.com.br/perfil-mark-zuckerberg-hackeado/
diff --git a/data/GrabberConfig/gizmologia.com.txt b/data/GrabberConfig/gizmologia.com.txt
deleted file mode 100644
index d2c7c9f9..00000000
--- a/data/GrabberConfig/gizmologia.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://gizmologia.com/2011/09/amd-trinity-el-sucesor-de-llano-en-una-demostracion-muy-interesante \ No newline at end of file
diff --git a/data/GrabberConfig/gizmovil.com.txt b/data/GrabberConfig/gizmovil.com.txt
deleted file mode 100644
index 5fc204b8..00000000
--- a/data/GrabberConfig/gizmovil.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://gizmovil.com/2011/09/hipertextual-labs-receptor-bluetooth-nokia-bh-214 \ No newline at end of file
diff --git a/data/GrabberConfig/global.txt b/data/GrabberConfig/global.txt
deleted file mode 100644
index 71fbc934..00000000
--- a/data/GrabberConfig/global.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# Look for Open Graph data - http://ogp.me
-title: //meta[@property="og:title"]/@content
-date: //meta[@property="article:published_time"]/@content
-# article:author is someties URL, e.g. on guardian.co.uk
-
-# Remove Google Publisher Tags: https://support.google.com/dfp_sb/answer/1649768?hl=en
-#strip_id_or_class: div-gpt-ad
-
-# Strip doubleclick image ads
-strip_image_src: doubleclick.net
-
-# If you get chunks of Javascript code appearing in the extracted output, try uncommenting the lines below.
-# This tries to convert script tags to hidden div elements (which Full-Text RSS removes).
-# If you notice issues with this approach, please let us know.
-#find_string: <script
-#replace_string: <div style="display:none"
-#find_string: </script>
-#replace_string: </div> \ No newline at end of file
diff --git a/data/GrabberConfig/globalgrind.com.txt b/data/GrabberConfig/globalgrind.com.txt
deleted file mode 100644
index e2f4e233..00000000
--- a/data/GrabberConfig/globalgrind.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[contains(@class, 'content-body')]
-
-prune: no
-
-test_url: http://globalgrind.com/2015/04/26/listen-jeremih-featuring-chance-the-rapper-the-social-experiment-planes-remix-new-music/
-test_contains: The Chicago rapper has made a name for himself \ No newline at end of file
diff --git a/data/GrabberConfig/globalissues.org.txt b/data/GrabberConfig/globalissues.org.txt
deleted file mode 100644
index ee50f68f..00000000
--- a/data/GrabberConfig/globalissues.org.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body: //div[@id='content']
-
-strip: //p[@class='top']
-strip: //h2[.='Where next?']
-strip_id_or_class: where-next
-strip_id_or_class: social-bookmarks
-strip_id_or_class: link-to-here
-strip_id_or_class: options-heading
-strip_id_or_class: page-options-content
-strip_id_or_class: page-info-bottom
-
-tidy: no
-prune: no
-
-test_url: http://www.globalissues.org/article/39/a-primer-on-neoliberalism \ No newline at end of file
diff --git a/data/GrabberConfig/globalresearch.ca.txt b/data/GrabberConfig/globalresearch.ca.txt
deleted file mode 100644
index dbf784f1..00000000
--- a/data/GrabberConfig/globalresearch.ca.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-http_header(user-agent): Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
-
-test_url: http://www.globalresearch.ca/fallujah-is-being-slaughtered-silently/5495520
-test_contains: what is unknown about this city
diff --git a/data/GrabberConfig/globoesporte.globo.com.txt b/data/GrabberConfig/globoesporte.globo.com.txt
deleted file mode 100644
index fd8e70ff..00000000
--- a/data/GrabberConfig/globoesporte.globo.com.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-title: //h1[@class="entry-title"]
-
-body: //div[@class='materia-titulo']/h2 | //*[@id="materia-letra"]
-
-date: //abbr[@class="published"]
-date: //abbr[@class="updated"]
-
-author: //*[@class="author"]/strong
-
-strip: //div[contains(@class,'foto')]/strong
-strip: //div[contains(@class,'frase-materia')]/div[@class='autor']
-strip: //div[contains(@class,'saibamais')]
-strip: //*[contains(text(),'Clique aqui e veja mais')]/ancestor::p
-strip: //ul[@class="toolbar"]
-
-# quotes
-wrap_in(blockquote): //div[@id='materia-letra']//div[contains(@class,'frase-materia')]/div[@class='frase']
-
-prune: no
-
-replace_string([Clique aqui e veja mais vídeos do Fluminense]): []
-
-test_url: http://globoesporte.globo.com/atletismo/noticia/2013/08/michael-johnson-diz-que-bolt-e-melhor-da-historia-nao-ha-duvidas.html
-test_url: http://globoesporte.globo.com/futebol/futebol-internacional/futebol-espanhol/noticia/2013/08/barca-atropela-levante-e-neymar-passa-em-branco-em-estreia-oficial.html
-test_url: http://globoesporte.globo.com/futebol/times/fluminense/noticia/2013/08/poupado-no-sabado-felipe-se-diz-pronto-para-ser-titular-contra-o-goias.html
diff --git a/data/GrabberConfig/gloswielkopolski.pl.txt b/data/GrabberConfig/gloswielkopolski.pl.txt
deleted file mode 100644
index 16487955..00000000
--- a/data/GrabberConfig/gloswielkopolski.pl.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //article[@id='material']/header/h1
-author: //article[@id='material']/header/div[2]/p
-date: //article[@id='material']/header/p/time[1]
-body: //section[@id='tresc']
-next_page_link: .//section[@id='tresc']/div[@class='stronicowanie']/a[@rel='next']
-strip://div[@class='podobneSonda']
-
-test_url: http://www.gloswielkopolski.pl/artykul/803547,abc-telemarketingu-praca-ktora-zwalnia-z-myslenia,id,t.html \ No newline at end of file
diff --git a/data/GrabberConfig/goal.com.txt b/data/GrabberConfig/goal.com.txt
deleted file mode 100644
index e25e9a00..00000000
--- a/data/GrabberConfig/goal.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //div[@id='article_headline']//h1
-date: //div[contains(@class, 'articleDate')]//h4
-body: //div[@id='article_headline']/h2 | //div[@id='large_article_image' or @id='article_content']
-
-strip_id_or_class: relatedLinksBox
-strip_id_or_class: betting-widget
-strip_image_src: install_flash.gif
-
-strip: //table[contains(@style, 'float: right; width: 285px;')]
-strip: //div[@class='caption']
-
-tidy: no
-prune: no
-
-test_url: http://www.goal.com/en-gb/news/3284/euro-2012/2012/05/31/3139032/video-profile-back-to-his-very-best-for-bayern-frances-flair-and-
-test_url: http://www.goal.com/en-gb/news/3284/euro-2012/2012/05/31/3139869/lampard-injury-a-bitter-blow-for-england-and-sorry-way-to# \ No newline at end of file
diff --git a/data/GrabberConfig/gocomics.com.txt b/data/GrabberConfig/gocomics.com.txt
deleted file mode 100644
index 212c02d5..00000000
--- a/data/GrabberConfig/gocomics.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //a[@class="photo"]/img[@class="strip"]
-author: //meta[@name="author"]/@content
-date: //meta[@property="gocomics:publish_date"]/@content
-
-test_url: http://www.gocomics.com/garfield/2015/06/13
diff --git a/data/GrabberConfig/gokulkrishh.github.io.txt b/data/GrabberConfig/gokulkrishh.github.io.txt
deleted file mode 100644
index b395fa9e..00000000
--- a/data/GrabberConfig/gokulkrishh.github.io.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fgokulkrishh.github.io%2FJavascript-Guidelines%2F
-
-body: //section[contains(concat(' ',normalize-space(@class),' '),' main-content ')]
-test_url: https://gokulkrishh.github.io/Javascript-Guidelines/
diff --git a/data/GrabberConfig/golem.de.txt b/data/GrabberConfig/golem.de.txt
deleted file mode 100644
index 6954168a..00000000
--- a/data/GrabberConfig/golem.de.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-# Author: zinnober
-# Rewrite of original template which fetched the printer-version without pictures
-
-tidy: no
-prune: no
-
-# Set full title
-title: //h1
-
-date: //time
-author: //a[@rel='author']
-
-# Content is here
-body: //article
-
-# Fetch full multipage articles
-next_page_link: //a[@id='atoc_next']
-
-# Remove tracking and ads
-strip_id_or_class: iqadtile4
-
-# General Cleanup
-strip_id_or_class: list-jtoc
-strip_id_or_class: table-jtoc
-strip_id_or_class: implied
-strip_id_or_class: social-
-strip_id_or_class: comments
-strip_id_or_class: footer
-
-# Tidy up galleries (could still be improved, though)
-strip: //img[@src='']
-strip: //li[not(*)]
-strip: //div[contains(@style,'margin')]
-strip: //figure[contains(@id,'gvideo')]
-
-
-# Try yourself
-test_url: http://www.golem.de/news/intel-core-i7-5960x-im-test-die-pc-revolution-beginnt-mit-octacore-und-ddr4-1408-108893.html
-test_url: http://www.golem.de/news/test-infamous-first-light-neonbunter-actionspass-1408-108914.html
diff --git a/data/GrabberConfig/good.is.txt b/data/GrabberConfig/good.is.txt
deleted file mode 100644
index 94159fbf..00000000
--- a/data/GrabberConfig/good.is.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[@class="title"]/div/h1
-body: //div[@class="body"]
-date: //li[@class="date-time"]
-test_url: http://www.good.is/post/why-amazon-is-the-next-top-tech-company/ \ No newline at end of file
diff --git a/data/GrabberConfig/goodfil.ms.txt b/data/GrabberConfig/goodfil.ms.txt
deleted file mode 100644
index f8bbbc6a..00000000
--- a/data/GrabberConfig/goodfil.ms.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip_id_or_class: gutter
-test_url: http://goodfil.ms/blog/posts/2012/08/13/angularjs-and-the-goodfilms-mobile-site-part-1/ \ No newline at end of file
diff --git a/data/GrabberConfig/gossip-tv.gr.txt b/data/GrabberConfig/gossip-tv.gr.txt
deleted file mode 100644
index e2d2d0b2..00000000
--- a/data/GrabberConfig/gossip-tv.gr.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-date: //meta[@name='og:article:published_time']/@value
-
-body: //div[@class='itemIntroText' or @class='itemImageBlock' or @class='itemFullText']
-
-strip_id_or_class: itemImageGallery
-
-# remove extras at end of post content
-find_string: <div style="margin:5px 0 10px;">
-replace_string: </div></body></html><!--
-
-prune: no
-
-test_url: http://www.gossip-tv.gr/story/158902/aggelike-daliane-semera-duskoleuontai-oloi-sta-epaggelmatika-tous
-test_url: http://www.gossip-tv.gr/lifestyle/Taste/story/230266/lahtaristo-kai-ygieino-tost-sokolatas \ No newline at end of file
diff --git a/data/GrabberConfig/goteborgsfria.se.txt b/data/GrabberConfig/goteborgsfria.se.txt
deleted file mode 100644
index c90aed0b..00000000
--- a/data/GrabberConfig/goteborgsfria.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.goteborgsfria.se/artikel/112079 \ No newline at end of file
diff --git a/data/GrabberConfig/gothamist.com.txt b/data/GrabberConfig/gothamist.com.txt
deleted file mode 100644
index 36453878..00000000
--- a/data/GrabberConfig/gothamist.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class='entry-header']
-author: //span[@class='vcard author']
-date: //abbr[@class='published']
-#move_into(//div[@class='entry-body']): //img[@id='photo_1']
-body: //div[@class='entry-body']
-strip: //div[@class='galleryEaseThumbs']
-test_url: http://gothamist.com/2012/03/15/fancy_cocktail_lounge_the_randolph.php \ No newline at end of file
diff --git a/data/GrabberConfig/gp.se.txt b/data/GrabberConfig/gp.se.txt
deleted file mode 100644
index 158ae4ed..00000000
--- a/data/GrabberConfig/gp.se.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@id='articleContainer']
-author: //div[@id='articleContent']//div[contains(@class, 'byline')]//span[contains(@class, 'name fn')]
-strip_id_or_class: toolbar
-strip_id_or_class: ADad
-strip_id_or_class: articleSerieWrapper
-strip_id_or_class: articleFloatContainer
-strip: //div[contains(@class, 'byline')]//img
-prune: no
-
-test_url: http://www.gp.se/nyheter/bohuslan/1.2045564-styckade-mannen-hade-mordat-hustrun
-test_url: http://www.gp.se/1.16560 \ No newline at end of file
diff --git a/data/GrabberConfig/gq.com.txt b/data/GrabberConfig/gq.com.txt
deleted file mode 100644
index 8ad8a14e..00000000
--- a/data/GrabberConfig/gq.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-next_page_link: //div[@class='pagination']//span[@class='paginationNext']/a
-strip_id_or_class: utility
-strip_id_or_class: keywords
-strip_id_or_class: pagination
-strip_id_or_class: position2_content
-body: //div[@class='article']
-title: //h1[@class='content-headline']
-author: //span[@class='contributor']//a
-test_url: http://www.gq.com/news-politics/newsmakers/201203/terry-thompson-ohio-zoo-massacre-chris-heath-gq-february-2012 \ No newline at end of file
diff --git a/data/GrabberConfig/grantland.com.txt b/data/GrabberConfig/grantland.com.txt
deleted file mode 100644
index b8d419f4..00000000
--- a/data/GrabberConfig/grantland.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# this is fragile with footnotes -- leave it for now
-
-#tidy: no
-#prune: no
-#move_into(//article): //aside[@id='footnotes']
-author: //cite/a
-date: //time
-
-strip: //a[text()='Grantland']
-strip_id_or_class: ad-wrapper
-strip_id_or_class: fb-connect-link
-strip_id_or_class: fb-status
-strip: //li[@class='print']
-strip: //cite
-strip: //a[contains(text(), '[+]')]
-strip: //a[@id='jump-nav-link']
-strip: //h1[text()='Share This']
-strip: //h1[text()='Top Stories']
-strip: //div[@id="update-text-size"]
-test_url: http://www.grantland.com/story/_/id/8421241/examining-new-albums-rock-veterans-no-doubt-green-day \ No newline at end of file
diff --git a/data/GrabberConfig/greatergreaterwashington.org.txt b/data/GrabberConfig/greatergreaterwashington.org.txt
deleted file mode 100644
index 31a41075..00000000
--- a/data/GrabberConfig/greatergreaterwashington.org.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@class="blogpost"]/h2
-author: //div[@class="blogpost"]/p[@class="byline"]/a
-date: //div[@class="blogpost"]/p[@class="byline"]/span[@class="time_posted"]
-body: //div[@class="blogpost"]
-strip_id_or_class: flag
-strip_id_or_class: byline
-strip_id_or_class: post_footer
-strip_id_or_class: related_posts
-strip_id_or_class: post_author_bios
-strip: //h2
-test_url: http://greatergreaterwashington.org/post/12457/ask-ggw-what-will-happen-to-the-1000-series-railcars/ \ No newline at end of file
diff --git a/data/GrabberConfig/groups.drupal.org.txt b/data/GrabberConfig/groups.drupal.org.txt
deleted file mode 100644
index 0fe30ef5..00000000
--- a/data/GrabberConfig/groups.drupal.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title://h1
-author://span[@class="submitted"]/a
-date:substring-after(//span[@class="submitted"],'on ')
-body://div[@class="content"]
-test_url: http://groups.drupal.org/node/36816 \ No newline at end of file
diff --git a/data/GrabberConfig/gsmarena.com.txt b/data/GrabberConfig/gsmarena.com.txt
deleted file mode 100644
index 34883965..00000000
--- a/data/GrabberConfig/gsmarena.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-next_page_link: //a[@class='pages-next']
-
-test_url: http://www.gsmarena.com/samsung_galaxy_j2-review-1348.php \ No newline at end of file
diff --git a/data/GrabberConfig/gulfnews.com.txt b/data/GrabberConfig/gulfnews.com.txt
deleted file mode 100644
index 97b620de..00000000
--- a/data/GrabberConfig/gulfnews.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='wrapper_half']//ul[@class='details'] | //div[@class='wrapper_half']//p[@class='synopsis'] | //div[@class='wrapper_half']//div[@class='image'] | //div[@class='wrapper_half']//div[@class='article']
-strip: //div[@class='wrapper_half']//ul[@class='details']/li[position()>1]
-prune: no
-tidy: no
-test_url: http://gulfnews.com/news/gulf/uae/government/abu-dhabi-centre-offers-useful-information-1.811084 \ No newline at end of file
diff --git a/data/GrabberConfig/guokr.com.txt b/data/GrabberConfig/guokr.com.txt
deleted file mode 100644
index f8327bea..00000000
--- a/data/GrabberConfig/guokr.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# To administrator:
-# Please change the hostname to "www.guokr.com/article/*"
-# Not working for "www.guokr.com/post/" pages configured by carlosliu913@gmail.com
-
-# This filter is tested on:
-# http://www.guokr.com/article/274325/
-# http://www.guokr.com/article/275013/
-
-title://h1
-author://div[contains(@class, 'content-th-info')]/a
-date://div[contains(@class, 'content-th-info')]/span
-body://div[contains(@class, 'Content')]
-
-strip://div[contains(@class, 'bottom-i')]
-strip://div[contains(@class, 'copyright')]
-strip://div[contains(@class, 'fr')]
-strip://div[contains(@class, 'content-th-info')]
-strip://h1[contains(@id, 'articleTitle')]
-strip://div[contains(@class, 'side')]
-strip://div[contains(@class, 'top-wp')]
-test_url: http://www.guokr.com/article/275013/
-test_url: http://www.guokr.com/article/338387/ \ No newline at end of file
diff --git a/data/GrabberConfig/haberler.com.txt b/data/GrabberConfig/haberler.com.txt
deleted file mode 100644
index 1bb2bc7d..00000000
--- a/data/GrabberConfig/haberler.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@id="habermetni"]/h1[@id="haber_baslik"]
-body: //div[@id="habermetni"]/p
-strip: //img[@class='newsDetailLeft']
-strip_image_src: /haber-resimleri/
-test_url: http://www.haberler.com/emniyete-atacakti-elinde-patladi-3198733-haberi/ \ No newline at end of file
diff --git a/data/GrabberConfig/habrahabr.ru.txt b/data/GrabberConfig/habrahabr.ru.txt
deleted file mode 100755
index 67538359..00000000
--- a/data/GrabberConfig/habrahabr.ru.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-title: //span[@class="post_title"]
-author: //div[@class="author"]
-date: //div[@class="published
-
-body: //div[@class='content html_format'] | //div[@id='comments']
-
-strip: //a[@class="link_to_comment"]
-strip: //div[@class="show_tree"]
-strip: //a[@class="to_parent"]
-
-
-replace_string(class="reply_comments"): style="padding-left: 20px"
-replace_string(class="voting "): style="float: right"
-replace_string(src="//habrastorage.org/getpro/habr/avatars/): style="width:24px; height:24px;" class="123" src="//habrastorage.org/getpro/habr/avatars/
-replace_string(class="info "): style="padding-top:5px;font-size:0.85em;line-height:24px;"
-
-
-prune: no
-tidy: no
-
-test_url: http://habrahabr.ru/post/229883/ \ No newline at end of file
diff --git a/data/GrabberConfig/hackersrepublic.org.txt b/data/GrabberConfig/hackersrepublic.org.txt
deleted file mode 100644
index da01c213..00000000
--- a/data/GrabberConfig/hackersrepublic.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.hackersrepublic.org%2Fculture-du-hacking%2Fune-histoire-de-privileges
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' field-name-body ')]//div[contains(concat(' ',normalize-space(@class),' '),' field-items ')]//div[contains(concat(' ',normalize-space(@class),' '),' field-item ') and (contains(concat(' ',normalize-space(@class),' '),' even '))]
-test_url: http://www.hackersrepublic.org/culture-du-hacking/une-histoire-de-privileges
diff --git a/data/GrabberConfig/hackmake.org.txt b/data/GrabberConfig/hackmake.org.txt
deleted file mode 100644
index 98140117..00000000
--- a/data/GrabberConfig/hackmake.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-date: //article//time[@pubdate]
-body: //article/div[@id="post-wide"]
-title: //article/header/h2
-strip: /div[@id="comment"]
-strip: //footer
-author: substring-after(//footer/p[@class='byline'] , 'By')
-test_url: http://hackmake.org/2012/12/21/mindfulness-of-concentration \ No newline at end of file
diff --git a/data/GrabberConfig/halo.bungie.org.txt b/data/GrabberConfig/halo.bungie.org.txt
deleted file mode 100644
index 1802efea..00000000
--- a/data/GrabberConfig/halo.bungie.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title:substring-before(id("maincontent")/table, 'Posted')
-body:id("maincontent")/p
-# eventually convert linebreaks better
-
-test_url: http://halo.bungie.org/fanfic/?story=Delahunt0312112316071.html \ No newline at end of file
diff --git a/data/GrabberConfig/hammers.theoffside.com.txt b/data/GrabberConfig/hammers.theoffside.com.txt
deleted file mode 100644
index 33f7e726..00000000
--- a/data/GrabberConfig/hammers.theoffside.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Remove right column
-strip: //*[(@class = 'right_col')]
-
-# Remove comments etc.
-strip: //*[(@class = 'category')]
-strip: /html/body/div[1][@class='absolute_content_high']/div[1][@class='wrapper']/div[1][@class='main_col']/div[@class='main_content']/h3
-test_url: http://hammers.theoffside.com/carling-cup/a-funny-thing-happened-on-the-way-to-4-nil.html \ No newline at end of file
diff --git a/data/GrabberConfig/handelsblatt.com.txt b/data/GrabberConfig/handelsblatt.com.txt
deleted file mode 100644
index 7d067aa6..00000000
--- a/data/GrabberConfig/handelsblatt.com.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-#Single Page
-single_page_link: //li[contains(@class,"hcf-print")]/a
-
-# Title hcf-headline
-title: //span[@class='hcf-headline']
-
-# Authors
-author: //div[@class="hcf-author"]/a/text()
-author: substring-after(//div[@class='hcf-author'], 'von ')
-
-# Date
-date: //div[@class='hcf-article-date']
-
-# Body
-body: //div[@class='article']
-
-# General removements
-strip: //div[contains(@class,"hcf-smartbox")]
-strip: //div[contains(@class,"hcf-stopper")]
-strip: //div[contains(@class,"hcf-img-controls")]
-strip: //span[@class='hcf-location-mark']
-strip: //span[@class='hcf-copyright']
-strip: //div[@class='hcf-copyright']
-strip: //div[@class='hcf-origin']
-
-
-
-
-# Fix picture captions
-wrap_in(small): //div[@class="hcf-caption"]
-test_url: http://www.handelsblatt.com/meinung/gastbeitraege/gastkommentar-zum-emissionshandel-kurskorrekturen-fuehren-zum-kentern/8044326.html \ No newline at end of file
diff --git a/data/GrabberConfig/hanselman.com.txt b/data/GrabberConfig/hanselman.com.txt
deleted file mode 100644
index 1dca632f..00000000
--- a/data/GrabberConfig/hanselman.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-date: //span[@class="item-date"]
-body: //div[@class="item-content"]
-strip_comments: no
-test_url: http://www.hanselman.com/blog/BrainBytesBackBunsTheProgrammersPriorities.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/hardware-infos.com.txt b/data/GrabberConfig/hardware-infos.com.txt
deleted file mode 100644
index 1d63b6cd..00000000
--- a/data/GrabberConfig/hardware-infos.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-tidy: no
-prune: no
-
-title: //div[@class='content post']/h1
-body: //div[@class='post']
-
-next_page_link: //a[preceding::div[@class='pages']]
-
-test_url: http://www.hardware-infos.com/news/5646/amd-bei-next-gen-api-mit-besserer-gpu-auslastung.html
-test_url: http://www.hardware-infos.com/tests/grafikkarten/sapphire-r9-280x-vapor-x-tri-x-oc.html
diff --git a/data/GrabberConfig/hardware.fr.txt b/data/GrabberConfig/hardware.fr.txt
deleted file mode 100644
index e4f1f6bc..00000000
--- a/data/GrabberConfig/hardware.fr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1
-author: //a[@class='a_aut']
-body: //div[@class='content_dossier']
-strip: //div[@id='pagination']
-next_page_link: //div[@class='sommaire_colonne']//span[@class='page_actuelle']/following::span[@class='autres_page']//a/@href
-test_url: http://www.hardware.fr/articles/850-1/pci-express-3-0-impact-performances.html \ No newline at end of file
diff --git a/data/GrabberConfig/hardware.no.txt b/data/GrabberConfig/hardware.no.txt
deleted file mode 100644
index cbbcf84e..00000000
--- a/data/GrabberConfig/hardware.no.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //h1[@class='headline']
-title: //h2[@itemprop='alternativeHeadline']
-title: //h1[@itemprop='headline']
-author: //span[@itemprop='name']
-date: //time[@itemprop='datePublished']
-body: //div[@itemprop='reviewBody']
-
-wrap_in(blockquote): //div[@class='factBox']
-
-next_page_link: //a[@rel='next']
-
-strip_id_or_class: 'product-box'
-strip: //a[@rel='next']
-strip: //a[text()='Del på Facebook']
-strip: //a[text()='Del på Twitter']
-test_url: http://www.hardware.no/artikler/asus-vg248qe/132792 \ No newline at end of file
diff --git a/data/GrabberConfig/hardwareluxx.de.txt b/data/GrabberConfig/hardwareluxx.de.txt
deleted file mode 100644
index 227bea77..00000000
--- a/data/GrabberConfig/hardwareluxx.de.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-tidy: no
-prune: no
-
-title: (//span[@itemprop='title'])[last()]
-author: //span[@itemprop='author']//span[@itemprop='name']
-body: //article
-date: //time
-
-strip: //header
-strip: //div[@id='bcr']
-strip: //footer
-strip: //section
-strip: //figure[@class='dynbench']
-strip: //div[@class='pagenavbar']
-
-next_page_link: //span[@class='next']/a
-
-test_url: http://www.hardwareluxx.de/index.php/news/allgemein/netzpolitik/35169-creator-space-youtube-eroeffnet-neues-studio-in-berlin.html
-test_url: http://www.hardwareluxx.de/index.php/artikel/hardware/komplettsysteme/35020-caseking-king-mod-titan-oc-gaming-pc-im-test.html
diff --git a/data/GrabberConfig/hbr.org.txt b/data/GrabberConfig/hbr.org.txt
deleted file mode 100644
index c2f292e1..00000000
--- a/data/GrabberConfig/hbr.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@id='article-title']
-author: //div[@id='articleAuthors']
-body: //div[@id='article']
-strip: //div[@class='module wide']
-#single_page_link: //a[@class='social-print']
-test_url: http://hbr.org/2012/04/the-real-leadership-lessons-of-steve-jobs/ar/
-test_url: http://hbr.org/2013/03/big-bang-disruption/ar/ \ No newline at end of file
diff --git a/data/GrabberConfig/headrush.typepad.com.txt b/data/GrabberConfig/headrush.typepad.com.txt
deleted file mode 100644
index a3146771..00000000
--- a/data/GrabberConfig/headrush.typepad.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title://div[@class='content']/h3[1]
-body://div[@class='content']
-
-# Article nav
-strip://div[@class='content']/p[1]
-
-# Comments and trackbacks
-strip://h2/following-sibling::p
-strip://h2
-
-# Posted on
-strip://b/p
-strip://div[@class='content']/p[@class='posted']
-test_url: http://headrush.typepad.com/creating_passionate_users/2005/05/the_case_for_ea.html \ No newline at end of file
diff --git a/data/GrabberConfig/healthland.time.com.txt b/data/GrabberConfig/healthland.time.com.txt
deleted file mode 100644
index 0542097b..00000000
--- a/data/GrabberConfig/healthland.time.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-date: //span[@class = 'date']
-body: //div[@class = 'entry-content']
-strip://div[@class='more-ways']
-strip://div[@id = 'stayConnected']
-strip://p[child::a[@rel = 'bookmark']]
-strip://p[starts-with(string(.),'(MORE:')]
-strip://p[starts-with(string(.),'(PHOTOS:')]
-move_into(//p[../@class = 'entry-content'][position() = last()])://div[@id = 'featbox']
-
-test_url: http://healthland.time.com/2011/07/24/amy-winehouse-and-the-pain-of-addiction/?preview=true&preview_id=39210&preview_nonce=0777d4e408 \ No newline at end of file
diff --git a/data/GrabberConfig/heise-online.mobi.txt b/data/GrabberConfig/heise-online.mobi.txt
deleted file mode 100644
index daff6143..00000000
--- a/data/GrabberConfig/heise-online.mobi.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='content']/div
-date: //p[@class='author_date']/span[@class='date']
-test_url: http://heise-online.mobi/newsticker/meldung/Amazons-Appstore-in-der-Kritik-Ein-Desaster-fuer-Kunden-und-Entwickler-1273936.html \ No newline at end of file
diff --git a/data/GrabberConfig/heise.de.txt b/data/GrabberConfig/heise.de.txt
deleted file mode 100755
index 5bca8ac2..00000000
--- a/data/GrabberConfig/heise.de.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-# Author: zinnober
-# Template should work well with either desktop or mobile version (m.heise.de)
-
-prune: no
-
-date: //p[@class='news_datum']
-author: //span[@class='author']
-
-body: //article | //div[@class='meldung_wrapper']
-
-strip: //nav
-
-# General cleanup
-strip: //time
-strip: //header
-strip: //h4[@class='author']
-strip: //div[@class='gallery compact']/h3
-strip: //div[@class='gallery compact']/figcaption
-strip: //p[@class='news_datum']
-strip: //p[@class='artikel_datum']
-strip: //p[@class='news_navi']
-strip: //p[@class='printversion']
-strip: //a[contains(@href, 'mailto')]
-strip: //div[@class='gallery compact']/h2
-strip: //p[@class='themen_foren']
-strip: //style
-strip: //span[@class='source']
-#strip: //div[@class='gallery compact']/figcaption
-strip_id_or_class: comments
-strip_id_or_class: ISI_IGNORE
-#strip_id_or_class: clear
-
-strip_id_or_class: linkurl_grossbild
-strip_id_or_class: image-num
-strip_id_or_class: heisebox_right
-strip_id_or_class: dossier
-strip_id_or_class: latest_posting_snippet
-
-# Strip Ads
-strip_id_or_class: ad_
-
-# Some optimizations
-replace_string(<h5>): <h2>
-replace_string(</h5>): </h2>
-replace_string(<span class="bild_rechts" style="width:): <p "
-replace_string(<div class="heisebox">): <blockquote>
-
-single_page_link: //a[contains(@href, '?view=print')]
-single_page_link: //a[contains(@title, 'Druck')]
-
-next_page_link: //a[@class='next']
-next_page_link: //a[@title='vor']
-next_page_link: //a[@rel='next']
-
-test_url: http://www.heise.de/open/artikel/Die-Neuerungen-von-Linux-3-15-2196231.html
-test_url: http://m.heise.de/open/artikel/Die-Neuerungen-von-Linux-3-15-2196231.html
-test_url: http://www.heise.de/newsticker/meldung/Ueberwachungstechnik-Die-globale-Handy-Standortueberwachung-2301494.html
-test_url: http://www.heise.de/newsticker/meldung/Bodenradar-fuer-selbstfahrende-Autos-horcht-unter-die-Strasse-3273941.html
-test_url: http://www.heise.de/tp/artikel/49/49473/1.html
-test_url: http://www.heise.de/ct/artikel/Die-Neuerungen-von-Linux-3-15-2196231.html
-test_url: http://heise.de/-3527918
diff --git a/data/GrabberConfig/help.fivefilters.org.txt b/data/GrabberConfig/help.fivefilters.org.txt
deleted file mode 100644
index 70a7d156..00000000
--- a/data/GrabberConfig/help.fivefilters.org.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: //div[@class="title"]/h3
-date: substring-after(//div[@class="meta"], ": ")
diff --git a/data/GrabberConfig/hemmings.com.txt b/data/GrabberConfig/hemmings.com.txt
deleted file mode 100644
index a02b4a62..00000000
--- a/data/GrabberConfig/hemmings.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h2
-body: //div[@id='leftdetail']
-single_page_link: //a[contains(@href, 'printable=1')]
-strip: //a[contains(., 'Full Version')]
-
-prune: no
-
-test_url: http://www.hemmings.com/classifieds/dealer/ferrari/330gtc/1601235.html
-test_url: http://www.hemmings.com/rss/keyword.xml?adtype=carsforsale&make=ferrari \ No newline at end of file
diff --git a/data/GrabberConfig/heraldsun.com.au.txt b/data/GrabberConfig/heraldsun.com.au.txt
deleted file mode 100644
index b0ce56c5..00000000
--- a/data/GrabberConfig/heraldsun.com.au.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-#body: //div[@class='story-body']
-body: //div[contains(@class, 'story-body')]
-title: //div[@class='story-headline']//h1
-author: //cite[contains(@class, 'author')]
-date: //span[@class='datestamp']
-
-strip_id_or_class: story-info
-strip: //div[contains(@class, 'story-promo')]
-strip: //div[contains(@class, 'story-related')]
-
-prune: no
-tidy: no
diff --git a/data/GrabberConfig/hespress.com.txt b/data/GrabberConfig/hespress.com.txt
deleted file mode 100644
index 4ed0b8b5..00000000
--- a/data/GrabberConfig/hespress.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id='article_holder']//div[@class='image'] | //div[@id='article_body']
-
-prune: no
-tidy: no
-
-test_url: http://hespress.com/videos/73684.html
-test_url: http://hespress.com/permalink/73678.html \ No newline at end of file
diff --git a/data/GrabberConfig/hiamag.com.txt b/data/GrabberConfig/hiamag.com.txt
deleted file mode 100644
index 3c7ba5ac..00000000
--- a/data/GrabberConfig/hiamag.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: (//div[contains(@class, 'gallery-slides')]//img)[1] | //div[contains(@class, 'node_body_inner')]
-
-test_url: http://www.hiamag.com/rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/highscalability.com.txt b/data/GrabberConfig/highscalability.com.txt
deleted file mode 100644
index 5a808fa4..00000000
--- a/data/GrabberConfig/highscalability.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='journal-entry-text']
-
-test_url: http://highscalability.com/blog/2011/3/14/6-lessons-from-dropbox-one-million-files-saved-every-15-minu.html \ No newline at end of file
diff --git a/data/GrabberConfig/hiiraan.com.txt b/data/GrabberConfig/hiiraan.com.txt
deleted file mode 100644
index cf1f7942..00000000
--- a/data/GrabberConfig/hiiraan.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.hiiraan.com%2Fnews%2F2014%2FDec%2Fwararka_maanta20-89428.htm
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' single ')]//div[contains(concat(' ',normalize-space(@class),' '),' description ')]
-
-prune: no
-
-test_url: http://www.hiiraan.com/news/2014/Dec/wararka_maanta20-89428.htm
-test_url: http://rss.hiiraan.com/wararka_maanta_rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/hiperpop.com.txt b/data/GrabberConfig/hiperpop.com.txt
deleted file mode 100644
index b5eb062e..00000000
--- a/data/GrabberConfig/hiperpop.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://hiperpop.com/2011/09/marc-anthony-celebra-su-cumpleanos-con-jennifer-lopez \ No newline at end of file
diff --git a/data/GrabberConfig/hipertextual.com.txt b/data/GrabberConfig/hipertextual.com.txt
deleted file mode 100755
index 2cb7ca51..00000000
--- a/data/GrabberConfig/hipertextual.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://hipertextual.com/2011/09/banda-ancha-en-america-latina-insignificante
diff --git a/data/GrabberConfig/hiphopleeft.nl.txt b/data/GrabberConfig/hiphopleeft.nl.txt
deleted file mode 100644
index d869a866..00000000
--- a/data/GrabberConfig/hiphopleeft.nl.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class = 'pd']
-strip: //div[@id = 'overzicht-albumrecensies']
-strip: //div[@id = 'jc']
-test_url: http://hiphopleeft.nl/index.php?option=com_content&view=article&id=2767:mark-ronson-record-collection&catid=66:m&Itemid=142 \ No newline at end of file
diff --git a/data/GrabberConfig/histoire.presse.fr.txt b/data/GrabberConfig/histoire.presse.fr.txt
deleted file mode 100644
index bbd1cbd6..00000000
--- a/data/GrabberConfig/histoire.presse.fr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.histoire.presse.fr%2Factualite%2Finfos%2Fgeorges-clemenceau-chambre-30-juillet-1885-22-11-2010-15540
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' nd-no-sidebars ')]//div[contains(concat(' ',normalize-space(@class),' '),' nd-region-middle ')]
-test_url: http://www.histoire.presse.fr/actualite/infos/georges-clemenceau-chambre-30-juillet-1885-22-11-2010-15540
diff --git a/data/GrabberConfig/historytoday.com.txt b/data/GrabberConfig/historytoday.com.txt
deleted file mode 100644
index 78fb60a6..00000000
--- a/data/GrabberConfig/historytoday.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body://div[@id = 'content']
-author://span[@class = 'authors']
-author://span[@class = 'ht-vtag'][1]
-date:substring-before(//meta[@name = 'dc.date']/@content,'T')
-strip://div[contains(@class, 'region-ubercontent')]
-strip://h1
-strip://div[@id = 'ht-author']
-strip://ul[@class = 'links inline']
-strip://div[@id = 'ht-tools']
-test_url: http://www.historytoday.com/carol-dyhouse/skin-deep-fall-fur \ No newline at end of file
diff --git a/data/GrabberConfig/hmercer.com.txt b/data/GrabberConfig/hmercer.com.txt
deleted file mode 100644
index 2da13a8e..00000000
--- a/data/GrabberConfig/hmercer.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //*[@class='ptitle']
-date: //span[@class='date']
-body: //div[@class='body']
-prune: no
-test_url: http://hmercer.com/2011/07/why-i-switched-to-jekyll/ \ No newline at end of file
diff --git a/data/GrabberConfig/hollywoodlife.com.txt b/data/GrabberConfig/hollywoodlife.com.txt
deleted file mode 100644
index 975ffa26..00000000
--- a/data/GrabberConfig/hollywoodlife.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-date: //meta[@name='sailthru.date']/@content
-body: //article[contains(@class, 'entry-content')]
-
-strip_image_src: subscribe.png
-
-strip_id_or_class: wpcom-iframe-form
-strip_id_or_class: gallery-thumbs
-strip_id_or_class: twitter
-strip_id_or_class: fb-link
-strip_id_or_class: pinterest
-
-strip: //div[@class='data']
-strip: //iframe[contains(@name, 'wpcom')]
-
-find_string: <a href="http://www.youtube.com/subscription_center?add_user_id=2rJLq19N0dGrxfib80M
-replace_string: </p></div></body></html><!--
-
-find_string: <h3>More
-replace_string: </div></body></html><!--
-
-test_url: http://hollywoodlife.com/2013/10/04/miriam-carey-dead-capitol-hill-car-chase-shooting-postpartum-depression/
-test_url: http://hollywoodlife.com/feed/ \ No newline at end of file
diff --git a/data/GrabberConfig/hometheaterreview.com.txt b/data/GrabberConfig/hometheaterreview.com.txt
deleted file mode 100644
index 8ed26ff5..00000000
--- a/data/GrabberConfig/hometheaterreview.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id='entry-body']
-strip_id_or_class: paginate
-strip: //p[contains(., 'Additional Resources')]
-test_url: http://hometheaterreview.com/dreamvision-starlight-3-three-chip-d-ila-projector-reviewed/ \ No newline at end of file
diff --git a/data/GrabberConfig/hosted.ap.org.txt b/data/GrabberConfig/hosted.ap.org.txt
deleted file mode 100644
index a660f23b..00000000
--- a/data/GrabberConfig/hosted.ap.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //table[@class='ap-smallphoto-table'] | //div[@class='body']//*[@class='entry-content']
-tidy: no
-strip_image_src: analytics.apnewsregistry
-
-test_url: http://hosted.ap.org/dynamic/stories/E/EU_TURKEY_KURDS?SITE=KSNEW&SECTION=HOME&TEMPLATE=DEFAULT&CTIME=2014-10-14-10-50-25
diff --git a/data/GrabberConfig/hosted2.ap.org.txt b/data/GrabberConfig/hosted2.ap.org.txt
deleted file mode 100644
index 0ca94d34..00000000
--- a/data/GrabberConfig/hosted2.ap.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@id, 'photosDiv-')] | //div[contains(@id, 'storyBodyDiv')]//p[contains(@class, 'entry-content')]
-tidy: no
-prune: no
-
-test_url: http://hosted2.ap.org/KSSUC/*/Article_2015-09-24-FBN-Skyboard-Craze/id-589cf87959414856b5cd5e1ad869c68e
-
-test_url: http://hosted2.ap.org/APDefault/*/Article_2015-09-28-US--United%20States-Russia/id-79126486540a4f2ca0b48133013a8b03
diff --git a/data/GrabberConfig/houstonchronicle.com.txt b/data/GrabberConfig/houstonchronicle.com.txt
deleted file mode 100644
index 3d65c985..00000000
--- a/data/GrabberConfig/houstonchronicle.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='subsection_wrap']
-next_page_link: //ul[@class='pagination']//a[contains(text(), '»')]
-
-test_url: http://www.houstonchronicle.com/nasa/adrift/1/
diff --git a/data/GrabberConfig/howtogeek.com.txt b/data/GrabberConfig/howtogeek.com.txt
deleted file mode 100644
index baa2ed4a..00000000
--- a/data/GrabberConfig/howtogeek.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[contains(@class, 'thecontent')]
-
-strip_image_src: loading.gif
-find_string:src="http://cdn.howtogeek.com/public/images/blank.gif"
-replace_string:-
-find_string:data-href=
-replace_string:src=
-
-strip_id_or_class: relatedside
-
-test_url: http://www.howtogeek.com/school/microsoft-excel-formulas-and-functions/lesson1/ \ No newline at end of file
diff --git a/data/GrabberConfig/hs.fi.txt b/data/GrabberConfig/hs.fi.txt
deleted file mode 100644
index 360dc725..00000000
--- a/data/GrabberConfig/hs.fi.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-prune: yes
-tidy: yes
-test_url: http://www.hs.fi/kotimaa/Teollisuushallin%20palo%20levitt%C3%A4%C3%A4%20vaarallista%20savua%20Tuusulassa/a1305571582405 \ No newline at end of file
diff --git a/data/GrabberConfig/ht.ly.txt b/data/GrabberConfig/ht.ly.txt
deleted file mode 100644
index 46535088..00000000
--- a/data/GrabberConfig/ht.ly.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //iframe[@id='hootFrame']/@src
-
-test_url: http://ht.ly/bOiZV \ No newline at end of file
diff --git a/data/GrabberConfig/huffingtonpost.co.uk.txt b/data/GrabberConfig/huffingtonpost.co.uk.txt
deleted file mode 100644
index 1c818c2a..00000000
--- a/data/GrabberConfig/huffingtonpost.co.uk.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry__body ')]
-strip_id_or_class: tag-cloud
-strip_id_or_class: below-entry
-
-test_url: http://www.huffingtonpost.co.uk/entry/edward-snowdens-david-cameron-tweet-tells-public-to-rise-up-if-they-want-him-to-resign_uk_57074b52e4b00c769e2d91a9?s481714i
diff --git a/data/GrabberConfig/huffingtonpost.com.txt b/data/GrabberConfig/huffingtonpost.com.txt
deleted file mode 100644
index d4618c14..00000000
--- a/data/GrabberConfig/huffingtonpost.com.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[img[starts-with(@id, 'img_caption')]] | //div[@class="big_photo"] | //div[contains(@class, 'entry_body_text')]
-date: //meta[@name="publish_date"]/@content
-author: //a[@rel="author"]
-author: //meta[@name="author"]/@content
-
-prune: no
-tidy: no
-
-strip: //footer
-strip_id_or_class: ps-slideshow
-strip_id_or_class: fs-slideshow
-strip: //p[contains(., 'Related on HuffPost:')]
-strip_id_or_class: contribute-story
-strip_id_or_class: promo_holder
-
-# end early
-replace_string(<div class="sbm-main): </body></html><div class="not-interested
-
-test_url: http://www.huffingtonpost.com/mitch-moxley/tracking-beijings-boom-th_b_1209828.html
-test_url: http://www.huffingtonpost.com/2012/09/11/president-obama-iphone-throwdown_n_1873826.html
diff --git a/data/GrabberConfig/humantransit.org.txt b/data/GrabberConfig/humantransit.org.txt
deleted file mode 100644
index 92d3c678..00000000
--- a/data/GrabberConfig/humantransit.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h3[@class="entry-header"]
-date: //h2[@class="date-header"]
-body: //div[contains(@class, 'entry')]
-
-test_url: http://www.humantransit.org/2012/06/can-network-primers-reduce-grief-about-network-design.html \ No newline at end of file
diff --git a/data/GrabberConfig/hurriyet.com.tr.txt b/data/GrabberConfig/hurriyet.com.tr.txt
deleted file mode 100644
index 68fd220a..00000000
--- a/data/GrabberConfig/hurriyet.com.tr.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class='HaberDetayTitleHold Title']/h1
-body: //div[@id='YazarDetayText']
-author: //div[@class='HaberDetayTitleHold Title']/h1
-prune: no
-
-test_url: http://www.hurriyet.com.tr/ekonomi/19490260.asp
-test_url: http://www.hurriyet.com.tr/yazarlar/22078439.asp \ No newline at end of file
diff --git a/data/GrabberConfig/hvg.hu.txt b/data/GrabberConfig/hvg.hu.txt
deleted file mode 100644
index 05e7b5f1..00000000
--- a/data/GrabberConfig/hvg.hu.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='pg-content']//h1
-body: //div[@id='articleBody0']
-replace_string(</table>): </table><br /><br />
-
-single_page_link: //div[@class="up-header"]/a
-
-prune: no
-
-test_url: http://hvg.hu/w/20111125_sparta \ No newline at end of file
diff --git a/data/GrabberConfig/hypebeast.com.txt b/data/GrabberConfig/hypebeast.com.txt
deleted file mode 100644
index 23e47545..00000000
--- a/data/GrabberConfig/hypebeast.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@id='content']//div[contains(@class, 'wp-image-') or contains(@class, 'entry')][1]
-author: //span[@class='author']/a
-
-strip_id_or_class: disqus
-strip_id_or_class: paginator
-strip_id_or_class: photo-number
-
-prune: no
-
-test_url: http://hypebeast.com/2012/11/stussy-2012-fall-winter-november-releases/ \ No newline at end of file
diff --git a/data/GrabberConfig/iansommerville.com.txt b/data/GrabberConfig/iansommerville.com.txt
deleted file mode 100644
index c2f0d7ce..00000000
--- a/data/GrabberConfig/iansommerville.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-http_header(user-agent): PHP/5.3
diff --git a/data/GrabberConfig/icannabis.tumblr.com.txt b/data/GrabberConfig/icannabis.tumblr.com.txt
deleted file mode 100644
index 3bda753c..00000000
--- a/data/GrabberConfig/icannabis.tumblr.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-tidy:no
-prune:no
-
-body://div[contains(@id,'content')]
-
-strip_id_or_class:meta
-strip_id_or_class:notes
-strip_id_or_class:pagination
-test_url: http://icannabis.tumblr.com/post/28660592471/reviewmswireless3000 \ No newline at end of file
diff --git a/data/GrabberConfig/ici.radio-canada.ca.txt b/data/GrabberConfig/ici.radio-canada.ca.txt
deleted file mode 100644
index 37d3c07a..00000000
--- a/data/GrabberConfig/ici.radio-canada.ca.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //article
-body: //p[@class='TexteChronique']
-body: //div[@class='src-content']
-
-strip: //header
-strip: //figure
-strip: //div[@class='framed']
-strip: //form
-
-test_url: http://ici.radio-canada.ca/nouvelle/1003322/lexique-mots-neige-hiver-guy-bertrand
-test_url: http://ici.radio-canada.ca/tele/deuxieme-chance/inscription/
-test_url: http://ici.radio-canada.ca/emissions/aujourd_hui_l_histoire/2016-2017/chronique.asp?idChronique=423294
diff --git a/data/GrabberConfig/idealog.co.nz.txt b/data/GrabberConfig/idealog.co.nz.txt
deleted file mode 100644
index ca88f606..00000000
--- a/data/GrabberConfig/idealog.co.nz.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //div[@class='content']
-
-strip: //p[@class='dateline']
-strip: //hr
-strip_id_or_class: share
-strip_id_or_class: comments
-strip_id_or_class: tags
-
-title: substring-before(//title,' ::')
-author: substring-before(//p[@class='dateline'],',')
-date: //p[@class='dateline']/time
-test_url: http://www.idealog.co.nz/blog/2012/12/geeks-plane-help-kiwis-take-san-francisco \ No newline at end of file
diff --git a/data/GrabberConfig/idlewords.com.txt b/data/GrabberConfig/idlewords.com.txt
deleted file mode 100644
index f3b33796..00000000
--- a/data/GrabberConfig/idlewords.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //a[@class='post_title']
-body: //div[@class='entrybox']
-strip_id_or_class: post_title
-date: //div[@class='entrybox']/b[1]
-strip: //div[@class='entrybox']/b[1]
-author: string('Maciej Cegłowski')
-test_url: http://idlewords.com/2011/08/why_arabic_is_terrific.htm \ No newline at end of file
diff --git a/data/GrabberConfig/igen.fr.txt b/data/GrabberConfig/igen.fr.txt
deleted file mode 100644
index b6a2cffc..00000000
--- a/data/GrabberConfig/igen.fr.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //section[@class='titre']/h1
-author: //span[@class="infos"]/span[@class="username"]
-date: //span[@class="infos"]/time/@datetime
-body: //section[@class="corps"]
-
-strip: //select[@id="news_changing_node"]
-
-test_url: http://www.igen.fr/itunes/2016/05/itunes-mis-jour-la-semaine-prochaine-contre-le-bug-de-suppression-de-musique-95803
diff --git a/data/GrabberConfig/igeneration.fr.txt b/data/GrabberConfig/igeneration.fr.txt
deleted file mode 100644
index 45dd5f25..00000000
--- a/data/GrabberConfig/igeneration.fr.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: substring-after(substring-after(//span[@class='submitted'],'- '),'- ')
-date: substring-before(//span[@class='submitted'], concat('- ',substring-after(substring-after(//span[@class='submitted'],'- '),'- ')))
-body: //div[@class='content clear-block zoneApple']
-
-test_url: http://www.igeneration.fr/iphone/l-iphone-et-l-ipad-chouchous-des-tpe-et-pme-55112 \ No newline at end of file
diff --git a/data/GrabberConfig/ignoredbydinosaurs.com.txt b/data/GrabberConfig/ignoredbydinosaurs.com.txt
deleted file mode 100644
index 60635301..00000000
--- a/data/GrabberConfig/ignoredbydinosaurs.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title://h1[@class='page-title']
-body://*[@id='content']//div[contains(@class,'node-content')]
-
-author://*[@id='content']//div[contains(@class,'node-submitted')]/a
-
-date:substring-after(//div[contains(@class,'node-submitted')],' on ')
-test_url: http://ignoredbydinosaurs.com/2011/09/great-lie-lorem-ipsum \ No newline at end of file
diff --git a/data/GrabberConfig/ilounge.com.txt b/data/GrabberConfig/ilounge.com.txt
deleted file mode 100644
index 9880b51f..00000000
--- a/data/GrabberConfig/ilounge.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Get proper Title, Author and Date info
-title: substring-before(//title, '|')
-author: substring-after(//h4/a[@href='http://www.ilounge.com/index.php/ilounge/aboutus/'], 'By')
-date: //span[@class='instapaper_date']
-
-# For Reviews & First Looks, get the intro paragraph and put it in front of the main body.
-move_into(//div[@id='instapaper_para1']): //div[@id='instapaper_body']
-body: //div[@id='instapaper_para1']
-strip: //div[@class='reviewinfo']
-
-# We don't use footnotes, so why bother checking for them?
-footnotes: no
-test_url: http://www.ilounge.com/index.php/reviews/entry/luxa2-alum-x-for-iphone-4-4s/?utm_source=twitterfeed&utm_medium=twitter \ No newline at end of file
diff --git a/data/GrabberConfig/ilyabirman.ru.txt b/data/GrabberConfig/ilyabirman.ru.txt
deleted file mode 100644
index 51a7eb9c..00000000
--- a/data/GrabberConfig/ilyabirman.ru.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@class='published visible e2-smart-title']//span
-author: //span[@id='e2-blog-title']
-date: //p[@class='super-h']
-body: //div[@class='text published visible']
-test_url: http://ilyabirman.ru/meanwhile/2011/11/15/2/ \ No newline at end of file
diff --git a/data/GrabberConfig/imasters.com.br.txt b/data/GrabberConfig/imasters.com.br.txt
deleted file mode 100644
index f967d9c7..00000000
--- a/data/GrabberConfig/imasters.com.br.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title://h1[contains(concat(' ',normalize-space(@class),' '),' title ')]
-body: //div[@id='content-font']
-strip://div[contains(concat(' ',normalize-space(@class),' '),' single-content ')]//div[contains(concat(' ',normalize-space(@class),' '),' single-info-post ')]
-
-test_url: http://imasters.com.br/desenvolvimento/como-se-destacar-em-programacao-e-banco-de-dados/?utm_source=iMasters+List&utm_campaign=ec7fb0575d-News_semanal_2014_07_297_28_2014&utm_medium=email&utm_term=0_c1528e6ab3-ec7fb0575d-359620857
diff --git a/data/GrabberConfig/imgcert.com.txt b/data/GrabberConfig/imgcert.com.txt
deleted file mode 100644
index d361c8b2..00000000
--- a/data/GrabberConfig/imgcert.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='image-viewer-container']//img
-
-test_url: https://imgcert.com/image/fgX1
diff --git a/data/GrabberConfig/in.rbth.com.txt b/data/GrabberConfig/in.rbth.com.txt
deleted file mode 100644
index 1c0fff30..00000000
--- a/data/GrabberConfig/in.rbth.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[contains(concat(' ',normalize-space(@class),' '),' title ')]
-body: //div[contains(concat(' ',normalize-space(@class),' '),' lead ')] | //section[contains(concat(' ',normalize-space(@class),' '),' text ')]
-strip: //div(@class='incut i_right') | //div[contains(concat(' ',normalize-space(@class),' '),' mastertag_pic ')]
-date: //span[contains(concat(' ',normalize-space(@class),' '),' date ')]
-author: //span[contains(concat(' ',normalize-space(@class),' '),' author ')]
-test_url: https://in.rbth.com/politics/2016/04/26/is-revolution-in-russia-by-emigres-abroad-possible_588071
diff --git a/data/GrabberConfig/inc.com.txt b/data/GrabberConfig/inc.com.txt
deleted file mode 100644
index 5410e64e..00000000
--- a/data/GrabberConfig/inc.com.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-author: substring-after(substring-before(//div[@id='byline'],'|'),'By')
-author: //div[@class='byline']/a
-date: //span[@class='pubdate']
-# print friendly page
-body: //div[@id='text']
-# regular page
-body: //div[@id= 'articlecontent']
-
-strip: //div[@id= 'articlecontent']/h1
-strip: //div[@id='articlecontent']/p[@class='deck']
-strip: //div[@id='articlecontent']/div[@class='byline']
-strip: //div[@id='articlespacer']
-strip: //div[@id='incsharebox']
-strip: //div[@id='articlesidebar']
-
-prune: no
-
-single_page_link: //a[contains(@href, 'Printer_Friendly.html')]
-strip: //a[contains(., 'Dig Deeper')]
-test_url: http://www.inc.com/guides/2010/11/seven-tips-for-lobbying-politicians.html
-test_url: http://www.inc.com/eric-schurenberg/startups-are-we-geting-irrationally-exuberant.html \ No newline at end of file
diff --git a/data/GrabberConfig/indehekken.net.txt b/data/GrabberConfig/indehekken.net.txt
deleted file mode 100644
index 93a9f219..00000000
--- a/data/GrabberConfig/indehekken.net.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='post-entry']/p
-
-test_url: http://www.indehekken.net/you-only-sing-when-youre-rowing/
diff --git a/data/GrabberConfig/independent.co.uk.txt b/data/GrabberConfig/independent.co.uk.txt
deleted file mode 100644
index 6711a0a2..00000000
--- a/data/GrabberConfig/independent.co.uk.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //meta[@property='og:title']/@content
-body: //img[contains(@class, 'FirstImage')] | //div[contains(@class, 'articleContent')]
-date: //meta[@property='article:published_time']/@content
-author: //div[@id='main']//div[@class='byline']//span[@class='authorName']
-
-strip_id_or_class: RelatedArtTag
-
-strip: //h5[contains(., 'READ MORE:')]
-strip: //h5[contains(., 'Read more:')]
-
-tidy: no
-test_url: http://www.independent.co.uk/news/world/middle-east/syria-could-face-human-rights-probe-2274326.html
-test_url: http://www.independent.co.uk/voices/comment/robert-fisk-on-the-cia-torture-report-once-again-language-is-distorted-in-order-to-hide-us-state-wrongdoing-9924501.html
-test_contains: Thank God for Noam Chomsky.
-
-test_url: http://www.independent.co.uk/news/uk/rss \ No newline at end of file
diff --git a/data/GrabberConfig/indiatimes.com.txt b/data/GrabberConfig/indiatimes.com.txt
deleted file mode 100644
index 8112105f..00000000
--- a/data/GrabberConfig/indiatimes.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //figure[@class='mainVideo']
-strip: //figcaption
-
-prune: no
-
-test_url: http://www.indiatimes.com/bollywood/kareena-insecure-about-saif-working-with-bipasha-23386.html \ No newline at end of file
diff --git a/data/GrabberConfig/indiehackers.com.txt b/data/GrabberConfig/indiehackers.com.txt
deleted file mode 100644
index 2d105360..00000000
--- a/data/GrabberConfig/indiehackers.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-prune: no
-body: //div[@itemprop="articleBody"]
-strip: //aside
-
-test_url: https://www.indiehackers.com/businesses/paleo-meal-plans
diff --git a/data/GrabberConfig/inessential.com.txt b/data/GrabberConfig/inessential.com.txt
deleted file mode 100644
index 52252455..00000000
--- a/data/GrabberConfig/inessential.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@class='weblogPost']/h3[1]
-author: ("Brent Simmons")
-date: //span[@class="weblogPostDisplayDate"]
-body: //div[@class='weblogPostBody']
-test_url: http://inessential.com/2011/10/25/why_just_store_the_app_data_on_dropbo \ No newline at end of file
diff --git a/data/GrabberConfig/info.abril.com.br.txt b/data/GrabberConfig/info.abril.com.br.txt
deleted file mode 100644
index dee69f80..00000000
--- a/data/GrabberConfig/info.abril.com.br.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title://h1
-body://div[@id='texto_link']
-
-test_url: http://info.abril.com.br/noticias/internet/filme-do-youtube-vai-estrear-nos-cinemas-22042011-6.shl \ No newline at end of file
diff --git a/data/GrabberConfig/infoq.com.txt b/data/GrabberConfig/infoq.com.txt
deleted file mode 100644
index f4a328a6..00000000
--- a/data/GrabberConfig/infoq.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-body: //div[@id="intTranscript"]
-body: //div[@class="box-content"]
-title: //div[@class="box-content"]//h1[1]
-author: //p[@class="info"]/strong
-date: substring-before(substring-after(//p[@class="info"], "on"), "Length")
-strip: //div[@class="box-content"]//h1[1]
-strip: //div[@class="box-content"]//p[@class="info"]
-strip_id_or_class: vendor-content-box
-strip_id_or_class: tags2
-strip_id_or_class: instructions
-strip_id_or_class: comments
-strip_id_or_class: forum-list-tree
-strip: //div[@class="addthis_toolbox addthis_default_style"]
-test_url: http://www.infoq.com/interviews/oleg-zhurakousky-javaone2011-interview \ No newline at end of file
diff --git a/data/GrabberConfig/informador.com.mx.txt b/data/GrabberConfig/informador.com.mx.txt
deleted file mode 100644
index 77987493..00000000
--- a/data/GrabberConfig/informador.com.mx.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@class='tituloInt']
-body: //div[@class='notaPortada']
-strip: //img[@id='imgHorizontalInt imgDetalleImg imagenNota']
-date: //span[@class='publi']
-author: //span[@class='autor']
-tidy: no
-prune: no
-
-test_url: http://www.informador.com.mx/tecnologia/2011/337606/6/iran-desarrolla-antivirus-tras-afectaciones-por-duqu.htm \ No newline at end of file
diff --git a/data/GrabberConfig/information.dk.txt b/data/GrabberConfig/information.dk.txt
deleted file mode 100644
index 3ade754d..00000000
--- a/data/GrabberConfig/information.dk.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //meta[@property='og:title']/@content
-author: //*[@property='dc:creator']
-date: //*[@property='dc:date']/@content
-body: //div[@id='page-content']//div[contains(@class, 'article-body')]
-
-tidy: no
-test_url: http://www.information.dk/282307 \ No newline at end of file
diff --git a/data/GrabberConfig/informationarchitects.net.txt b/data/GrabberConfig/informationarchitects.net.txt
deleted file mode 100644
index 1330a040..00000000
--- a/data/GrabberConfig/informationarchitects.net.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title://h1[@class="post_title"]
-body://article[@class="post"]
-date://h1[@class="section_separator"]
-author://span[@class="post_author"]
-strip://nav[@class="arrow_nav"]
-strip://section[@id="contact"]
-strip_id_or_class:post_title
-strip_id_or_class:post_author
-strip_id_or_class:section_separator
-test_url: http://informationarchitects.net/blog/nzz-relaunch-a-quick-review/ \ No newline at end of file
diff --git a/data/GrabberConfig/informationclearinghouse.info.txt b/data/GrabberConfig/informationclearinghouse.info.txt
deleted file mode 100644
index 60b798e6..00000000
--- a/data/GrabberConfig/informationclearinghouse.info.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //head/title
-body: //table[@id='table3']//div[@class='postContent']
-prune: no
-tidy: no
-
-test_url: http://www.informationclearinghouse.info/article28238.htm \ No newline at end of file
diff --git a/data/GrabberConfig/informit.com.txt b/data/GrabberConfig/informit.com.txt
deleted file mode 100644
index 24bf6242..00000000
--- a/data/GrabberConfig/informit.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@id='content']/h1
-body: //div[@id="content"]
-strip: //img[contains(@src, 'informit_printer.png')]
-single_page_link: //div[contains(@class, 'articleTools')]//a[contains(@href, '/printerfriendly.')]
-prune: no
-
-test_url: http://www.informit.com/articles/article.aspx?p=1729268 \ No newline at end of file
diff --git a/data/GrabberConfig/infoworld.com.txt b/data/GrabberConfig/infoworld.com.txt
deleted file mode 100644
index 766dfbab..00000000
--- a/data/GrabberConfig/infoworld.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
-
-test_url: http://www.infoworld.com/article/3053563/it-management/disrupt-or-die-beware-the-siren-calls-of-tech-consultants.html
diff --git a/data/GrabberConfig/infzm.com.txt b/data/GrabberConfig/infzm.com.txt
deleted file mode 100644
index 489d5aff..00000000
--- a/data/GrabberConfig/infzm.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# This filter is tested on:
-# http://www.infzm.com/content/71068
-# http://www.infzm.com/content/41577
-
-author://em[contains(@class, 'toAuthor')]
-date:substring(//em[contains(@class, 'pubTime')],1)
-body://section[contains(@id, 'articleContent')]
-title://h1[contains(@class ,'articleHeadline clearfix')]
-test_url: http://www.infzm.com/content/41577 \ No newline at end of file
diff --git a/data/GrabberConfig/inhabitat.com.txt b/data/GrabberConfig/inhabitat.com.txt
deleted file mode 100644
index c63f53a6..00000000
--- a/data/GrabberConfig/inhabitat.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# set body
-body: //div[@class='post-listing']
-
-# remove clutter
-strip: //a/big
-strip: //a/em
-strip: //p/em
-test_url: http://inhabitat.com/2010/11/18/sliding-walls-transform-this-tokyo-house-into-an-office/ \ No newline at end of file
diff --git a/data/GrabberConfig/instagr.am.txt b/data/GrabberConfig/instagr.am.txt
deleted file mode 100644
index 522caebc..00000000
--- a/data/GrabberConfig/instagr.am.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='caption']
-author: //p[@class='username']
-
-strip: //div[@class='contents']/h3
-strip: //div[@class='location']
-test_url: http://instagr.am/p/G-s_aciyDJ/ \ No newline at end of file
diff --git a/data/GrabberConfig/io9.com.txt b/data/GrabberConfig/io9.com.txt
deleted file mode 100644
index e6ca16ae..00000000
--- a/data/GrabberConfig/io9.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-http_header(user-agent): PHP/5.3 \ No newline at end of file
diff --git a/data/GrabberConfig/ipadclub.nl.txt b/data/GrabberConfig/ipadclub.nl.txt
deleted file mode 100644
index afe058df..00000000
--- a/data/GrabberConfig/ipadclub.nl.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id = 'post']
-strip: //div[@class = 'postinfo']
-strip: //div[@id = 'postmetanew']
-strip: //div[@class = 'paginator']
-strip: //div[@class = 'col-2']
-strip: //div[@id = 'adfactor-label']
-test_url: http://www.ipadclub.nl/15808/text-writer-ipad-tekstverwerker-met-functieknoppen/ \ No newline at end of file
diff --git a/data/GrabberConfig/ipadplanet.nl.txt b/data/GrabberConfig/ipadplanet.nl.txt
deleted file mode 100644
index dedb5572..00000000
--- a/data/GrabberConfig/ipadplanet.nl.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id = 'post']
-strip: //div[@class = 'postinfo']
-strip: //div[@id = 'postmetanew']
-strip: //div[@class = 'paginator']
-strip: //div[@class = 'col-2']
-strip: //div[@id = 'adfactor-label']
-test_url: http://www.ipadplanet.nl/11723/steve-jobs-bevestigt-verdwijnen-fysieke-rotatieschakelaar-in-ios-4-2/ \ No newline at end of file
diff --git a/data/GrabberConfig/iphoneaddict.fr.txt b/data/GrabberConfig/iphoneaddict.fr.txt
deleted file mode 100644
index b0620900..00000000
--- a/data/GrabberConfig/iphoneaddict.fr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='entry-content item']/h1[@class='title fn entry-title']
-author: //div[@class="entry-meta"]/span[@class='reviewer']
-date: //div[@class="entry-meta"]/span[@class='dtreviewed']
-body: //div[@class="post-content description"]
-
-test_url: http://iphoneaddict.fr/post/news-179987-insolite-b-o-game-of-thrones-interpretee-nouveaux-instruments-chinois-garageband
diff --git a/data/GrabberConfig/iphoneclub.nl.txt b/data/GrabberConfig/iphoneclub.nl.txt
deleted file mode 100644
index 850a24e9..00000000
--- a/data/GrabberConfig/iphoneclub.nl.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id = 'post']
-strip: //div[@class = 'postinfo']
-strip: //div[@id = 'postmetanew']
-strip: //div[@class = 'paginator']
-strip: //div[@class = 'col-2']
-strip: //div[@id = 'adfactor-label']
-test_url: http://www.iphoneclub.nl/105808/t-mobile-mobiel-internet-wordt-duurder-maar-blijft-onbeperkt/ \ No newline at end of file
diff --git a/data/GrabberConfig/iphonehacks.com.txt b/data/GrabberConfig/iphonehacks.com.txt
deleted file mode 100644
index e8ccea06..00000000
--- a/data/GrabberConfig/iphonehacks.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //meta[@name='og:title']/@content
-body: //small[@class='postmetadata'] | //div[contains(@class, 'entry-content')]
-
-strip: //span[@vanilla-identifier]
-
-prune: no
-tidy: no
-
-test_url: http://www.iphonehacks.com/2012/07/app-review-process-behind-the-scenes.html \ No newline at end of file
diff --git a/data/GrabberConfig/iphonetweak.fr.txt b/data/GrabberConfig/iphonetweak.fr.txt
deleted file mode 100644
index 9210e394..00000000
--- a/data/GrabberConfig/iphonetweak.fr.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[@class='fond_titre']/h1[@class='post-title']
-body: //div[@class="post-chapo"]
-
-test_url: http://iphonetweak.fr/2016/05/20/apple-watch-deja-jailbreakee
diff --git a/data/GrabberConfig/iplaysoft.com.txt b/data/GrabberConfig/iplaysoft.com.txt
deleted file mode 100644
index 4a944768..00000000
--- a/data/GrabberConfig/iplaysoft.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@id='content']//div[@class='entry-banner' or @class='entry-content']
-test_url: http://www.iplaysoft.com/webbrowserpassview.html \ No newline at end of file
diff --git a/data/GrabberConfig/ippmedia.com.txt b/data/GrabberConfig/ippmedia.com.txt
deleted file mode 100644
index 99f25dc0..00000000
--- a/data/GrabberConfig/ippmedia.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[@class="content_title"]//h2
-author: substring-after(//div[@class="byline"], "By ")
-date: //div[@class="publish_date"]
-strip: //div[@class="read_image_box"]
diff --git a/data/GrabberConfig/iso.500px.com.txt b/data/GrabberConfig/iso.500px.com.txt
deleted file mode 100644
index ffa29a1d..00000000
--- a/data/GrabberConfig/iso.500px.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fiso.500px.com%2Fhow-i-post-processed-the-most-successful-image-of-my-career%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-test_url: https://iso.500px.com/how-i-post-processed-the-most-successful-image-of-my-career/
diff --git a/data/GrabberConfig/isource.com.txt b/data/GrabberConfig/isource.com.txt
deleted file mode 100644
index 215fdf87..00000000
--- a/data/GrabberConfig/isource.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Remove social buttons
-strip: //div[@id='temp_Content_Right']
-
-# Remove duplicate article title
-strip: //*[(@class='storytitle')]
-test_url: http://isource.com/2010/10/24/swearch-a-cool-iphone-web-app/ \ No newline at end of file
diff --git a/data/GrabberConfig/it-connect.fr.txt b/data/GrabberConfig/it-connect.fr.txt
deleted file mode 100644
index 80c95e68..00000000
--- a/data/GrabberConfig/it-connect.fr.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.it-connect.fr%2Fdebuter-avec-docker-et-les-containers-sous-debian-8%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post_inner_wrapper ')]
-
-strip_id_or_class: toc_container
-
-test_url: http://www.it-connect.fr/debuter-avec-docker-et-les-containers-sous-debian-8/
diff --git a/data/GrabberConfig/itavisen.no.txt b/data/GrabberConfig/itavisen.no.txt
deleted file mode 100644
index 0fe337ac..00000000
--- a/data/GrabberConfig/itavisen.no.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //p[@class = 'byline']//span[@class='author']
-
-body: //div[@id = 'story-contents']
-test_url: http://itavisen.no/2015/09/08/norske-nettleverandorer-vil-ikke-blokkere-pirate-bay/
diff --git a/data/GrabberConfig/itmedia.co.jp.txt b/data/GrabberConfig/itmedia.co.jp.txt
deleted file mode 100644
index 97f00ce8..00000000
--- a/data/GrabberConfig/itmedia.co.jp.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@id='cmsBody']
-
-next_page_link: //span[@id='next']/a
-
-strip_id_or_class: cmsCopyright
-strip_id_or_class: masterSocialbuttonBtm
-
-test_url: http://www.itmedia.co.jp/enterprise/articles/0912/05/news002.html \ No newline at end of file
diff --git a/data/GrabberConfig/itnews.com.au.txt b/data/GrabberConfig/itnews.com.au.txt
deleted file mode 100644
index f1ff4c38..00000000
--- a/data/GrabberConfig/itnews.com.au.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class='article-header']
-body: //div[@class='body-content']
-author: //span[@class='author-byline']/a[contains(@id, 'Author')]
-
-strip: //span[contains(@id, 'Article_SourceLabel')]
-
-test_url: http://www.itnews.com.au/feature/the-untold-story-of-iinet-and-internodes-basslink-internet-woes-417296
diff --git a/data/GrabberConfig/itstactical.com.txt b/data/GrabberConfig/itstactical.com.txt
deleted file mode 100644
index b8cb461c..00000000
--- a/data/GrabberConfig/itstactical.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h1[@class="entry-title"]
-body: //div[@class='format_text entry-content']
-author: //span[@class="author vcard"]/a
-date: //abbr[@class="published"]
-
-strip_id_or_class: related-posts
-strip_id_or_class: membershipbox
-strip_id_or_class: share_this_compact_bt
-
-
-footnotes: no
-test_url: http://www.itstactical.com/warcom/knives/exclusive-triple-aught-design-production-dauntless-knife-video-walkthrough/ \ No newline at end of file
diff --git a/data/GrabberConfig/itunes.apple.com.txt b/data/GrabberConfig/itunes.apple.com.txt
deleted file mode 100644
index ffd95561..00000000
--- a/data/GrabberConfig/itunes.apple.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-body: //div[@id='left-stack' or contains(@class, 'center-stack')]
-
-find_string: class="artwork" src="
-replace_string: class="artwork" src-disabled="
-find_string: src-swap-high-dpi="
-replace_string: src="
-
-strip_id_or_class: rating
-strip_id_or_class: listeners-also-bought
-
-prune: no
-
-test_url: https://itunes.apple.com/us/rss/topaudiobooks/limit=10/xml
-test_url: https://itunes.apple.com/us/audiobook/the-giver-unabridged/id356345850 \ No newline at end of file
diff --git a/data/GrabberConfig/itwire.com.txt b/data/GrabberConfig/itwire.com.txt
deleted file mode 100644
index 72b41065..00000000
--- a/data/GrabberConfig/itwire.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //a[@rel="author"]
-date: //li[@class="itemDateCreated"]
-strip: //div[contains(@class, 'legend-rounded')]
-
-test_url: http://www.itwire.com/it-industry-news/market/59661-ibm-looks-to-high-value-solutions-to-meet-changing-demands
diff --git a/data/GrabberConfig/itworld.com.txt b/data/GrabberConfig/itworld.com.txt
deleted file mode 100644
index b96ad338..00000000
--- a/data/GrabberConfig/itworld.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
-
-test_url: http://www.itworld.com/article/3055304/your-face-is-big-data-the-title-of-this-photographers-experiment-says-it-all.html
diff --git a/data/GrabberConfig/izismile.com.txt b/data/GrabberConfig/izismile.com.txt
deleted file mode 100644
index b0114d35..00000000
--- a/data/GrabberConfig/izismile.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[starts-with(@id, 'news-id-')]
-prune: no
-
-test_url: http://izismile.com/2011/06/13/uncanny_factoid_fashion_or_creepy_2_pics.html \ No newline at end of file
diff --git a/data/GrabberConfig/jalopnik.com.txt b/data/GrabberConfig/jalopnik.com.txt
deleted file mode 100644
index 7823dbd7..00000000
--- a/data/GrabberConfig/jalopnik.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //span[@class='plus-icon']
-
-http_header(user-agent): PHP/5.3
-
-test_url: http://jalopnik.com/5892124/1955-porsche-550-spyder-sells-for-record-3685-million/ \ No newline at end of file
diff --git a/data/GrabberConfig/jameslandrith.com.txt b/data/GrabberConfig/jameslandrith.com.txt
deleted file mode 100644
index 9437771d..00000000
--- a/data/GrabberConfig/jameslandrith.com.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: //div[@class='blog']/ul[@class='single']/li//h1
-body: //div[@class='blog']/ul[@class='single']/li
-strip: //h1
-strip: //*[@class='post-meta']
-strip: //div[@class='apss-social-share']
-strip: //div[@class='tags']
-strip: //*[@class='nav-single']
-
-strip_id_or_class: post_meta
-strip_id_or_class: social-share
-strip: //nav
-
-# strip_comments:yes
-
-prune:no
-tidy:yes
-
-test_url: http://jameslandrith.com/2016/03/20/so-turnabout-is-not-actual-advocacy-or-how-to-be-a-shitty-person-101/
diff --git a/data/GrabberConfig/jandan.net.txt b/data/GrabberConfig/jandan.net.txt
deleted file mode 100644
index 343fd6fb..00000000
--- a/data/GrabberConfig/jandan.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='content']//div[@class = 'post f']
-strip_id_or_class: comment-big
-strip_id_or_class: avatar
-strip: //div[@class='time_s']
-
-test_url: http://jandan.net/2011/04/03/iphone-5-sony.html \ No newline at end of file
diff --git a/data/GrabberConfig/javaworld.com.txt b/data/GrabberConfig/javaworld.com.txt
deleted file mode 100644
index 9898309b..00000000
--- a/data/GrabberConfig/javaworld.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
diff --git a/data/GrabberConfig/jdubuzz.com.txt b/data/GrabberConfig/jdubuzz.com.txt
deleted file mode 100644
index 5cf7f005..00000000
--- a/data/GrabberConfig/jdubuzz.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http://www.journaldugeek.com/2015/09/09/apple-ipad-pro/
-
-date: //meta[@property="og:updated_time"]/@content
-next_page_link: //div[@class="post-content"]/div[@class='row pagination']/a[contains(concat(' ',normalize-space(@class),' '),' next ')]
-
-strip_id_or_class: jdg-recommend
-strip_id_or_class: proofreader-bloc
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-test_url: http://www.jdubuzz.com/2015/09/11/le-meilleur-du-jduzap-cest-maintenant/
-test_url: http://www.jdubuzz.com/tests/les-20-comptes-instagram-des-filles-les-plus-sexy-a-suivre-en-2016/
diff --git a/data/GrabberConfig/jetzt.de.txt b/data/GrabberConfig/jetzt.de.txt
deleted file mode 100644
index 3b138f5e..00000000
--- a/data/GrabberConfig/jetzt.de.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //header/h2
-strip: //header/h2
-
-body: //div[@class='article__header-teaser'] | //div[@class='article__content']//p | //div[@class='article__content']//img | //div[@class='article__content']//a
-strip: //ul[contains(@class, 'sharingbar')]
-strip: //ol[@class='teaser__widget']
-
-author: substring-after(//div[@class='article__header-author'], 'Von ')
-author: substring-after(//div[@class='article__header-author'], 'Interview: ')
-author: //div[@class='article__header-author']
-
-date: //meta[@property='article:modified_time']/@content
-
-test_url: http://www.jetzt.de/hauptsache-reset/haeftlinge-als-unternehmensgruender
-test_url: http://www.jetzt.de/maedchenfrage/maedchen-fragen-jungs-warum-balanciert-ihr-an-roten-ampeln-auf-dem-rad
-test_url: http://www.jetzt.de/meine-theorie/das-perfekte-alter-ist-eine-frage-der-perspektive
diff --git a/data/GrabberConfig/jetzt.sueddeutsche.de.txt b/data/GrabberConfig/jetzt.sueddeutsche.de.txt
deleted file mode 100644
index 00e4cf63..00000000
--- a/data/GrabberConfig/jetzt.sueddeutsche.de.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-title: //h1
-author: //p[contains(@class, 'author')]/a
-date: //p[contains(@class, 'time')]
-body: //div[@class='content']/div[contains(@class, 'text')]
-
-# prevent "no text" errors on multi-page articles
-tidy: no
-
-# we use a custom next-link detector instead of the print view because
-# it's pretty hard to strip out the unwanted parts in the print view
-autodetect_next_page: no
-next_page_link: //div[contains(@class, 'text')]/div/div[contains(@class, 'paging')]/a[@class='more ']
-
-strip: //h1
-
-strip_id_or_class: meta
-strip_id_or_class: author
-strip_id_or_class: paging
-
-# prevent "Report an Error" from being recognized as footnote
-footnotes: no
-test_url: http://jetzt.sueddeutsche.de/texte/anzeigen/544308/Alles-flicken \ No newline at end of file
diff --git a/data/GrabberConfig/jezebel.com.txt b/data/GrabberConfig/jezebel.com.txt
deleted file mode 100644
index e6ca16ae..00000000
--- a/data/GrabberConfig/jezebel.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-http_header(user-agent): PHP/5.3 \ No newline at end of file
diff --git a/data/GrabberConfig/jjahnke.net.txt b/data/GrabberConfig/jjahnke.net.txt
deleted file mode 100644
index d45c8899..00000000
--- a/data/GrabberConfig/jjahnke.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='entry']
-prune: no
-
-test_url: http://www.jjahnke.net/rundbr87.html#2514 \ No newline at end of file
diff --git a/data/GrabberConfig/jobbank.gc.ca.txt b/data/GrabberConfig/jobbank.gc.ca.txt
deleted file mode 100644
index 1dbe2072..00000000
--- a/data/GrabberConfig/jobbank.gc.ca.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@id='formatCont_en']
-
-prune: no
-
-test_url: http://www.jobbank.gc.ca/detail-eng.aspx?Source=JobPosting&OrderNum=6397922 \ No newline at end of file
diff --git a/data/GrabberConfig/joelonsoftware.com.txt b/data/GrabberConfig/joelonsoftware.com.txt
deleted file mode 100644
index 241a361f..00000000
--- a/data/GrabberConfig/joelonsoftware.com.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# Works with old posts too, such as http://www.joelonsoftware.com/articles/fog0000000332.html
-
-author: substring-after(//div[@class="author"], 'by ')
-date: //div[@class="date"]
-
-## Clean stuff at top ##
-
-strip: //h1[1]
-strip: //h2[1]
-strip: //div[@class="date"]
-strip: //div[@class="author"]
-
-## Clean stuff at bottom ##
-
-strip: //blockquote[@class="textmessage"]
-strip: //div[@style="width:500px"]/p[last()]
-strip: //div[@style="width:500px"]/p[last()-1]
-strip: //div[@style="width:500px"]/h4[last()]
-strip: //div[@style="width:500px"]/h4[last()-1]
-strip: //div[@style="width:500px"]/div[last()]
-test_url: http://www.joelonsoftware.com/items/2011/09/15.html \ No newline at end of file
diff --git a/data/GrabberConfig/jouire.com.txt b/data/GrabberConfig/jouire.com.txt
deleted file mode 100644
index 3cf60672..00000000
--- a/data/GrabberConfig/jouire.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-author: //h1
-date: //p[contains(@class,'date')]
-test_url: http://jouire.com/2011/01/exquisite-whispers/ \ No newline at end of file
diff --git a/data/GrabberConfig/journaldugamer.com.txt b/data/GrabberConfig/journaldugamer.com.txt
deleted file mode 100644
index 5d7d10b6..00000000
--- a/data/GrabberConfig/journaldugamer.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http://www.journaldugeek.com/2015/09/09/apple-ipad-pro/
-
-date: //meta[@property="og:updated_time"]/@content
-next_page_link: //div[@class="post-content"]/div[@class='row pagination']/a[contains(concat(' ',normalize-space(@class),' '),' next ')]
-
-strip_id_or_class: jdg-recommend
-strip_id_or_class: proofreader-bloc
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-test_url: http://www.journaldugamer.com/2015/09/14/financier-desormais-tete-nintendo/
diff --git a/data/GrabberConfig/journaldugeek.com.txt b/data/GrabberConfig/journaldugeek.com.txt
deleted file mode 100644
index a63f186e..00000000
--- a/data/GrabberConfig/journaldugeek.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http://www.journaldugeek.com/2015/09/09/apple-ipad-pro/
-
-date: //meta[@property="og:updated_time"]/@content
-next_page_link: //div[@class="post-content"]/div[@class='row pagination']/a[contains(concat(' ',normalize-space(@class),' '),' next ')]
-
-body: //div[class='post-content']
-
-strip_id_or_class: jdg-recommend
-strip_id_or_class: proofreader-bloc
-strip_id_or_class: tests-push
-
-test_url: http://www.journaldugeek.com/2015/09/09/apple-ipad-pro/
-test_url: http://www.journaldugeek.com/tests/escape-game-maitres-jeu-vous-influencent-faire-gagner/
diff --git a/data/GrabberConfig/joystiq.com.txt b/data/GrabberConfig/joystiq.com.txt
deleted file mode 100644
index 7a8e56f8..00000000
--- a/data/GrabberConfig/joystiq.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-author: //a[@class="byline-author"]
-title: //h1[@class="headline"]
-strip: //div[@id="info-card"]
-strip: //div[@id="breaking-news"]
-strip: //div[@class="rmod list-post-mod"]
-strip: //div[@id="footer"]
-strip: //div[@id="GH_strip"]
-test_url: http://www.joystiq.com/2012/06/20/magic-the-gathering-duels-of-the-planeswalkers-2013-review/ \ No newline at end of file
diff --git a/data/GrabberConfig/jsforcats.com.txt b/data/GrabberConfig/jsforcats.com.txt
deleted file mode 100644
index f2699ef1..00000000
--- a/data/GrabberConfig/jsforcats.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fjsforcats.com%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-test_url: http://jsforcats.com/
diff --git a/data/GrabberConfig/juedische-allgemeine.de.txt b/data/GrabberConfig/juedische-allgemeine.de.txt
deleted file mode 100644
index ff5a0244..00000000
--- a/data/GrabberConfig/juedische-allgemeine.de.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-body: //div[@id='article_container']
-author: //h4//a[@class='author']
-title: //h1
-
-replace_string(lang="en"): lang="de"
-replace_string(/>1</a>):/></a>
-
-strip_id_or_class: share_toolbox
-strip_id_or_class: article_header
-strip_id_or_class: phototext
-
-strip_image_src: icon_author.gif
-
-strip: //img[@src='']
-strip: //h4[@id='author']
-
-prune: no
-
-test_url: http://www.juedische-allgemeine.de/article/view/id/13366 \ No newline at end of file
diff --git a/data/GrabberConfig/jungle-world.com.txt b/data/GrabberConfig/jungle-world.com.txt
deleted file mode 100644
index 61e0087f..00000000
--- a/data/GrabberConfig/jungle-world.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1
-body: //div[contains(@class,'story')]
-test_url: http://jungle-world.com/artikel/2015/02/51207.html
diff --git a/data/GrabberConfig/juppy.org.txt b/data/GrabberConfig/juppy.org.txt
deleted file mode 100644
index fdf7cdc9..00000000
--- a/data/GrabberConfig/juppy.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-convert_double_br_tags: yes
-
-title: //div[@id="storycredits"]/p/span[@class="title"]
-author: //div[@id="storycredits"]/p/br[1]/following-sibling::text()
-
-strip: //div[@id="storycredits"]
-
-test_url: http://www.juppy.org/santa/stories.php?ForAuthorID=35&Year=2005 \ No newline at end of file
diff --git a/data/GrabberConfig/kachestvo.ru.txt b/data/GrabberConfig/kachestvo.ru.txt
deleted file mode 100644
index 535693c4..00000000
--- a/data/GrabberConfig/kachestvo.ru.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[contains(@class, 'inner_content')]
-
-test_url: http://kachestvo.ru/promtovar/odezhda/denim.html \ No newline at end of file
diff --git a/data/GrabberConfig/kathimerini.gr.txt b/data/GrabberConfig/kathimerini.gr.txt
deleted file mode 100644
index 2c7c518c..00000000
--- a/data/GrabberConfig/kathimerini.gr.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //td[contains(@class, 'articleTitlos')]
-body: //td[contains(@class, 'eelantext')]
-
-test_url: http://www.kathimerini.gr/4dcgi/_w_articles_kathremote_1_03/12/2013_530490 \ No newline at end of file
diff --git a/data/GrabberConfig/kattascha.de.txt b/data/GrabberConfig/kattascha.de.txt
deleted file mode 100644
index ca8322b0..00000000
--- a/data/GrabberConfig/kattascha.de.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fkattascha.de%2F%3Fp%3D2207
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: http://kattascha.de/?p=2207
diff --git a/data/GrabberConfig/kenrockwell.com.txt b/data/GrabberConfig/kenrockwell.com.txt
deleted file mode 100644
index 90c64cbf..00000000
--- a/data/GrabberConfig/kenrockwell.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Ads
-strip: //table[@align="right"][@width="120"]
-
-# Affiliate link paragraphs
-strip: //a[.="Adorama"]/parent::p[contains(., "goodies")]
-strip: //a[.="Adorama"]/parent::p[contains(., "This free website's biggest source of")]
-test_url: http://www.kenrockwell.com/tech/composition.htm \ No newline at end of file
diff --git a/data/GrabberConfig/keyboardmag.com.txt b/data/GrabberConfig/keyboardmag.com.txt
deleted file mode 100644
index 4953d81d..00000000
--- a/data/GrabberConfig/keyboardmag.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='article-inner']
-strip_id_or_class: date
-author: //div[@class='author']
-test_url: http://www.keyboardmag.com/gear/1183/review-dave-smith-instruments-ob-6/58802
diff --git a/data/GrabberConfig/kicker.de.txt b/data/GrabberConfig/kicker.de.txt
deleted file mode 100644
index db4f63c4..00000000
--- a/data/GrabberConfig/kicker.de.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# set body
-body: //div[@id='ovArtikel']
-
-# set title
-title: //div[@id='ovArtikel']/h1
-# strip main title and leave sub title
-strip: //div[@id='ovArtikel']/h1
-
-date: //div[@class='publicdate']
-
-#remove captions
-strip: //*/div[@class='bu']
-strip: //*/div[@class='credit']
-
-#remove adds
-strip: //*/div[@class='ad-head']
-strip: //*/div[@class='linksebay']
-
-# remove video content
-strip: //*/div[@class='ovVideo']
-test_url: http://www.kicker.de/news/fussball/frauen/wmfr/frauen-weltmeisterschaft/2011/3/1123662/spielbericht_frankreich-frauen_deutschland-frauen.html \ No newline at end of file
diff --git a/data/GrabberConfig/kickstarter.com.txt b/data/GrabberConfig/kickstarter.com.txt
deleted file mode 100644
index 7b3daa58..00000000
--- a/data/GrabberConfig/kickstarter.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@id='name']
-body: //*[@id='leftcol']
-
-strip_id_or_class: 'share-box'
-strip_id_or_class: 'project-faqs'
-strip_id_or_class: 'report-issue-wrap'
-test_url: http://www.kickstarter.com/projects/hop/elevation-dock-the-best-dock-for-iphone \ No newline at end of file
diff --git a/data/GrabberConfig/kingarthurflour.com.txt b/data/GrabberConfig/kingarthurflour.com.txt
deleted file mode 100644
index b27539f5..00000000
--- a/data/GrabberConfig/kingarthurflour.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[@class='post']/h2
-body: //div[@class='entry']
-strip: //p[contains(.,'Tags:')]
-test_url: http://www.kingarthurflour.com/blog/2011/01/28/a-big-sandwich-for-the-big-game/ \ No newline at end of file
diff --git a/data/GrabberConfig/kotaku.com.txt b/data/GrabberConfig/kotaku.com.txt
deleted file mode 100644
index 61ccbc46..00000000
--- a/data/GrabberConfig/kotaku.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //span[@class="plus-icon"]
-
-http_header(user-agent): PHP/5.3
-
-test_url: http://kotaku.com/5920211/save-the-furries-on-your-wii-in-this-weeks-nintendo-download \ No newline at end of file
diff --git a/data/GrabberConfig/kottke.org.txt b/data/GrabberConfig/kottke.org.txt
deleted file mode 100644
index 582f251c..00000000
--- a/data/GrabberConfig/kottke.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2
-author: //*[@id='main']/div/a[1]
-date: substring-before(substring-after(//div[@class='meta'],'&bull;'),'&bull;')
-body: //div[@id='main']
-strip: //div[@class='meta']
-test_url: http://kottke.org/08/02/king-of-kong-a-fistful-of-quarters \ No newline at end of file
diff --git a/data/GrabberConfig/kulturegeek.fr.txt b/data/GrabberConfig/kulturegeek.fr.txt
deleted file mode 100644
index ce08be39..00000000
--- a/data/GrabberConfig/kulturegeek.fr.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //h1[@class='post-name']
-author: //span[@class="police_info reviewer"]/a
-date: //span[@class="police_info dtreviewed"]
-body: //div[@class="post-content"]
-
-strip: //div[@class="yarpp-related"]
-strip: //div[@id="pafternews"]
-strip: //div[@class="partage_reseaux2"]
-strip: //div[@class="partage_reseaux"]
-strip: //a[@class="enp-report"]
-strip: //div[@class="adsPost"]
-
-test_url: http://kulturegeek.fr/news-84253/plan-promos-high-tech-week-end-13
diff --git a/data/GrabberConfig/kumailplus.com.txt b/data/GrabberConfig/kumailplus.com.txt
deleted file mode 100644
index 2f604de0..00000000
--- a/data/GrabberConfig/kumailplus.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class = "entry-full"]
-
-test_url: http://www.kumailplus.com/2011/12/02/24308 \ No newline at end of file
diff --git a/data/GrabberConfig/kumb.com.txt b/data/GrabberConfig/kumb.com.txt
deleted file mode 100644
index fe350622..00000000
--- a/data/GrabberConfig/kumb.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //div[@id='centrediv']/h1
-
-author: substring-after(//div[@id='centrediv']/h3,'By: ')
-
-date: substring-after(substring-before(//div[@id='centrediv']/h3,'By: '),'Filed: ')
-
-body: //div[@class='KonaBody']
-
-convert_double_br_tags: yes
-test_url: http://www.kumb.com/story.php?id=126084 \ No newline at end of file
diff --git a/data/GrabberConfig/kwerfeldein.de.txt b/data/GrabberConfig/kwerfeldein.de.txt
deleted file mode 100644
index cf4d3b8c..00000000
--- a/data/GrabberConfig/kwerfeldein.de.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-date: //span[@class='datum']
-title: //div[@class='artikel']/h2
-body: //div[@class='entry']
-strip: //p[@class='tags']
-author: substring-after(//div[@class='authorinfo']/em,'Dies ist ein Artikel von ')
-strip: //div[@class='authorinfo']
-strip: //div[@class='authorpic']
-
-test_url: http://kwerfeldein.de/index.php/2011/10/17/doppelbelichtungen-mit-konzept/ \ No newline at end of file
diff --git a/data/GrabberConfig/lalibre.be.txt b/data/GrabberConfig/lalibre.be.txt
deleted file mode 100644
index 14e467c9..00000000
--- a/data/GrabberConfig/lalibre.be.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1[@class='mainContentTitle']
-date: //span[@class='publication']/time/@datetime
-
-body: //div[@class='articleText']
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.lalibre.be/actu/international/emmanuelle-mignon-l-ex-directrice-de-cabinet-de-sarkozy-mise-en-examen-56b10c9d3570b1fc10e24f20
diff --git a/data/GrabberConfig/landetsfria.se.txt b/data/GrabberConfig/landetsfria.se.txt
deleted file mode 100644
index e5317a5a..00000000
--- a/data/GrabberConfig/landetsfria.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.landetsfria.se/artikel/112070 \ No newline at end of file
diff --git a/data/GrabberConfig/lapin-blanc.blogs.docteo.net.txt b/data/GrabberConfig/lapin-blanc.blogs.docteo.net.txt
deleted file mode 100644
index 38835a90..00000000
--- a/data/GrabberConfig/lapin-blanc.blogs.docteo.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Flapin-blanc.blogs.docteo.net%2F2015%2F01%2F20%2Flencadrement-doctoral-deviendrait-il-un-sujet-dactualite%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: http://lapin-blanc.blogs.docteo.net/2015/01/20/lencadrement-doctoral-deviendrait-il-un-sujet-dactualite/
diff --git a/data/GrabberConfig/laprensagrafica.com.txt b/data/GrabberConfig/laprensagrafica.com.txt
deleted file mode 100644
index 82374c0b..00000000
--- a/data/GrabberConfig/laprensagrafica.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-tidy: no
-
-test_url: http://www.laprensagrafica.com/opinion/editorial/229252-reflexiones-sobre-la-educacion-que-necesitamos.html \ No newline at end of file
diff --git a/data/GrabberConfig/lapresse.ca.txt b/data/GrabberConfig/lapresse.ca.txt
deleted file mode 100644
index a3d92877..00000000
--- a/data/GrabberConfig/lapresse.ca.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@class='article-page']//p[@class='amorce'] | //div[@class='article-page']//div[contains(@class, 'entry')]
-author: //div[@class='infosAuteur']
-
-strip: //ul[@class='stories']
-
-test_url:http://www.lapresse.ca/actualites/national/201611/30/01-5046565-coup-dur-pour-les-radars-photo-plusieurs-constats-pourraient-etre-annules.php
-test_url: http://www.lapresse.ca/le-soleil/vivre-ici/la-science-au-quotidien/201610/01/01-5026482-les-vertus-de-leau-degout.php
diff --git a/data/GrabberConfig/laquadrature.net.txt b/data/GrabberConfig/laquadrature.net.txt
deleted file mode 100644
index 746bfca7..00000000
--- a/data/GrabberConfig/laquadrature.net.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@id='content-content']//div[@class='content']
-title: //h1[@class='title']
-date: substring-after(//*[@class='submitted'],'Submitted on')
-tidy: no
-strip: //div[@class='terms terms-inline']
-strip: //div[@class='more']
-strip: //div[@class='share-links']
-strip: //table[@id='attachments']
-
-test_url: http://www.laquadrature.net/en/finalization-of-eu-parliaments-weak-net-neutrality-resolution \ No newline at end of file
diff --git a/data/GrabberConfig/lareviewofbooks.org.txt b/data/GrabberConfig/lareviewofbooks.org.txt
deleted file mode 100644
index 25e36543..00000000
--- a/data/GrabberConfig/lareviewofbooks.org.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-#metadata
-title: substring-before(//title,' |')
-author: //a[contains(@class,'person') and starts-with(@href, '/contributor')]
-
-#text
-body: //div[contains(@class, 'article_body')]
-
-#clean up
-strip_id_or_class: recommended_section
-
-test_url: http://lareviewofbooks.org/review/american-politics-redeembale-robert-gates-hillary-clinton-two-memoirs-washington-dc
-test_url: http://lareviewofbooks.org/interview/souvenirs-future
diff --git a/data/GrabberConfig/latimes.com.txt b/data/GrabberConfig/latimes.com.txt
deleted file mode 100644
index b2db37bf..00000000
--- a/data/GrabberConfig/latimes.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-strip: //div[@id="tugs_story_display"]
-strip: //div[@id="search_overlay"]
-strip: //div[@id="adv_search"]
-body: //div[@class='story']
-tidy: no
-convert_double_br_tags: yes
-single_page_link: //a[contains(@href, ',print.')]
-strip: //p[starts-with(., 'latimes.com')]
-strip: //h1[starts-with(., 'latimes.com')]
-strip_id_or_class: cubead
-test_url: http://www.latimes.com/news/opinion/commentary/la-oe-gartonash-wilders-20110512,0,2876761.story \ No newline at end of file
diff --git a/data/GrabberConfig/laughingsquid.com.txt b/data/GrabberConfig/laughingsquid.com.txt
deleted file mode 100644
index ab2f834f..00000000
--- a/data/GrabberConfig/laughingsquid.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1[@class='entry-title']
-body: //div[@class='entry-content']
-test_url: http://laughingsquid.com/mysterious-tiny-doors-appearing-around-san-francisco/ \ No newline at end of file
diff --git a/data/GrabberConfig/lawfareblog.com.txt b/data/GrabberConfig/lawfareblog.com.txt
deleted file mode 100644
index 49d858a7..00000000
--- a/data/GrabberConfig/lawfareblog.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='field-items']
-title: //div[@class='title']
-
-test_url: https://lawfareblog.com/limits-panopticon
diff --git a/data/GrabberConfig/leancrew.com.txt b/data/GrabberConfig/leancrew.com.txt
deleted file mode 100644
index e78cf7e6..00000000
--- a/data/GrabberConfig/leancrew.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id="content"]/h1[1]
-date: substring-before(//p[@class="postdate"], ' at ')
-author: ("Dr. Drang")
-
-strip: //div[@id="content"]/h1[1]
-strip: //p[@class="postdate"]
-strip: //h2[@id="respond"]
-strip: //blockquote[@class="bbpTweet"]/p/span/a/img
-test_url: http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/ \ No newline at end of file
diff --git a/data/GrabberConfig/lececil.org.txt b/data/GrabberConfig/lececil.org.txt
deleted file mode 100644
index 8a38bbf3..00000000
--- a/data/GrabberConfig/lececil.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.lececil.org%2Fnode%2F7688
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' field-body ')]
-test_url: http://www.lececil.org/node/7688
diff --git a/data/GrabberConfig/lefigaro.fr.txt b/data/GrabberConfig/lefigaro.fr.txt
deleted file mode 100644
index 7e1d12d7..00000000
--- a/data/GrabberConfig/lefigaro.fr.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //meta[@name='title']/@content
-author: //span[@class='sign']//a[@class='journaliste']
-author: //meta[@name='author']/@content
-body: //*[@id='article']/div[@class='photo'] | //*[@id='article']/h2 | //*[@id='article']/div[@class='texte']
-date: //li[contains(concat(' ',normalize-space(@class),' '),' fig-date-pub ')]//time
-prune: no
-test_url: http://www.lefigaro.fr/environnement/2011/11/10/01029-20111110ARTFIG00801-la-chine-confrontee-a-un-immense-defi-ecologique.php
-test_url: http://www.lefigaro.fr/conjoncture/2012/11/20/20002-20121120ARTFIG00609-l-usager-devrait-payer-plus-pour-financer-les-transports.php
-test_url: http://www.lefigaro.fr/social/2015/03/10/09010-20150310ARTFIG00312-encore-une-annee-noire-pour-l-emploi-salarie.php
diff --git a/data/GrabberConfig/lemonde.fr.txt b/data/GrabberConfig/lemonde.fr.txt
deleted file mode 100644
index 19945243..00000000
--- a/data/GrabberConfig/lemonde.fr.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-title: //h1
-
-# We can have multiple authors
-author: //a[@class='auteur']
-
-# Last edition date (if any)
-date: //time[@itemprop='dateModified']/@datetime
-# Publication date
-date: //time[@itemprop='datePublished']/@datetime
-
-
-body: //div[@id='articleBody']
-
-# Remove the insane "conjugaison.lemonde.fr" links:
-find_string: <a target='_blank' onclick='return false;' class='lien_interne conjug'
-replace_string: <input type='hidden' style='display:none;'
-
-prune: no
-
-test_url: http://www.lemonde.fr/economie/article/2011/07/05/moody-s-abaisse-la-note-du-portugal-de-quatre-crans_1545237_3234.html
diff --git a/data/GrabberConfig/lenta.ru.txt b/data/GrabberConfig/lenta.ru.txt
deleted file mode 100644
index 00c3d935..00000000
--- a/data/GrabberConfig/lenta.ru.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@itemprop='articleBody'] | //img[@itemprop='image']
-strip_id_or_class: b-inline-topics-box
-
-# do not prune embedded videos
-prune: no
-
-test_url: https://lenta.ru/news/2016/07/08/weakpound/
diff --git a/data/GrabberConfig/lesnumeriques.com.txt b/data/GrabberConfig/lesnumeriques.com.txt
deleted file mode 100644
index 51e025ae..00000000
--- a/data/GrabberConfig/lesnumeriques.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1/following::span[@class='fn']
-# Author: should stop parsing until <br> reached, but I don't know how to do this.
-author: //following::div[@class='PDate2']
-date: //following::div[@class='PDate2']/strong
-
-body: //div[@class='ArTexte']
-body: //div[@id='prod_txt_b']
-body: //div[@class='ArPhotoP']
-test_url: http://www.lesnumeriques.com/disque-dur-multimedia/popcorn-hour-300-p12231/test.html \ No newline at end of file
diff --git a/data/GrabberConfig/letraslibres.com.txt b/data/GrabberConfig/letraslibres.com.txt
deleted file mode 100644
index cf271bca..00000000
--- a/data/GrabberConfig/letraslibres.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: concat(link[@rel="canonical"], "?page=full")
-
-test_url: http://www.letraslibres.com/revista/dossier/quien-manda-en-europa
diff --git a/data/GrabberConfig/libcom.org.txt b/data/GrabberConfig/libcom.org.txt
deleted file mode 100644
index d1404d10..00000000
--- a/data/GrabberConfig/libcom.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-date: //span[contains(@class, 'page-date')]
-body: //div[@id='node-page']
-strip_id_or_class: book-navigation
-prune: no
-
-test_url: http://libcom.org/library/what-was-the-ussr-aufheben-1
-test_url: http://libcom.org/library-latest/feed \ No newline at end of file
diff --git a/data/GrabberConfig/lifehacker.co.uk.txt b/data/GrabberConfig/lifehacker.co.uk.txt
deleted file mode 100644
index c540f7f3..00000000
--- a/data/GrabberConfig/lifehacker.co.uk.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@itemprop='headline']
-body: //noscript/img | //div[@itemprop='text']
-author: //div[@class='meta meta--post']//a[@class='is-author']
-date: //div[@class='meta meta--post']//time/@datetime
-
-test_url: http://www.lifehacker.co.uk/2014/08/22/dealhacker-10-google-chromecast-super-cheap-batteries-much
-test_url: http://www.lifehacker.co.uk/2014/08/18/andrognito-hides-files-youd-like-keep-away-prying-eyes
diff --git a/data/GrabberConfig/lifehacker.com.txt b/data/GrabberConfig/lifehacker.com.txt
deleted file mode 100644
index 330c4e78..00000000
--- a/data/GrabberConfig/lifehacker.com.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-# Adds author text: Gawker sites commonly show as "Author: View Profile"
-author://a[@class="plus-icon modfont"]
-
-# Add date and time
-date: //span[@class="date"]
-
-body: //div[contains(@class, 'marquee-asset-wrapper') or contains(@class, 'post-content')]
-
-# Remove date and time from article text
-strip: //span[@class="date"]
-
-# Remove login/comment text
-strip: //*[(@class="presence_control_external smalltype")]
-
-strip: //div[@class="nodebyline modfont"]
-
-# Remove right sidebar
-strip: //div[@id="rightwrapper"]
-
-# Remove print header
-strip: //div[@id='printhead']/h1
-
-# Remove 'content is restricted'
-strip: //div[@id='agegate_IDHERE']
-
-# Remove follow text
-strip: //*[(@class="permalink_ads")]
-
-strip_id_or_class: inset_groups
-
-# Remove view/comment count
-strip: //div[@id='wrapper']/div[2][@class='postmeta_permalink_wrapper']/div[1][@class='postmeta_permalink']/div[2][@class='pm_line']
-
-# Remove contact text
-strip: //div[@id='wrapper']/div[1][@class='content permalink']/p[6][@class='contactinfo']
-
-# Remove medium duplicates of the article image
-strip_image_src: medium.jpg
-
-# Remove "arrow" class at bottom of page
-strip: //p[@class="arrow"]
-
-# Remove "track" image from article body
-strip: //img[@alt="track"]
-
-# Remove hidden URLs
-strip: //a[@x-inset="hidden"]
-
-http_header(user-agent): PHP/5.3
-
-test_url: http://lifehacker.com/5925801/how-can-i-turn-vague-goals-into-actionable-to+dos
-test_url: http://lifehacker.com/5941600/hack-an-old-computer-mouse-into-a-wireless-bluetooth-mouse
-test_url: http://lifehacker.com/what-happens-to-the-brain-when-you-meditate-and-how-it-1202533314
diff --git a/data/GrabberConfig/lifestyle.inquirer.net.txt b/data/GrabberConfig/lifestyle.inquirer.net.txt
deleted file mode 100644
index 25d544ae..00000000
--- a/data/GrabberConfig/lifestyle.inquirer.net.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class='singlePageTitle']
-
-strip: //p[contains(text(), 'Follow Us')]
-strip: //p/strong[contains(text(), 'Recent Stories:')]
-strip: //div[@id="sharefeature"]
-
-test_url: http://lifestyle.inquirer.net/100223/dusting-your-ceiling-fan
diff --git a/data/GrabberConfig/lifeweek.com.cn.txt b/data/GrabberConfig/lifeweek.com.cn.txt
deleted file mode 100644
index e09f6692..00000000
--- a/data/GrabberConfig/lifeweek.com.cn.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# This filter is tested on:
-# http://www.lifeweek.com.cn/2012/1211/39439.shtml
-# http://www.lifeweek.com.cn/2013/0308/40213.shtml
-
-title:substring-before(//h1, '(')
-title://h1
-date://ul[@class='authorbox']/li
-author: substring-after(//ul[@class='authorbox']/li/following-sibling::li, '作者:')
-
-next_page_link: //div[@class='pageturn_list']/a[@class='pagedown']
-body: //div[@class='original ']
-
-strip://h1
-strip://ul[@class='authorbox']
-strip://span[@class='app_p']
-strip://div[@style='text-align:right;']
-strip://div[@class='pageturn_list']
-strip://div[@class='lifespeaks']
-strip://div[@class='vright fr']
-strip://div[@class='copyrt mg20']
-strip://div[@class='keyabout mg20']
-strip://ul[@class='readabout mg20']
-test_url: http://www.lifeweek.com.cn/2013/0308/40213.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/linkedin.com.txt b/data/GrabberConfig/linkedin.com.txt
deleted file mode 100644
index 37e83cf6..00000000
--- a/data/GrabberConfig/linkedin.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-single_page_link: //ul[@class='util-nav']//a[@class='close']
-test_url: http://www.linkedin.com/news?actionBar=&articleID=894735221&ids=0Rdj4Qe3wQejwIczAOc3sRdzwUb3wScPoPdzkVe2MNcz8RcPsQejwIcPASdjwTcjwU&aag=true&freq=weekly \ No newline at end of file
diff --git a/data/GrabberConfig/linuxjournal.com.txt b/data/GrabberConfig/linuxjournal.com.txt
deleted file mode 100644
index c5e64463..00000000
--- a/data/GrabberConfig/linuxjournal.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class='content-area']
-next_page_link: //a[@title='Go to next page']
-author: //a[@title='View user profile.']
-strip_id_or_class: comments
-
-test_url: http://www.linuxjournal.com/content/be-mechanicwith-android-and-linux
diff --git a/data/GrabberConfig/linuxnix.com.txt b/data/GrabberConfig/linuxnix.com.txt
deleted file mode 100644
index a920f72c..00000000
--- a/data/GrabberConfig/linuxnix.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.linuxnix.com%2Fhow-to-rotate-logs-manually-in-linux%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-single-content ')]
-strip_id_or_class: ts-fab-wrapper
-
-test_url: http://www.linuxnix.com/how-to-rotate-logs-manually-in-linux/
diff --git a/data/GrabberConfig/lithub.com.txt b/data/GrabberConfig/lithub.com.txt
deleted file mode 100644
index c630c43d..00000000
--- a/data/GrabberConfig/lithub.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post_wrapper_inner ')]//div[contains(concat(' ',normalize-space(@class),' '),' post_inner_wrapper ')]
-strip: //div[contains(concat(' ',normalize-space(@class),' '),' post_tag ')]
-
-test_url: http://lithub.com/why-indie-presses-are-opening-bookstores/
diff --git a/data/GrabberConfig/livescience.com.txt b/data/GrabberConfig/livescience.com.txt
deleted file mode 100644
index 5275d34a..00000000
--- a/data/GrabberConfig/livescience.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-title: //div[@class="album_title"]//h1
-author: substring-before(//div[@class='by_line'], ',')
-date: substring-after(substring-before(//div[@class="album_time"], ' Time'), 'Date: ')
-body: //div[@class="about_text"]
-
-strip: //div[@class='large_popper']
-strip: //span[contains(@id, 'mag_glass')]
-strip: //span[contains(@class, 'img_overlay')]
-strip: //td//span
-strip: //div[@class="center_adsense"]
-strip: //div[@class="article_info"]//div[@class='asset_section']
-strip: //div[@class="article_additional"]
-strip: //div[contains(@style, 'overflow:hidden')]
-strip: //div[@class="aa_text"]
-strip: //div[@id='nointelliTXT']
-
-prune: no
-autodetect_on_failure: no
-
-test_url: http://www.livescience.com/34569-why-flowers-close-at-night-nyctinasty.html
diff --git a/data/GrabberConfig/longform.org.txt b/data/GrabberConfig/longform.org.txt
deleted file mode 100644
index 1310ec0d..00000000
--- a/data/GrabberConfig/longform.org.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //div[@class="post"]/div[@class="title"]/a
-
-test_url: http://longform.org/2011/05/06/disconcerting-new-answers-in-models-suicide/ \ No newline at end of file
diff --git a/data/GrabberConfig/loopinsight.com.txt b/data/GrabberConfig/loopinsight.com.txt
deleted file mode 100644
index 730af947..00000000
--- a/data/GrabberConfig/loopinsight.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@class='container_16']//div[@class='grid_11']
-strip: //h2[@class='mast']
-strip: //div[@class='container_16']//div[@class='grid_11']/h1
-strip: //div[@class='container_16']//div[@class='grid_11']/p[1]
-strip: //div[@class='container_16']//div[@class='grid_11']/div
-author: //a[starts-with(@title, 'Posts by')]
-date: substring-before(substring-after(//time, 'Posted on '), ' at')
-test_url: http://www.loopinsight.com/2012/09/13/forget-iphone-5-naysayers-this-thing-is-big/
-test_url: http://www.loopinsight.com/2011/05/20/playbook-returns-high-misses-sales-targets-by-90/ \ No newline at end of file
diff --git a/data/GrabberConfig/lostgarden.com.txt b/data/GrabberConfig/lostgarden.com.txt
deleted file mode 100644
index d7eb0fa0..00000000
--- a/data/GrabberConfig/lostgarden.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-prune: no
-convert_double_br_tags: yes
-test_url: http://www.lostgarden.com/2012/04/loops-and-arcs.html \ No newline at end of file
diff --git a/data/GrabberConfig/lowtechmagazine.com.txt b/data/GrabberConfig/lowtechmagazine.com.txt
deleted file mode 100644
index 2588ac5f..00000000
--- a/data/GrabberConfig/lowtechmagazine.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.lowtechmagazine.com%2F2015%2F12%2Freinventing-the-greenhouse.html
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-inner ')]
-test_url: http://www.lowtechmagazine.com/2015/12/reinventing-the-greenhouse.html \ No newline at end of file
diff --git a/data/GrabberConfig/lrb.co.uk.txt b/data/GrabberConfig/lrb.co.uk.txt
deleted file mode 100644
index f1aacb7d..00000000
--- a/data/GrabberConfig/lrb.co.uk.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //div[contains(@class, "article-body")]/hgroup/h1
-body: //div[contains(@class, "article-body")]
-
-date: substring-after(//p[@class="meta-info"]/a, '· ')
-
-author: //div[contains(@class, "article-body")]/hgroup/h2
-
-strip_id_or_class: print-hide
-strip_id_or_class: books
-
-test_url: http://www.lrb.co.uk/v33/n18/james-meek/its-already-happened
-test_url: http://www.lrb.co.uk/v36/n13/benjamin-kunkel/paupers-and-richlings
diff --git a/data/GrabberConfig/luminous-landscape.com.txt b/data/GrabberConfig/luminous-landscape.com.txt
deleted file mode 100644
index b445f5eb..00000000
--- a/data/GrabberConfig/luminous-landscape.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2
-
-body: // div[@id='content']
-
-strip: //div[@class='sidebar_wrapper']
-test_url: http://www.luminous-landscape.com/tutorials/optimizing_exposure.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/lupa.cz.txt b/data/GrabberConfig/lupa.cz.txt
deleted file mode 100644
index 08833d42..00000000
--- a/data/GrabberConfig/lupa.cz.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-strip_id_or_class: promo-in-article
-
-test_url: http://www.lupa.cz/clanky/michal-zamec-parfums-za-dva-roky-presahneme-obrat-6-miliard-korun/ \ No newline at end of file
diff --git a/data/GrabberConfig/luxuo.com.txt b/data/GrabberConfig/luxuo.com.txt
deleted file mode 100644
index a3d5cb17..00000000
--- a/data/GrabberConfig/luxuo.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='post-content']
-prune: no
-
-test_url: http://www.luxuo.com/watches/feed \ No newline at end of file
diff --git a/data/GrabberConfig/lwn.net.txt b/data/GrabberConfig/lwn.net.txt
deleted file mode 100644
index fb1b7375..00000000
--- a/data/GrabberConfig/lwn.net.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# HTML5 anyone? The 1980s called, they want their HTML4 back.
-# LWN uses so little markup that you really have to be creative.
-
-tidy: yes
-prune: no
-
-single_page_link: //div[@class='ArticleText']//a[contains(text(), 'Full Story')]/@href
-single_page_link: concat(//div[@class='ArticleText']//a[contains(text(), 'Read more')]/@href, 'bigpage')
-if_page_contains: //div[@class='ArticleText']//a[contains(text(), 'Read more')]
-
-title: //h1
-
-# After tiding the document, <b> becomes <strong>.
-author: //div[@class='FeatureByline']/strong
-date: //div[@class='FeatureByline']/text()[preceding-sibling::br]
-strip: //div[@class='FeatureByline']
-author: substring-after(//div[@class='GAByline']/p[2], 'by ')
-date: //div[@class='GAByline']/p[1]
-strip: //div[@class='GAByline']
-
-# tidy will take care of fixing the tag mess that we make here.
-replace_string(<p class="Cat1HL">): <h1>
-replace_string(<h2 class="SummaryHL">): <h3>
-replace_string(<p class="Cat2HL">): <h2>
-
-# Make extracting the content before "Log in to post comments" easier.
-# And by "easier" I mean possible in all cases without going through
-# a lot of XPath pain.
-replace_string(<hr width="60%" align="left">): <div class="ftrss-strip">
-replace_string(to post comments)): </div>
-strip: //div[@class='ftrss-strip']
-body: //div[@class='ArticleText']
-strip: //table[@class='Form']
-
-test_url: http://lwn.net/Articles/668318/
-test_url: http://lwn.net/Articles/668695/
-test_url: http://lwn.net/Articles/669114/
-test_url: http://lwn.net/Articles/670209/
-test_url: http://lwn.net/Articles/670209/rss
-test_url: http://lwn.net/Articles/668318/rss
-test_url: http://lwn.net/Articles/670062/
diff --git a/data/GrabberConfig/m.bbc.co.uk.txt b/data/GrabberConfig/m.bbc.co.uk.txt
deleted file mode 100644
index 7037c64b..00000000
--- a/data/GrabberConfig/m.bbc.co.uk.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //div[@class="story-body"]/div[@class="story-inner"]/h1
-body: //div[@class="story-body"]
-date: //p[@class='date']/strong
-author: substring-after(//div[@class="story-inner"]/div[@class="byline"]//span[@class='name'], 'By')
-
-find_string: http://ichef.bbci.co.uk/news/200/
-replace_string: http://ichef.bbci.co.uk/news/624/
-
-find_string: http://ichef.bbci.co.uk/news/304/
-replace_string: http://ichef.bbci.co.uk/news/624/
-
-strip: //div[@class="story-inner"]/div[@class="byline"]
-
-test_url: http://m.bbc.co.uk/news/science-environment-19144464 \ No newline at end of file
diff --git a/data/GrabberConfig/m.douban.com.txt b/data/GrabberConfig/m.douban.com.txt
deleted file mode 100644
index ce9a3167..00000000
--- a/data/GrabberConfig/m.douban.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# This filter is tested on:
-# http://m.douban.com/note/240776310/?session=6ac86d1e
-# http://m.douban.com/note/208270705/?session=e00ec732_3433229
-
-title: //h2
-author: //a[@class='founder']
-date: substring-after(//span[@class='info'],' | ')
-body: //div[contains(@class,'entry item')]
-
-strip://span[contains(@class,'info')]
-
-convert_double_br_tags: yes
-test_url: http://m.douban.com/note/240776310/?session=6ac86d1e \ No newline at end of file
diff --git a/data/GrabberConfig/m.facebook.com.txt b/data/GrabberConfig/m.facebook.com.txt
deleted file mode 100644
index 81d2b00e..00000000
--- a/data/GrabberConfig/m.facebook.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //div[@id='m_story_permalink_view' or contains(@data-sigil, 'm-story-view')]
-
-title: //div[@id='m_story_permalink_view' or contains(@data-sigil, 'm-story-view')]//h3
-
-strip_id_or_class: commentable
-strip: //*[contains(@data-sigil, 'm-mentions-expand') or contains(@data-sigil, 'story-popup-context') or contains(@data-sigil, 'share') or contains(@data-sigil, 'translate')]
-
-prune: no
-tidy: no
-
-test_url: https://m.facebook.com/permalink.php?story_fbid=10154584776550183&id=294468630182
-test_contains: holding an extraordinary session in Brussels this month
diff --git a/data/GrabberConfig/m.theregister.co.uk.txt b/data/GrabberConfig/m.theregister.co.uk.txt
deleted file mode 100644
index 64cb1c32..00000000
--- a/data/GrabberConfig/m.theregister.co.uk.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-strip: //div[@class='wptl btm']
-body: //div[@id='article']//h2 | //div[@id='body']
-
-test_url: http://m.theregister.co.uk/2015/07/06/geeks_guide_spaceguard_center/
diff --git a/data/GrabberConfig/m.vanityfair.com.txt b/data/GrabberConfig/m.vanityfair.com.txt
deleted file mode 100644
index e47ce2ce..00000000
--- a/data/GrabberConfig/m.vanityfair.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# Article Metadata
-title: //h1
-author: //span[@class="name"]/a
-date: //time
-
-# Content Pruning
-strip: //h5
-strip: //time
-strip: //div[@class="byline"]
-strip: //h2[@class="headline "]
-test_url: http://m.vanityfair.com/politics/2012/10/michael-lewis-profile-barack-obama \ No newline at end of file
diff --git a/data/GrabberConfig/m00natic.github.io.txt b/data/GrabberConfig/m00natic.github.io.txt
deleted file mode 100644
index 911fcbd0..00000000
--- a/data/GrabberConfig/m00natic.github.io.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fm00natic.github.io%2Femacs%2Femacs-wiki.html
-
-body: //div[@id='content']
-strip_id_or_class: table-of-contents
-test_url: https://m00natic.github.io/emacs/emacs-wiki.html \ No newline at end of file
diff --git a/data/GrabberConfig/mac4ever.com.txt b/data/GrabberConfig/mac4ever.com.txt
deleted file mode 100644
index 87e3c3d8..00000000
--- a/data/GrabberConfig/mac4ever.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.mac4ever.com%2Factu%2F104137_kim-kardashian-et-ses-soeurs-etaient-a-l-apple-store-de-soho-pour-presenter-leur-nouvelle-app
-
-author: //meta[@name="author"]/@content
-date: //meta[@itemprop="datePublished"]/@content
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' news-news-content ')]
-test_url: http://www.mac4ever.com/actu/104137_kim-kardashian-et-ses-soeurs-etaient-a-l-apple-store-de-soho-pour-presenter-leur-nouvelle-app
diff --git a/data/GrabberConfig/macdrifter.com.txt b/data/GrabberConfig/macdrifter.com.txt
deleted file mode 100644
index e57bd640..00000000
--- a/data/GrabberConfig/macdrifter.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: substring-before(//title,' « Macdrifter')
-test_url: http://www.macdrifter.com/2012/03/instacast-on-my-mac/ \ No newline at end of file
diff --git a/data/GrabberConfig/macg.co.txt b/data/GrabberConfig/macg.co.txt
deleted file mode 100644
index 67d240ee..00000000
--- a/data/GrabberConfig/macg.co.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.macg.co%2Faapl%2F2015%2F09%2Ftim-cook-rassure-sur-lavenir-du-mac-90957
-
-date: //time[@itemprop="datePublished"]/@datetime
-
-strip: //div[contains(concat(' ',normalize-space(@class),' '),' plusLoin ')]
-strip: //select
-
-body: //section[contains(concat(' ',normalize-space(@class),' '),' corps ')]
-test_url: http://www.macg.co/aapl/2015/09/tim-cook-rassure-sur-lavenir-du-mac-90957
diff --git a/data/GrabberConfig/macgeneration.com.txt b/data/GrabberConfig/macgeneration.com.txt
deleted file mode 100644
index 739eff4e..00000000
--- a/data/GrabberConfig/macgeneration.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: substring-before(substring-after(//div[@class='dateNews'],'par '),' le')
-date: substring-after(//div[@class='dateNews'],' le ')
-body: //div[@class='singleNews zoneApple']
-
-test_url: http://www.macgeneration.com/news/voir/211162/dropbox-encore-un-mac-et-deux-comptes-dropbox \ No newline at end of file
diff --git a/data/GrabberConfig/macmagazine.com.br.txt b/data/GrabberConfig/macmagazine.com.br.txt
deleted file mode 100644
index da7df695..00000000
--- a/data/GrabberConfig/macmagazine.com.br.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# Remove sliders
-strip: //*[(@class="slides_container")]
-strip: //div[(@id="slides_two")]
-
-# Remove tag cloud
-strip: //span[(@class="secao")]
-
-# Fix date article
-# TODO
-
-# Remove other stuff
-strip: //div[(@id="idc-container")]
-strip: //div[(@id="idc-noscript")]
-strip: //div[(@class="linkwithin_div")]
-strip: //div[(@class="navPosts")]
-strip: //div[(@id="lateral")]
-strip: //div[(@id="autor")]
-strip: //div[(@id="rodape")]
-strip: //div[(@id="post")]/h1
-strip: //div[(@id="post")]/div[(@id="boxInformacoes")]
-test_url: http://macmagazine.com.br/2011/08/01/skype-para-ipad-esta-finalmente-chegando-a-app-store/ \ No newline at end of file
diff --git a/data/GrabberConfig/macrumors.com.txt b/data/GrabberConfig/macrumors.com.txt
deleted file mode 100644
index 83cfb4a6..00000000
--- a/data/GrabberConfig/macrumors.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-author: substring-after(//div[@class='byline'], " by ")
-date: substring-before(//div[@class='byline'], " by ")
-
-# set body
-body: //div[@class='content']
-strip_id_or_class: commentsContainer
-strip_id_or_class: linkback
-
-# set title
-title: //h3
-#strip: //div[@class='content']/h3
-test_url: http://www.macrumors.com/2010/11/10/apple-debuts-new-apple-tv-and-itunes-movie-content-in-japan/
diff --git a/data/GrabberConfig/macstories.net.txt b/data/GrabberConfig/macstories.net.txt
deleted file mode 100644
index 639fdd19..00000000
--- a/data/GrabberConfig/macstories.net.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-strip: //*[(@id = "featured")]
-
-author:substring-after( //div[@class='posttitle']/h2[@class='author'],'by ')
-
-date: concat(//div[@class='month'],' ',//div[@class='day'])
-
-#macstories doesn't provide a year, but month/day is better than nothing
-test_url: http://www.macstories.net/news/instapaper-4-0-available-completely-redesigned-ipad-ui-new-features-search-subscription/ \ No newline at end of file
diff --git a/data/GrabberConfig/mactalk.com.au.txt b/data/GrabberConfig/mactalk.com.au.txt
deleted file mode 100644
index 9be865af..00000000
--- a/data/GrabberConfig/mactalk.com.au.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author://div[@class="article_username_container_full"]
-date://div[@class="article_username_container"]
-body://div[@class="article cms_clear restore postcontainer"]
-test_url: http://www.mactalk.com.au/content/chat-basil-shkara-developer-taptax-2452/ \ No newline at end of file
diff --git a/data/GrabberConfig/mactechnews.de.txt b/data/GrabberConfig/mactechnews.de.txt
deleted file mode 100644
index 5c03518a..00000000
--- a/data/GrabberConfig/mactechnews.de.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: substring-after(substring-after(//title, '>'), '>')
-body: //div[@class='NewsArticleContent']
-test_url: http://www.mactechnews.de/news/index/Apple-Pressekonferenz-zum-iPhone-4-147316.html \ No newline at end of file
diff --git a/data/GrabberConfig/macworld.com.txt b/data/GrabberConfig/macworld.com.txt
deleted file mode 100644
index e7d97202..00000000
--- a/data/GrabberConfig/macworld.com.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-title: //article//h1
-date: //meta[@name="date"]/@content
-author: //div[@class="author-name" or @class="article-byline"]/a[1]
-
-body: //section[@class="page"]
-
-# remove 'From the Lab' and 'Recent posts' text
-strip: //div[@class='blogLabel']
-
-# remove byline and meta info
-strip: //div[@class="article-meta"]
-strip: //div[@class="author-info"]
-
-#strip tags and categories
-strip: //div[@class="department"]
-
-#strip product cap links
-strip: //div[@class="cap-main"]
-strip: //div[@id="compare-lede"]
-
-prune: no
-
-# copes less well with Review pages, seems fine for News
-test_url: http://www.macworld.com/article/163184/2011/10/the_ipod_as_an_iconic_cultural_force.html \ No newline at end of file
diff --git a/data/GrabberConfig/mainpost.de.txt b/data/GrabberConfig/mainpost.de.txt
deleted file mode 100644
index 2f6382f1..00000000
--- a/data/GrabberConfig/mainpost.de.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-title: substring-before(//title, '|')
-body: //*[@id='content-left']
-
-# Why is this not working here?
-# body: //*[@id='content-left']/div[@class='content-container'][2]/div[@class='content-body']/div[@class='inner-container']/div[@class='detail']
-
-
-#Header
-strip_id_or_class: 'subHead'
-strip_id_or_class: 'fl_right'
-strip_id_or_class: 'infolink'
-strip_id_or_class: 'content-head'
-strip_id_or_class: 'tab'
-strip_id_or_class: 'tab-active'
-strip: //*[contains(@class,'trenner')]
-
-# Headline
-strip: //h1/*
-strip_id_or_class: 'font16'
-
-#Images
-strip_id_or_class: 'leftimage'
-strip_id_or_class: 'rightimage'
-
-#Comments
-strip: //table
-strip: //p/following-sibling::*[0]
-test_url: http://www.mainpost.de/regional/wuerzburg/Autobahnschuetze-Staatsanwalt-fordert-zwoelf-Jahre;art492151,8386332
diff --git a/data/GrabberConfig/makeuseof.com.txt b/data/GrabberConfig/makeuseof.com.txt
deleted file mode 100644
index 078e8d08..00000000
--- a/data/GrabberConfig/makeuseof.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1[@class='entry-title']
-
-body: //article//header//img | //article//section[@class='post']
-
-strip: //article//section[@class='post']/aside
-strip: //article//section[@class='post']/footer
-
-test_url: http://www.makeuseof.com/tag/cool-websites-and-tools-advanced-photo-editor-keep-your-kids-stuff-online-identify-60-languages/
-test_url: http://www.makeuseof.com/tag/what-do-you-think-of-our-new-look-makeuseof-poll/
diff --git a/data/GrabberConfig/manager.co.th.txt b/data/GrabberConfig/manager.co.th.txt
deleted file mode 100644
index cd6c5c01..00000000
--- a/data/GrabberConfig/manager.co.th.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-title: //td[@class="headline"]
-author: //font[@color="#003366"]
-date: //td[@class="date"]
-
-strip: //td[@class="headline"]
-strip: //font[@color="#003366"]
-strip: //td[@class="date"]
-
-strip: //img[@src="images/2009/logo_en.gif"]
-
-body: //tbody[@class="body"]
-convert_double_br_tags:yes
-
-strip: //img[@src="/images/TabOver.gif"]
-strip: //td[@width="160"]
-strip: //img[@src="/images/TabUnder.gif"]
-
-strip: //td[@class="small"]
-strip: //td[@height="47"]
-
-strip: //td[@valign="middle"]
-strip: //td[@background="/images/menu_bottombg.gif"]
-strip: //img[@src="/images/sc_footer_l.gif"]
-strip: //img[@src="/images/sc_footer_m.gif"]
-strip: //img[@src="/images/sc_footer_r.gif"]
-test_url: http://www.manager.co.th/Entertainment/ViewNews.aspx?NewsID=9550000101979 \ No newline at end of file
diff --git a/data/GrabberConfig/manga-news.com.txt b/data/GrabberConfig/manga-news.com.txt
deleted file mode 100644
index 2fc54643..00000000
--- a/data/GrabberConfig/manga-news.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h2[@class='actu-title']
-
-body: //div[@class='actu-content']
-
-prune: no
-
-test_url: http://www.manga-news.com/index.php/actus/2016/02/02/Deux-retours-dans-le-planning-des-editions-Pika
diff --git a/data/GrabberConfig/marco.org.txt b/data/GrabberConfig/marco.org.txt
deleted file mode 100644
index 4bb24a62..00000000
--- a/data/GrabberConfig/marco.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-tidy: no
-prune: no
-date: //article//time[@pubdate]
-title: //article/header/h2
-body: //article
-strip: //header
-test_url: http://www.marco.org/2012/09/08/businessweek-gruber
-test_url: http://www.marco.org/2012/04/24/might-upgrade-someday \ No newline at end of file
diff --git a/data/GrabberConfig/marketingmag.com.au.txt b/data/GrabberConfig/marketingmag.com.au.txt
deleted file mode 100644
index 910741f3..00000000
--- a/data/GrabberConfig/marketingmag.com.au.txt
+++ /dev/null
@@ -1 +0,0 @@
-strip: //h3[@class="related-posts"]
diff --git a/data/GrabberConfig/marksdailyapple.com.txt b/data/GrabberConfig/marksdailyapple.com.txt
deleted file mode 100644
index 0077f560..00000000
--- a/data/GrabberConfig/marksdailyapple.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip_id_or_class: wwsgd
-test_url: http://www.marksdailyapple.com/are-detoxes-and-cleanses-safe-and-effective/ \ No newline at end of file
diff --git a/data/GrabberConfig/martinfowler.com.txt b/data/GrabberConfig/martinfowler.com.txt
deleted file mode 100644
index 4ff4a9c2..00000000
--- a/data/GrabberConfig/martinfowler.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-date: //div[@id="main"]/p[@class="date"]
-author: string("Martin Fowler")
-body: //div[@id="main"]
-strip_id_or_class: date
-strip_id_or_class: tags
-strip_id_or_class: tagLabel
-strip: //div[@id="main"]/h1[1]
-test_url: http://martinfowler.com/bliki/DatabaseThaw.html \ No newline at end of file
diff --git a/data/GrabberConfig/mashable.com.txt b/data/GrabberConfig/mashable.com.txt
deleted file mode 100644
index b6efb6c5..00000000
--- a/data/GrabberConfig/mashable.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[@class='title']
-author: substring-after(//span[@class='author_name'], 'By ')
-date: //time
-
-body: //article
-strip: //div[@class='ytm-gallery-box']
-strip: //div[contains(@class, 'adsense')]
-strip: //aside[contains(@class, 'social')]
-strip_id_or_class: article-topics
-
-test_url: http://mashable.com/2013/05/24/myspace-architects-rebuilding-a-brand/
diff --git a/data/GrabberConfig/matt.might.net.txt b/data/GrabberConfig/matt.might.net.txt
deleted file mode 100644
index 30d585cf..00000000
--- a/data/GrabberConfig/matt.might.net.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1
-author: string("Matt Might")
-strip: //h1/following-sibling::div
-
-test_url: http://matt.might.net/articles/oo-cesk/ \ No newline at end of file
diff --git a/data/GrabberConfig/mattcutts.com.txt b/data/GrabberConfig/mattcutts.com.txt
deleted file mode 100644
index 76b1eac6..00000000
--- a/data/GrabberConfig/mattcutts.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-date: //*[@class = 'published']
-test_url: http://www.mattcutts.com/blog/internet-censorship-sopa/ \ No newline at end of file
diff --git a/data/GrabberConfig/maxim.com.txt b/data/GrabberConfig/maxim.com.txt
deleted file mode 100644
index 344866cf..00000000
--- a/data/GrabberConfig/maxim.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[contains(@class, 'field-name-body') or contains(@class, 'featured-image')]
-
-test_url: http://www.maxim.com/rss-feeds.xml
-test_url: http://www.maxim.com/entertainment/article/second-city-chicago-goes-flames \ No newline at end of file
diff --git a/data/GrabberConfig/mbl.is.txt b/data/GrabberConfig/mbl.is.txt
deleted file mode 100644
index fd26f091..00000000
--- a/data/GrabberConfig/mbl.is.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[class="frett-main"]
-test_url: http://mbl.is/frettir/innlent/2012/02/21/litill_munur_a_fargjaldaverdi/ \ No newline at end of file
diff --git a/data/GrabberConfig/medialens.org.txt b/data/GrabberConfig/medialens.org.txt
deleted file mode 100644
index c26bac55..00000000
--- a/data/GrabberConfig/medialens.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip_id_or_class: article-tools
-strip_id_or_class: pagenav
-prune: no
-test_url: http://www.medialens.org/index.php/alerts/alert-archive/2012/713-the-illusion-of-democracy.html
-test_contains: In an era of permanent war, economic meltdown
diff --git a/data/GrabberConfig/medium.com.txt b/data/GrabberConfig/medium.com.txt
deleted file mode 100644
index 2c969c0a..00000000
--- a/data/GrabberConfig/medium.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-body: //main[contains(@class, 'postArticle-content')]
-body: //div[contains(@class, 'postArticle-content')]
-body: //div[contains(@class, 'section-inner')]
-strip_id_or_class: supplementalPostContent
-
-parser: html5php
-
-tidy: no
-prune: no
-
-test_url: https://medium.com/@savolai/kaytettavyyden-haasteet-keskustelukulttuurista-2-3-6844c0d7893b
-test_contains: Jos käytettävyysongelmat ovat kerran niin tyypillisiä
-test_contains: Keskustelukulttuuriongelmasta (subjective vs. objective bugs)
-
-test_url: https://medium.com/health-the-future/thirty-things-ive-learned-482765ee3503
-test_contains: Remember you will die
-test_contains: You have to have some faith.
diff --git a/data/GrabberConfig/megamp3.eu.txt b/data/GrabberConfig/megamp3.eu.txt
deleted file mode 100644
index 1b6a1279..00000000
--- a/data/GrabberConfig/megamp3.eu.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h3[@class='episode_title']
-body: //ul[contains(@class, 'episode_imgdesc')]/li/descendant::*
-prune: no
-strip://*[contains(@class, 'plugin')]
-strip://*[contains(@class, 'episode_keywords')]
-
-test_url: http://www.megamp3.eu/?p=episode&name=2013-04-19_la_filiere_progressive_431.mp3
-test_url: http://www.megamp3.eu/feed.xml
diff --git a/data/GrabberConfig/menshealth.com.sg.txt b/data/GrabberConfig/menshealth.com.sg.txt
deleted file mode 100644
index af450b5e..00000000
--- a/data/GrabberConfig/menshealth.com.sg.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-strip: //div[contains(@style, 'float:right') and contains(., 'advertisement')]
-body: //div[@style="float:left;width:740px;"]
-
-tidy: no
-
-# broken feed?
-test_url: http://www.menshealth.com.sg/fitness/feed
diff --git a/data/GrabberConfig/menshealth.com.txt b/data/GrabberConfig/menshealth.com.txt
deleted file mode 100644
index a1a46f63..00000000
--- a/data/GrabberConfig/menshealth.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# need to find a way to eliminate <span> content for "related content" without eliminating important content
-
-convert_double_br_tags: [yes]
-#body: //div[@id='leftside']
-title: //h1
-title: //h2
-Author: substring-after(//h4, 'By ')
-Author: substring-after(//h4, 'By: ')
-#Strip: //span
-strip_id_or_class: morefromcat
-strip_id_or_class: mostpopular
-strip_id_or_class: articlepagination
-strip_id_or_class: toolbar
-body: //div[@id='zmodcontent']
-single_page_link: //li[@class='onepage'] //a[contains (@href, 'printer.php')]
-test_url: http://www.menshealth.com/mhlists/pursuit_of_happiness/index.php \ No newline at end of file
diff --git a/data/GrabberConfig/mesec.cz.txt b/data/GrabberConfig/mesec.cz.txt
deleted file mode 100644
index 2a6b84fc..00000000
--- a/data/GrabberConfig/mesec.cz.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='urs'] | //div[@itemprop='articleBody']
-strip_id_or_class: promo-in-article
-
-test_url: www.mesec.cz/aktuality/ceske-drahy-pridaji-zamestnancum-jejich-mzdy-vzrostou-o-1-7/ \ No newline at end of file
diff --git a/data/GrabberConfig/metafilter.com.txt b/data/GrabberConfig/metafilter.com.txt
deleted file mode 100644
index a2f3ada9..00000000
--- a/data/GrabberConfig/metafilter.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[contains(@class, 'copy') or contains(@class, 'comments')]
-strip_id_or_class: related
-strip: //a[. = 'Subscribe']
-strip: //h1/span[@class = 'smallcopy']
-strip: //a[@class = 'skip']
-strip: //div[@id = 'logo']
-strip: //div[contains(@class, 'comments') and contains(., 'You are not currently logged in')]
-test_url: http://www.metafilter.com/128101/Probably-more-secure-than-the-Drafts-folder-on-a-shared-Gmail-account \ No newline at end of file
diff --git a/data/GrabberConfig/metrocop.net.txt b/data/GrabberConfig/metrocop.net.txt
deleted file mode 100644
index 9535f125..00000000
--- a/data/GrabberConfig/metrocop.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fmetrocop.net%2Fmythic-comics%2Fissue-1%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry ')]
-test_url: http://metrocop.net/mythic-comics/issue-1/
diff --git a/data/GrabberConfig/mforum.cari.com.my.txt b/data/GrabberConfig/mforum.cari.com.my.txt
deleted file mode 100644
index c295d734..00000000
--- a/data/GrabberConfig/mforum.cari.com.my.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: (//td[starts-with(@id, 'postmessage_')])[1]
-
-prune: no
-
-test_url: http://mforum.cari.com.my/forum.php?mod=viewthread&tid=788033
-test_url: http://mforum.cari.com.my/forum.php?mod=rss&fid=265&auth=0 \ No newline at end of file
diff --git a/data/GrabberConfig/mikeash.com.txt b/data/GrabberConfig/mikeash.com.txt
deleted file mode 100644
index abaa6a81..00000000
--- a/data/GrabberConfig/mikeash.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@class="blogtitle"]
-strip: //div[@class="blogtitle"]
-
-author: substring-after(//span[@class="blogheader"], 'Author: ')
-test_url: http://www.mikeash.com/pyblog/friday-qa-2012-01-13-the-mac-toolbox.html \ No newline at end of file
diff --git a/data/GrabberConfig/mikeindustries.com.txt b/data/GrabberConfig/mikeindustries.com.txt
deleted file mode 100644
index fb4636cc..00000000
--- a/data/GrabberConfig/mikeindustries.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@class='post_content']/h2
-date: //div[@class='dateline']
-body: //div[@class='entry']
-
-strip: //div[@class='closer']
-strip: //div[@class='navigation']
-strip: //div[@class='aux_pane']
-strip: //div[@class='aux_aux_pane']
-test_url: http://www.mikeindustries.com/blog/archive/2011/10/never-be-another \ No newline at end of file
diff --git a/data/GrabberConfig/minnesota.publicradio.org.txt b/data/GrabberConfig/minnesota.publicradio.org.txt
deleted file mode 100644
index 773a627c..00000000
--- a/data/GrabberConfig/minnesota.publicradio.org.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //*[@class="article"]/h1
-date: //*[@class="article"]/div[@class="date"]
-
-# strip the title and date from the article text
-strip: //*[@class="article"]/h1
-strip: //*[@class="article"]/div[@class="date"]
-
-# strip annoying <br> between metadata and article
-strip: //*[@class="article"]/div[@class="date"]/following-sibling::br
-test_url: http://minnesota.publicradio.org/display/web/2012/06/19/health/senators-want-health-care-ruling-on-tv/ \ No newline at end of file
diff --git a/data/GrabberConfig/minnpost.com.txt b/data/GrabberConfig/minnpost.com.txt
deleted file mode 100644
index dc926a6f..00000000
--- a/data/GrabberConfig/minnpost.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //*[@id="content-header"]/h1
-author: //*[contains(@class, 'byline')]/a/text()
-date: substring-after(//*[contains(@class, 'byline')]/text()[2], '|')
-body: //*[contains(@class, 'node-body')]
-test_url: http://www.minnpost.com/eric-black-ink/2012/06/overturning-obamacare-would-be-game-changer-supreme-court \ No newline at end of file
diff --git a/data/GrabberConfig/mirrorfootball.co.uk.txt b/data/GrabberConfig/mirrorfootball.co.uk.txt
deleted file mode 100644
index 2033cf33..00000000
--- a/data/GrabberConfig/mirrorfootball.co.uk.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# Remove extra links
-strip: //*[@class='appended_html']
-test_url: http://www.mirrorfootball.co.uk/news/West-Ham-crisis-Carlton-Cole-slams-diabolical-performance-and-rips-into-Avram-Grant-lack-of-tactical-nous-following-Liverpool-mauling-article636151.html \ No newline at end of file
diff --git a/data/GrabberConfig/mises.org.txt b/data/GrabberConfig/mises.org.txt
deleted file mode 100644
index 73c485e6..00000000
--- a/data/GrabberConfig/mises.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip_id_or_class: 'book-ad'
-strip_id_or_class: 'bigger pullquote'
-strip_id_or_class: 'subscribe'
-strip_id_or_class: 'blog-link'
-test_url: http://mises.org/daily/4804 \ No newline at end of file
diff --git a/data/GrabberConfig/mitchellrepublic.com.txt b/data/GrabberConfig/mitchellrepublic.com.txt
deleted file mode 100644
index fae858a3..00000000
--- a/data/GrabberConfig/mitchellrepublic.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='section']
-strip_id_or_class: mediumtxt
-strip: //strong[contains
diff --git a/data/GrabberConfig/mlb.mlb.com.txt b/data/GrabberConfig/mlb.mlb.com.txt
deleted file mode 100644
index 765fab3f..00000000
--- a/data/GrabberConfig/mlb.mlb.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //h1[@class='article-headline']
-date: //span[@class='timeStamp']
-author: substring-before(//p[@class='article-byline'], '/')
-body: //div[@id='article']
-#strip: //div[@class='inner']
-strip: //div[@id='article_head']
-strip: //p[@class='tagLine']
-strip: //div[@id='article_related_links']
-strip: //div[@id='article_related_mlb']
-strip: //span[@class='more']
-strip: //div[@class='article_component']
-strip: //span[@class='screen_reader']
-strip: //ul[@class='columnists_blurb']
-test_url: http://mlb.mlb.com/news/article.jsp?ymd=20120403&content_id=27880830 \ No newline at end of file
diff --git a/data/GrabberConfig/mlb.sbnation.com.txt b/data/GrabberConfig/mlb.sbnation.com.txt
deleted file mode 100644
index 8480e302..00000000
--- a/data/GrabberConfig/mlb.sbnation.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //h1[@id = 'stream_title']
-author: //p[@class = 'byline']/a
-date: //span[@class = 'datetime']
-
-body: //div[@id = 'stream_container']
-strip: //p[@class = 'byline']
-strip_id_or_class: stream_summary
-strip_id_or_class: social-spoken
-strip_id_or_class: datetime
-strip_id_or_class: author-mini-profile
-strip_id_or_class: social-tools
-strip_id_or_class: entry-tags
-strip_id_or_class: fb-like-box
-test_url: http://mlb.sbnation.com/2011/10/17/2495845/2011-world-series-st-louis-cardinals-texas-rangers-home-field-advantage \ No newline at end of file
diff --git a/data/GrabberConfig/mlssoccer.com.txt b/data/GrabberConfig/mlssoccer.com.txt
deleted file mode 100644
index 5d706f88..00000000
--- a/data/GrabberConfig/mlssoccer.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //*[@class="header_title"]/h1
-date: //*[@class="field-date"]
-author: //*[@class="field-author"]
-body: //div[contains(@class, 'content')]
-
-test_url: http://www.mlssoccer.com/news/article/2012/06/19/lack-depth-front-forces-arena-alter-las-formation \ No newline at end of file
diff --git a/data/GrabberConfig/mmo-champion.com.txt b/data/GrabberConfig/mmo-champion.com.txt
deleted file mode 100644
index 50d8a24f..00000000
--- a/data/GrabberConfig/mmo-champion.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1
-body: //div[@id = 'article_content']/div[contains(@class,'article')]
-author: //sub[@class = 'article_promoted_text']/a[starts-with(@href, 'member')]
-date: //div[@class = 'article_username_container']
-test_url: http://www.mmo-champion.com/content/2688-Other-Press-Tour-Interviews-A-Night-in-Mists-of-Pandaria-Blue-Posts-MoP-Screenshot \ No newline at end of file
diff --git a/data/GrabberConfig/mnn.com.txt b/data/GrabberConfig/mnn.com.txt
deleted file mode 100644
index d3576df2..00000000
--- a/data/GrabberConfig/mnn.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-tidy: no
-author: //div[@id="above-content"]//img/@alt | //div[@class="comment-auth"]/span[1]/a/text()
-date: //div[@class="comment-auth"]/div | //div[@class="comment-auth"]/span[2]
-body: //div[@class="node"]
-
-strip_id_or_class: vertical-social-bar
-strip_id_or_class: blogs_paginator
-strip_id_or_class: horizontal-social-links
-strip_id_or_class: servicelinksdiv
-
-test_url: http://www.mnn.com/green-tech/research-innovations/blogs/5-breakthroughs-that-will-make-solar-power-cheaper-than-coal \ No newline at end of file
diff --git a/data/GrabberConfig/mno.hu.txt b/data/GrabberConfig/mno.hu.txt
deleted file mode 100644
index 8a3f9391..00000000
--- a/data/GrabberConfig/mno.hu.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //title
-
-author: //div[@class="author"]
-
-strip_id_or_class: 'header'
-strip_id_or_class: 'cikk_ajanlo'
-strip_id_or_class: 'buttons'
-strip_id_or_class: 'related'
-strip_id_or_class: 'adbox ad_cikk_kozepre'
-strip_id_or_class: 'cikk-cimkek'
-strip_id_or_class: 'cikk_ertekeles'
-
-strip_comments: yes
-test_url: http://mno.hu/grund/a-gumibottal-hadonaszo-rendort-joval-konnyebb-utalni-1055351 \ No newline at end of file
diff --git a/data/GrabberConfig/mobile.nytimes.com.txt b/data/GrabberConfig/mobile.nytimes.com.txt
deleted file mode 100644
index 3dcbdf46..00000000
--- a/data/GrabberConfig/mobile.nytimes.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1[contains(@class, 'headline')]
-body: //article[contains(@class, 'full-art')]
-date: //meta[@name="pdate"]/@content
-author: //meta[@name="byl"]/@content
-
-tidy: no
-
-strip_id_or_class: image-credit
-test_url: http://mobile.nytimes.com/2014/06/19/opinion/gail-collins-romney-and-the-2016-contenders-huddle.html
diff --git a/data/GrabberConfig/mobile.twitter.com.txt b/data/GrabberConfig/mobile.twitter.com.txt
deleted file mode 100644
index 110df847..00000000
--- a/data/GrabberConfig/mobile.twitter.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# mobile site (automatic redirect - noscript meta refresh)
-author: (//*[contains(@class, 'UserNames-displayName') or contains(@class, 'fullname')])[1]
-body: (//div[contains(@class, 'TweetDetail-text') or contains(@class, 'tweet-text')])[1]
-date: (//div[contains(@class, 'TweetDetail-timeAndGeo') or contains(@class, 'metadata')])[1]
-
-parser: html5php
-
-prune: no
-tidy: yes
-
-test_url: https://mobile.twitter.com/medialens/status/216883678582804480
-test_contains: is all but alone in challenging the tsunami of UK
diff --git a/data/GrabberConfig/mobilenet.cz.txt b/data/GrabberConfig/mobilenet.cz.txt
deleted file mode 100644
index be908614..00000000
--- a/data/GrabberConfig/mobilenet.cz.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-next_page_link: //a[@class='nextChapter']
-
-test_url: http://mobilenet.cz/clanky/recenze-apple-ipad-pro-tesne-pod-vrcholem-28955 \ No newline at end of file
diff --git a/data/GrabberConfig/mobileopportunity.blogspot.com.txt b/data/GrabberConfig/mobileopportunity.blogspot.com.txt
deleted file mode 100644
index 82da4aec..00000000
--- a/data/GrabberConfig/mobileopportunity.blogspot.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@class='post uncustomized-post-template']
-
-# remove duplicate of post title, which is a link
-strip: //h3[@class='post-title']
-
-# remove permalink and timestamp, which isn't useful as it's a time with no date
-strip: //span[@class='post-timestamp']
-
-# remove labels (tags)
-strip: //span[@class='post-labels']
-test_url: http://mobileopportunity.blogspot.com/2010/12/rims-q3-financials-tale-of-two.html \ No newline at end of file
diff --git a/data/GrabberConfig/mobilmania.cz.txt b/data/GrabberConfig/mobilmania.cz.txt
deleted file mode 100644
index f2c571c9..00000000
--- a/data/GrabberConfig/mobilmania.cz.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //*[@class='ar-annotation'] | //div[contains(@class='ar-content')]
-strip_id_or_class: ar-link-to-another
-strip_id_or_class: ar-tags
-next_page_link: //a[@data-tracker='Navigace,NextChapter']
-
-test_url: http://www.mobilmania.cz/clanky/10-tipu-na-nejlepsi-tablet-pod-stromecek-vanoce-2015/sc-3-a-1332803/default.aspx
-test_url: http://www.mobilmania.cz/clanky/tyden-mobilne-311-kyklop-od-asusu-a-fenomen-5g/sc-3-a-1332804/default.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/modernghana.com.txt b/data/GrabberConfig/modernghana.com.txt
deleted file mode 100644
index 306ef8d9..00000000
--- a/data/GrabberConfig/modernghana.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //meta[@property="og:title"]/@content
-author: //meta[@name="author"]/@content
-date: //span[@class='date1']
-body: //div[@id='newsimage'] | //div[@id='bodytext']
-tidy: no
-prune: no
-
-test_url: http://www.modernghana.com/news/323765/1/039ghost039-teachers-removed-salaries-allowances-p.html \ No newline at end of file
diff --git a/data/GrabberConfig/momentumsaga.com.txt b/data/GrabberConfig/momentumsaga.com.txt
deleted file mode 100644
index 83c29884..00000000
--- a/data/GrabberConfig/momentumsaga.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[contains(concat(' ',normalize-space(@class),' '),' post-header ')]//h1
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-entry ')]
-date: //span[contains(concat(' ',normalize-space(@class),' '),' date ')
-
-test_url: http://www.momentumsaga.com/2015/03/meus-dez-livros-preferidos-de-ficcao-cientifica.html
diff --git a/data/GrabberConfig/money.cnn.com.txt b/data/GrabberConfig/money.cnn.com.txt
deleted file mode 100644
index d5e03d20..00000000
--- a/data/GrabberConfig/money.cnn.com.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-title: //meta[@property="og:title"]/@content
-title: //h1[@class='storyheadline']
-author: //meta[@name="AUTHOR"]/@content
-date: //span[@class='cnnDateStamp']
-date: //meta[@name="DATE"]/@content
-body: //div[@id='storytext' or @class='storytext']
-
-strip_id_or_class: ie_column
-strip_id_or_class: sharewidgets
-strip_image_src: bug.gif
-
-strip: //div[@class="hed_side"]
-strip: //span[@class="byline"]
-strip: //a[@class="soc-twtname"]
-strip: //span[@class="cnnDateStamp"]
-strip: //div[@class="storytimestamp"]
-strip: //div[@class="cnnCol_side"]
-
-prune: no
-tidy: no
-
-test_url: http://money.cnn.com/2011/03/15/news/companies/steve_jobs_thought_process.fortune/index.htm?section=money_topstories&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+rss%2Fmoney_topstories+%28Top+Stories%29
-test_url: http://money.cnn.com/2012/01/27/markets/markets_newyork/index.htm
-test_url: http://money.cnn.com/2012/05/13/technology/yahoo-ceo-out-rumor/index.htm \ No newline at end of file
diff --git a/data/GrabberConfig/moneymanagement.com.au.txt b/data/GrabberConfig/moneymanagement.com.au.txt
deleted file mode 100644
index 9892f662..00000000
--- a/data/GrabberConfig/moneymanagement.com.au.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-date: //span[@class="publishdate"]//time
-author: //span[@class="byline"]
diff --git a/data/GrabberConfig/monkeyzen.com.txt b/data/GrabberConfig/monkeyzen.com.txt
deleted file mode 100644
index f779c38e..00000000
--- a/data/GrabberConfig/monkeyzen.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://monkeyzen.com/2011/09/siluetas-de-clasicos-a-modo-de-vinilos \ No newline at end of file
diff --git a/data/GrabberConfig/moo.nac.uci.edu.txt b/data/GrabberConfig/moo.nac.uci.edu.txt
deleted file mode 100644
index 24c949e9..00000000
--- a/data/GrabberConfig/moo.nac.uci.edu.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='header']//h1[1]
-
-body: //div[@id='content']
-
-strip_id_or_class: toc
-
-prune: no
-
-test_url: http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html
diff --git a/data/GrabberConfig/moonsault.de.txt b/data/GrabberConfig/moonsault.de.txt
deleted file mode 100644
index 55026eeb..00000000
--- a/data/GrabberConfig/moonsault.de.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-strip_image_src: menu
-strip_image_src: templates
-strip: //div/a
-strip: //div/b
-strip: //div/strong
-strip: //td[@width='30%']
-strip: //br[1]
-strip: //br[2]
-strip: //br[3]
-strip: //br[4]
-strip: //a[@href='http://www.moonsault.de/newzboard/index.php?act=home']
-strip_id_or_class: cse-branding-right
-test_url: http://www.moonsault.de/newzboard/index.php?news=22321&act=previous \ No newline at end of file
diff --git a/data/GrabberConfig/mostpleasent.com.txt b/data/GrabberConfig/mostpleasent.com.txt
deleted file mode 100644
index 26fff30e..00000000
--- a/data/GrabberConfig/mostpleasent.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.mostpleasent.com%2Fnew-sony-battery-reportedly-gets-40-better-life%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post_header single ')]
-
-test_url: http://www.mostpleasent.com/new-sony-battery-reportedly-gets-40-better-life/
diff --git a/data/GrabberConfig/motherboard.vice.com.txt b/data/GrabberConfig/motherboard.vice.com.txt
deleted file mode 100644
index c6312c0e..00000000
--- a/data/GrabberConfig/motherboard.vice.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //span[@class="author"]/a
-date: //span[@class="date"]
-body: //div[@class="story-content"]
-strip: //aside
-test_url: http://motherboard.vice.com/blog/you-can-carry-a-copy-of-the-pirate-bay-in-your-pocket \ No newline at end of file
diff --git a/data/GrabberConfig/mothering.com.txt b/data/GrabberConfig/mothering.com.txt
deleted file mode 100644
index a34adff7..00000000
--- a/data/GrabberConfig/mothering.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h2[contains(@class,'post_headline')]
-body: //div[@class='entry']
-convert_double_br_tags: yes
-strip_image_src: _selected.gif
-strip_id_or_class: addthis_
-strip: //a[contains(@href,'feedburner.com')]
-test_url: http://mothering.com/all-things-mothering/inspiration/motherhood-brings-me-down \ No newline at end of file
diff --git a/data/GrabberConfig/motherjones.com.txt b/data/GrabberConfig/motherjones.com.txt
deleted file mode 100644
index 851feb7e..00000000
--- a/data/GrabberConfig/motherjones.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: //h1
-body: //div[@id = 'content-area']
-next_page_link: //div[@class='node-pager']/a[contains(@class, 'next')]
-tidy: no
-author: //p[contains(@class, 'byline')]/a
-
-strip_id_or_class: node-header
-strip_id_or_class: hdr-tools
-strip_id_or_class: node-body-break
-strip_id_or_class: pullquote
-strip_id_or_class: node-pager
-strip_id_or_class: author-bio
-strip_id_or_class: node-footer
-
-test_url: http://motherjones.com/politics/2012/02/mac-mcclelland-free-online-shipping-warehouses-labor \ No newline at end of file
diff --git a/data/GrabberConfig/motorfull.com.txt b/data/GrabberConfig/motorfull.com.txt
deleted file mode 100644
index c6bec7e9..00000000
--- a/data/GrabberConfig/motorfull.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://motorfull.com/2011/09/aparca-valeo-park4u-remote \ No newline at end of file
diff --git a/data/GrabberConfig/movie.douban.com.txt b/data/GrabberConfig/movie.douban.com.txt
deleted file mode 100644
index eae211ed..00000000
--- a/data/GrabberConfig/movie.douban.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# This filter is tested on:
-# http://movie.douban.com/review/1062013/
-
-title: //span[contains(@property, 'v:summary')]
-author: //span[contains(@property, 'v:reviewer')]
-date://span[contains(@property, 'v:dtreviewed')]
-body://div[contains(@class, 'main-bd')]
-
-strip://img[contains(@class,'rating')]|//img[contains(@class,'review-stat')]
-convert_double_br_tags: yes
-test_url: http://movie.douban.com/review/1062013/
-test_url: http://movie.douban.com/review/1021870/ \ No newline at end of file
diff --git a/data/GrabberConfig/msdn.microsoft.com.txt b/data/GrabberConfig/msdn.microsoft.com.txt
deleted file mode 100644
index 7a284275..00000000
--- a/data/GrabberConfig/msdn.microsoft.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[class="mainBody"]
-footnotes: no
-test_url: http://msdn.microsoft.com/en-us/library/hh542796(VS.103).aspx \ No newline at end of file
diff --git a/data/GrabberConfig/msnbc.msn.com.txt b/data/GrabberConfig/msnbc.msn.com.txt
deleted file mode 100644
index f008d2d1..00000000
--- a/data/GrabberConfig/msnbc.msn.com.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-title: //title
-author: //div[@id='byline']
-
-date: //div[contains(@class,'timestamp')]/abbr/text()
-
-body: //div[@id='intellitTXT']
-
-strip: //div[@id='byline']
-strip: //div[contains(@class,'timestamp')]
-strip: //div[contains(@class, 'ad-label')]
-strip: //div[contains(@class, 'ad-break')]
-strip: //span[contains(@class, 'x-video')]
-strip: //span[contains(@class, 'inline')]
-strip: //div[contains(@class, 'video')]
-strip: //div[contains(@class, 'discuss')]
-strip: //div[@id='most-popular']
-strip: //div[contains(@class,'drawer')]
-strip: //*[contains(@class, 'hide')]
-
-footnotes: no
-test_url: http://www.msnbc.msn.com/id/44748412/ns/business-world_business/#.TolUv-vfDbE \ No newline at end of file
diff --git a/data/GrabberConfig/myfoxatlanta.com.txt b/data/GrabberConfig/myfoxatlanta.com.txt
deleted file mode 100644
index 8a7590ab..00000000
--- a/data/GrabberConfig/myfoxatlanta.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@id='WNStoryBody']
-author: //div[@id='WNStoryByline']
-prune: no
-
-test_url: http://www.myfoxatlanta.com/category/233685/local-news?clienttype=rss \ No newline at end of file
diff --git a/data/GrabberConfig/myrecipes.com.txt b/data/GrabberConfig/myrecipes.com.txt
deleted file mode 100644
index 956be1e6..00000000
--- a/data/GrabberConfig/myrecipes.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h2[contains(@class, 'name')]
-body: //div[@class='printFullPageContentContainer']//div[contains(@class, 'recipe')]
-
-strip_id_or_class: photoBy
-strip_id_or_class: link
-
-single_page_link: //li[@class='print']/a[contains(@href, '/print/')]
-
-prune: no
-tidy: no
-
-test_url: http://www.myrecipes.com/recipe/hummingbird-cake-10000000387218/ \ No newline at end of file
diff --git a/data/GrabberConfig/n0where.net.txt b/data/GrabberConfig/n0where.net.txt
deleted file mode 100644
index e91159ea..00000000
--- a/data/GrabberConfig/n0where.net.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title://div[@class='main-title single-title entry-title']
-body://div[@id="content-anchor-inner"]
-date://meta[@content]
-
-strip: //noscript
diff --git a/data/GrabberConfig/nachrichten.at.txt b/data/GrabberConfig/nachrichten.at.txt
deleted file mode 100644
index 64015ca9..00000000
--- a/data/GrabberConfig/nachrichten.at.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-single_page_link: //a[@class="drucken"]
-
-body: //div[@class="artikeldruck"]
-
-strip: //div[@class="druckheadline"]
-strip: //div[@class="druckfuss"]
-
-test_url: http://www.nachrichten.at/nachrichten/chronik/Silvester-in-der-Bundeshauptstadt-Anti-Terror-Einheiten-ruesten-sich;art58,2069166
diff --git a/data/GrabberConfig/naiz.eus.txt b/data/GrabberConfig/naiz.eus.txt
deleted file mode 100644
index 9e48333a..00000000
--- a/data/GrabberConfig/naiz.eus.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[contains(@class,'widget full_article')]
-
-test_url: http://www.naiz.eus/eu/actualidad/noticia/20151002/adegi-afirma-que-los-jovenes-viven-una-vida-muy-comoda-y-no-tienen-hambre-para-emprender#
-test_url: http://www.naiz.eus/eu/actualidad/noticia/20151012/podemos-euskadi-critica-que-otegi-y-sus-companeros-quieran-pasar-por-grandes-pacifistas
diff --git a/data/GrabberConfig/nakedsecurity.sophos.com.txt b/data/GrabberConfig/nakedsecurity.sophos.com.txt
deleted file mode 100644
index 57bb2b48..00000000
--- a/data/GrabberConfig/nakedsecurity.sophos.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='entry-content']
-title: //div[@class='entry-title']
-strip: //div[@class='entry-sharing']
-
-test_url: https://nakedsecurity.sophos.com/2016/04/04/new-ransomware-with-an-old-trick-petya-parties-like-its-1989/
diff --git a/data/GrabberConfig/nasa.gov.txt b/data/GrabberConfig/nasa.gov.txt
deleted file mode 100644
index 7df1112b..00000000
--- a/data/GrabberConfig/nasa.gov.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@class='address']/span
-author: substring-before(//span[@class='credits'],',')
-date: //div[@class='promodatepress']/span
-body: //div[@class='default_style_wrap']
-strip: //div[@class='text_adjust']
-strip: //div[@class='skiplink']
-strip: //h2
-test_url: http://www.nasa.gov/mission_pages/kepler/news/kepler-21b.html \ No newline at end of file
diff --git a/data/GrabberConfig/nbnnews.com.au.txt b/data/GrabberConfig/nbnnews.com.au.txt
deleted file mode 100644
index a2409878..00000000
--- a/data/GrabberConfig/nbnnews.com.au.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry ') or contains(@class, 'single-post-thumb')]
-test_url: http://www.nbnnews.com.au/2015/03/24/lismore-man-will-attempt-to-run-around-australia/
-test_url: http://www.nbnnews.com.au/category/nthn-rivers-sport/feed/
diff --git a/data/GrabberConfig/nbweekly.com.txt b/data/GrabberConfig/nbweekly.com.txt
deleted file mode 100644
index 2645d406..00000000
--- a/data/GrabberConfig/nbweekly.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-date://span[contains(@class,'date')]
-
-body://div[contains(@class,'contWarp')]
-
-strip://div[contains(@class,'keyWord')]
-strip://div[contains(@class,'submitComt')]
-strip://div[contains(@class,'cmts')]
-strip://div[contains(@class,'notice')]
-strip://div[contains(@class,'part pt-second')]
-test_url: http://www.nbweekly.com/news/china/201203/29316.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/neh.gov.txt b/data/GrabberConfig/neh.gov.txt
deleted file mode 100644
index e7cc4313..00000000
--- a/data/GrabberConfig/neh.gov.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-#host configuration should be http://www.neh.gov/news/humanities/
-
-
-#meta data
-title:substring-after(substring-after(//title,':'),':')
-author:substring-after(//h2[@class = 'subHead'],'By')
-date:substring-before(substring-after(//title,':'),':')
-
-#img and caption handling
-wrap_in(small)://div[@id = 'mainContent']/table/descendant::p/descendant::text()
-wrap_in(fieldset)://div[@id = 'mainContent']/table
-
-# clean up
-strip: //table[@class = 'marginpaddingTop']
-strip: //h2[@class = 'subHead']
-
-test_url: http://www.neh.gov/news/humanities/2011-11/IslamicScholar.html \ No newline at end of file
diff --git a/data/GrabberConfig/net-security.org.txt b/data/GrabberConfig/net-security.org.txt
deleted file mode 100644
index b7fedbf3..00000000
--- a/data/GrabberConfig/net-security.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@class='content-title']
-#date: substring-after(//div[@class='dernek-text-under'],'Posted on')
-body: //div[@class='content-item']
-next_page_link: //li[@class='next']/a
-convert_double_br_tags: yes
-
-test_url: http://www.net-security.org/article.php?id=1732 \ No newline at end of file
diff --git a/data/GrabberConfig/netmagazine.com.txt b/data/GrabberConfig/netmagazine.com.txt
deleted file mode 100644
index dcea047c..00000000
--- a/data/GrabberConfig/netmagazine.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //h1
-author: //div[@class="submitted"]/span
-
-# seems like this should work, but nothing is returned. Issue with xpath parser?
-date: //div[@class="submitted"]/time
-
-body: //div[@id="main-content"]
-
-strip_comments: no
-
-strip: //h1
-strip: //div[@class="submitted"]
-strip: //dd[@class="profile-avatar"]
-strip: //div[@class="author-profile"]/dl/dt[1]
-strip: //div[@id="right-col"]
-test_url: http://www.netmagazine.com/opinions/nielsen-wrong-mobile \ No newline at end of file
diff --git a/data/GrabberConfig/networkworld.com.txt b/data/GrabberConfig/networkworld.com.txt
deleted file mode 100644
index f097298b..00000000
--- a/data/GrabberConfig/networkworld.com.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-# All sites of the IDG network can be extracted using the same rules,
-# make sure to update all of them
-
-author: //meta[@name="author"]/@content
-date: //meta[@name="DC.date.issued"]/@content
-
-body: //div[@itemprop="articleBody"]
-body: //div[@itemprop="reviewBody"]
-body: //figcaption|//div[@class="img-wrapper"]/noscript/img
-
-next_page_link: //a[@rel="next"]
-
-strip: //aside
-strip: //h3[contains(., "See also:")]
-strip: //div[@id="article-top-page-number"]
-strip: //p[starts-with(normalize-space(.), '[')]
-strip: //p[starts-with(normalize-space(.), '+')]
-
-test_url: http://www.networkworld.com/index.rss
-test_url: http://www.networkworld.com/article/2952852/email-services/4-great-gmail-tips-you-might-not-know-about.html#tk.rss_all
-test_url: http://www.networkworld.com/article/2951819/infrastructure-management/cios-say-applecare-for-enterprise-is-lacking.html
-test_url: http://www.networkworld.com/article/2951823/cisco-subnet/early-access-qa-new-cisco-ceo-chuck-robbins-heads-into-hyper-connected-mode.html
-test_url: http://www.networkworld.com/article/2947478/mobile/what-if-the-apple-watch-really-is-a-flop.html
-test_url: http://www.networkworld.com/article/2953522/cloud-computing/nfv-a-hit-for-opendaylight.html
-test_url: http://www.networkworld.com/article/2960522/wi-fi/best-wi-fi-stumblers-for-the-mac.html
-test_url: http://www.networkworld.com/article/2969669/email-services/outlook-2016-review-a-new-coat-of-paint-on-the-same-reliable-personal-information-manager.html
diff --git a/data/GrabberConfig/netzpolitik.org.txt b/data/GrabberConfig/netzpolitik.org.txt
deleted file mode 100644
index 7fa43fd7..00000000
--- a/data/GrabberConfig/netzpolitik.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class='entry-title']
-author: //a[@ref='author']
-date: //span[@class='entry-date']
-body: //div[@class='entry-content']
-
-test_url: http://netzpolitik.org/2011/buch-generation-facebook/ \ No newline at end of file
diff --git a/data/GrabberConfig/neues-deutschland.de.txt b/data/GrabberConfig/neues-deutschland.de.txt
deleted file mode 100644
index d128638b..00000000
--- a/data/GrabberConfig/neues-deutschland.de.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1//span
-date: //div[@class='Date']
-
-body: //article//div[contains(concat(' ',normalize-space(@class),' '),' Content ')]
-
-strip_id_or_class: 'Content-Ad'
-strip_id_or_class: 'ArticleShopAd'
-
-test_url: http://www.neues-deutschland.de/artikel/1009093.mutmassliche-rechtsterroristen-in-freital-festgenommen.html \ No newline at end of file
diff --git a/data/GrabberConfig/newleftproject.org.txt b/data/GrabberConfig/newleftproject.org.txt
deleted file mode 100644
index d9af99d8..00000000
--- a/data/GrabberConfig/newleftproject.org.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //div[contains(@class, 'article_header')]//h3
-
-test_url: http://www.newleftproject.org/index.php/site/article_comments/do_we_need_a_facebook_of_the_left \ No newline at end of file
diff --git a/data/GrabberConfig/newmatilda.com.txt b/data/GrabberConfig/newmatilda.com.txt
deleted file mode 100644
index f17ecdc6..00000000
--- a/data/GrabberConfig/newmatilda.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id="maincontent"]/h1
-body: //div[@id="maincontent"]
-date: //div[@id="maincontent"]/p[2]
-author: //ul[@id="contributors"]/li/p/b
-
-strip: //p[@*]
-strip: //h1
-strip: //div[@id="maincontent"]/div
-test_url: http://newmatilda.com/2011/07/22/turnbull-makes-sense-climate \ No newline at end of file
diff --git a/data/GrabberConfig/newrepublic.com.txt b/data/GrabberConfig/newrepublic.com.txt
deleted file mode 100644
index 039f0385..00000000
--- a/data/GrabberConfig/newrepublic.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-author: //span[@class="authors"]
-date: //span[@class="date"]
-body: //div[@class="primary"]
-
-strip: //div[@id="controls"]
-strip: //div[@id="read-next"]
-
-test_url: http://www.newrepublic.com/article/112731/moocs-will-online-education-ruin-university-experience \ No newline at end of file
diff --git a/data/GrabberConfig/news-gazette.com.txt b/data/GrabberConfig/news-gazette.com.txt
deleted file mode 100644
index 2b352707..00000000
--- a/data/GrabberConfig/news-gazette.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@id="main-content"]//h2
-
-author: //div[@id="main-content"]//span[@class="authors"]
-
-date: //div[@id="main-content"]//span[@class="timestamp"]
-
-body: //div[@id="main-content"]//div[@class="content"]
-test_url: http://www.news-gazette.com/news/business/economy/2011-08-08/ibm-drops-out-blue-waters-project.html \ No newline at end of file
diff --git a/data/GrabberConfig/news.cnet.com.txt b/data/GrabberConfig/news.cnet.com.txt
deleted file mode 100644
index 78af70f4..00000000
--- a/data/GrabberConfig/news.cnet.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-#This should apply to *.cnet.com. Not just news.cnet.com.
-title: //h1
-author: //img[@class="mugshot"]/@alt
-strip: //h1
-strip_id_or_class: breadcrumb
-strip: //p[@id="introP"]
-strip: //div[@class="postByline"]
-strip: //div[@class="editorBio"]
-strip: //div[@class="inline-slideshow"]
-strip: //div[@class="related"]
-body: //div[@class="postBody txtWrap"]
-test_url: http://news.cnet.com/8301-27076_3-57405303-248/apple-ipad-charging-fine-keep-it-plugged-in/?tag=mncol;posts \ No newline at end of file
diff --git a/data/GrabberConfig/news.com.au.txt b/data/GrabberConfig/news.com.au.txt
deleted file mode 100644
index 57b89a54..00000000
--- a/data/GrabberConfig/news.com.au.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='story-body']
-prune: no
-tidy: no
diff --git a/data/GrabberConfig/news.detik.com.txt b/data/GrabberConfig/news.detik.com.txt
deleted file mode 100644
index 629bc917..00000000
--- a/data/GrabberConfig/news.detik.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title://div[@class="content_detail"]/h1
-
-author://div[@class="author"]/strong
-
-date:substring-before(substring-after(//div[@class="content_detail"]/span[@class="date"], ','), ' WIB')
-
-body://div[@class="text_detail"]
-test_url: http://news.detik.com/read/2012/05/22/225531/1922307/10/menkeu-cek-soal-lolosnya-315-kg-sabu-dari-bea-cukai \ No newline at end of file
diff --git a/data/GrabberConfig/news.menshealth.com.txt b/data/GrabberConfig/news.menshealth.com.txt
deleted file mode 100644
index a07fdacc..00000000
--- a/data/GrabberConfig/news.menshealth.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-strip: //span[@style="color: #cf1206;"]
diff --git a/data/GrabberConfig/news.mynavi.jp.txt b/data/GrabberConfig/news.mynavi.jp.txt
deleted file mode 100644
index 1df47314..00000000
--- a/data/GrabberConfig/news.mynavi.jp.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h2[@class="lyt-hdg-02-04"]
-
-author: //div[@class="lyt-namearea"]/a
-
-date: //div[@class="lyt-namearea"]/text()
-
-body: //div[@class="articleContent"]
-
-strip: //div[@id="tab-aside"]
-
-test_url: http://news.mynavi.jp/articles/2011/12/07/nico/index.html \ No newline at end of file
diff --git a/data/GrabberConfig/news.ninemsn.com.au.txt b/data/GrabberConfig/news.ninemsn.com.au.txt
deleted file mode 100644
index ddd64065..00000000
--- a/data/GrabberConfig/news.ninemsn.com.au.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-strip: //a[@class="contact"]
-strip: //div[@class="article-media video-item"]
-date: //div[@class='display-date']
diff --git a/data/GrabberConfig/news.pixelistes.com.txt b/data/GrabberConfig/news.pixelistes.com.txt
deleted file mode 100644
index b86b866b..00000000
--- a/data/GrabberConfig/news.pixelistes.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http://www.journaldugeek.com/2015/09/09/apple-ipad-pro/
-
-date: //meta[@property="og:updated_time"]/@content
-next_page_link: //div[@class="post-content"]/div[@class='row pagination']/a[contains(concat(' ',normalize-space(@class),' '),' next ')]
-
-strip_id_or_class: jdg-recommend
-strip_id_or_class: proofreader-bloc
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post-content ')]
-test_url: http://news.pixelistes.com/pixelistes-partenaire-du-salon-de-la-photo-de-paris/
diff --git a/data/GrabberConfig/news.rambler.ru.txt b/data/GrabberConfig/news.rambler.ru.txt
deleted file mode 100644
index 1d547334..00000000
--- a/data/GrabberConfig/news.rambler.ru.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //article
-title: //h1
-author: //span[@class='b-article-source-dropdown']
-strip: //span[@class='b-article-photo-incut__source']
-strip: //a[@class='b-read-more b-read-more_bottom']
-
-
-tidy:no
-test_url: http://news.rambler.ru/12972208/ \ No newline at end of file
diff --git a/data/GrabberConfig/news.techmeme.com.txt b/data/GrabberConfig/news.techmeme.com.txt
deleted file mode 100644
index ba4db828..00000000
--- a/data/GrabberConfig/news.techmeme.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='main']/div[@class='item']
-strip: //div[@class='right']
-
-test_url: http://news.techmeme.com/110516/fh-rip \ No newline at end of file
diff --git a/data/GrabberConfig/news.yahoo.com.txt b/data/GrabberConfig/news.yahoo.com.txt
deleted file mode 100644
index fc1739c8..00000000
--- a/data/GrabberConfig/news.yahoo.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //meta[@property='og:title']/@content
-title: //h1[@class='headline']
-author: //cite[contains(@class, 'byline') and contains(@class, 'vcard')]//span[@class='fn']
-date: //cite[contains(@class, 'byline') and contains(@class, 'vcard')]//abbr/@title
-body: //div[@id='mediaarticlelead']//a[@class='media'] | //div[contains(@class,'yom-art-content')]
-#strip: //cite/abbr
-strip_id_or_class: action
-strip_id_or_class: prefetch
-tidy: no
-prune: no
-
-test_url: http://news.yahoo.com/cold-la-nina-winter-forecast-west-coast-183535067.html \ No newline at end of file
diff --git a/data/GrabberConfig/news.ycombinator.com.txt b/data/GrabberConfig/news.ycombinator.com.txt
deleted file mode 100644
index f7441d17..00000000
--- a/data/GrabberConfig/news.ycombinator.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-strip_comments: no
-strip: //a[. = 'reply']
-test_url: http://news.ycombinator.com/item?id=1516461 \ No newline at end of file
diff --git a/data/GrabberConfig/news.zing.vn.txt b/data/GrabberConfig/news.zing.vn.txt
deleted file mode 100644
index af81e90e..00000000
--- a/data/GrabberConfig/news.zing.vn.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body://div[@class="newsdetail_wrapper"]
-strip://div[@class="more_news"]
-test_url: http://news.zing.vn/xa-hoi/s-phat-nang-xe-may-di-duong-tren-cao-ha-noi/a280838.html#home_noibat1 \ No newline at end of file
diff --git a/data/GrabberConfig/news247.gr.txt b/data/GrabberConfig/news247.gr.txt
deleted file mode 100644
index 87637bed..00000000
--- a/data/GrabberConfig/news247.gr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class='title']
-
-body: //img[@id='relPicsMainPic'] | //div[contains(@class, 'storyContent')]
-
-test_url: http://news247.gr/eidiseis/katatheseis_fwtia_htan_apofasismenoi_akomh_kai_na_afairesoyn_zwes_an_thewrousan_oti_to_thuma_htan_antipalos_toys.2433351.html
-test_url: http://news247.gr/?widget=rssfeed&view=feed&contentId=38291 \ No newline at end of file
diff --git a/data/GrabberConfig/newsbomb.gr.txt b/data/GrabberConfig/newsbomb.gr.txt
deleted file mode 100644
index 5eb0ea46..00000000
--- a/data/GrabberConfig/newsbomb.gr.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-date: //meta[@name='og:article:published_time']/@value
-
-body: //div[@class='itemIntroText' or @class='itemImageBlock' or @class='itemFullText']
-
-strip_id_or_class: itemImageGallery
-
-prune: no
-
-test_url: http://www.newsbomb.gr/gossip/story/257234/i-proin-moy-protimoyse-na-serfarei-apo-to-na-kanoyme-sex \ No newline at end of file
diff --git a/data/GrabberConfig/newsunspun.org.txt b/data/GrabberConfig/newsunspun.org.txt
deleted file mode 100644
index 247bbebb..00000000
--- a/data/GrabberConfig/newsunspun.org.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@class='right']//div[@class='articles']
-author: //div[@id='artinfo']//a[contains(@href, '/author/')]
-strip: //div[@id='artinfo']
-strip: //table[//a[contains(@href, 'twitter.com')]]
-strip_id_or_class: twitter
-
-prune: no
-tidy: no
-
-test_url: http://www.newsunspun.org/eotn/bbc-headline-change-iran-goes-from-not-building-to-undecided-on-nuclear-bomb \ No newline at end of file
diff --git a/data/GrabberConfig/newsweek.com.txt b/data/GrabberConfig/newsweek.com.txt
deleted file mode 100644
index 565648ba..00000000
--- a/data/GrabberConfig/newsweek.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class = 'article-body']
-title: //h1[@class = 'article-title']
-strip: //aside
-
-test_url: http://www.newsweek.com/day-steve-mcqueen-met-his-new-nazi-neighbor-keith-moon-229741
-test_url: http://www.newsweek.com/2014/06/13/how-greylock-partners-finds-next-facebook-253329.html
diff --git a/data/GrabberConfig/newswise.com.txt b/data/GrabberConfig/newswise.com.txt
deleted file mode 100644
index 10120ea1..00000000
--- a/data/GrabberConfig/newswise.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-prune: no
-tidy: no
-
-title: //h1/a[2]
-body: //div[@id="main"]
-author: //span[@id="articlesource"]
-date: //span[contains(@class, 'releasedate')]
-
-strip: //div[@class="inst-logo"]
-strip: //h1[1]
-
-strip_id_or_class: addthis
-strip_id_or_class: released
-strip_id_or_class: skiptranslate
-strip_id_or_class: flash
-
-test_url: http://www.newswise.com/articles/first-heat-wave-of-season-puts-elderly-at-risk
diff --git a/data/GrabberConfig/newyorker.com.txt b/data/GrabberConfig/newyorker.com.txt
deleted file mode 100644
index 950324a3..00000000
--- a/data/GrabberConfig/newyorker.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[@id='articlehed'] | //h2[@id="articleintro"]
-body: //div[@id='articletext']
-
-strip: //ul[@id="bc"] | //div[@id="yrail"] | //div[@class="entry-keywords"] | //div[@class="entry-categories"] | //div[@class="socialUtils"] | //div[@id="footer"] | //div[@class="cartoon"]
-
-date: //h4[@id='articleauthor']/span[@class='dd dds']
-date: //div[@id="pagebody"]/div[@class='hentry entry']/div[@class='published']
-
-single_page_link: //div[@class='paginationViewSinglePage']/a
-test_url: http://www.newyorker.com/online/blogs/culture/2012/06/mug-shot-web-sites.html
-test_url: http://www.newyorker.com/reporting/2013/04/22/130422fa_fact_bilger?currentPage=all&mobify=0 \ No newline at end of file
diff --git a/data/GrabberConfig/nfl.com.txt b/data/GrabberConfig/nfl.com.txt
deleted file mode 100644
index 956b288f..00000000
--- a/data/GrabberConfig/nfl.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# doesn't look like selecting an attribute value works?
-# author: //meta[@id="authorName"]@value
-
-author: substring-after(//li[@id="article-hdr-meta-author"]/text(), "By ")
-date: //abbr[@id="article-time"]
-title: //div[@id="article-hdr"]/h1
-body: //div[@class="articleText"]
-
-# strip miscellaneous teasers & etc
-strip: //div[@class="removeformobile"]
-test_url: http://www.nfl.com/news/story/09000d5d82388707/article/close-shave-chiefs-haley-perseveres-through-rough-start?module=HP11_content_stream \ No newline at end of file
diff --git a/data/GrabberConfig/ngm.nationalgeographic.com.txt b/data/GrabberConfig/ngm.nationalgeographic.com.txt
deleted file mode 100644
index 44a82a95..00000000
--- a/data/GrabberConfig/ngm.nationalgeographic.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-next_page_link: //div[@class='nextpage_continue']/a
-strip: //div[@class='nextpage_continue']
-strip_id_or_class: nextpage
-title: //div[@class='article_title']//h1
-body: //div[@class='article_title']/..
-body: //div[@class='content']
-test_url: http://ngm.nationalgeographic.com/2012/02/tsunami/folger-text \ No newline at end of file
diff --git a/data/GrabberConfig/nintendoworldreport.com.txt b/data/GrabberConfig/nintendoworldreport.com.txt
deleted file mode 100644
index f0e28afb..00000000
--- a/data/GrabberConfig/nintendoworldreport.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-body: //div[@id="main"]
-title: //div[@id="main"]/h3
-
-# Remove &lsquo;Review&rsquo; and &lsquo;Wii&rsquo;.
-strip: //div[@class="badge"]
-
-# Remove duplicate title and country flag.
-strip: //h3
-
-# Commented out below are attempts to extract the author and date, which did not work.
-# author: //p[@class="extra "]/a
-# date: //p[@class="extra "]/span[@class="when"]
-test_url: http://www.nintendoworldreport.com/review/28400 \ No newline at end of file
diff --git a/data/GrabberConfig/nojesguiden.se.txt b/data/GrabberConfig/nojesguiden.se.txt
deleted file mode 100644
index b15f0612..00000000
--- a/data/GrabberConfig/nojesguiden.se.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //span[@class='meta']/span[@class='username']
-body: //div[@class='article-content']
-
-strip_id_or_class: 'article-actions'
-test_url: http://nojesguiden.se/blogg/maja-bredberg/maja-laser-tidningen-en-helt-vanlig-lordag-i \ No newline at end of file
diff --git a/data/GrabberConfig/northumberlandview.ca.txt b/data/GrabberConfig/northumberlandview.ca.txt
deleted file mode 100644
index f698d98e..00000000
--- a/data/GrabberConfig/northumberlandview.ca.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1
-body: //div[@id='pn-maincontent']
-strip_id_or_class: z-menu
-strip_id_or_class: news_category
-strip_id_or_class: news_title
-strip_id_or_class: news_modify
-strip_id_or_class: news_morearticlesincat
-strip_id_or_class: ezc_comments
-strip_comments: yes
-
-test_url: http://www.northumberlandview.ca/index.php?module=news&type=user&func=display&sid=31127
diff --git a/data/GrabberConfig/nosalty.hu.txt b/data/GrabberConfig/nosalty.hu.txt
deleted file mode 100644
index 7e20cadf..00000000
--- a/data/GrabberConfig/nosalty.hu.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@id='tab-recept']//h1
-body: //div[@id='tab-recept']//div[contains(@class, 'column-container')]
-strip_id_or_class: ajanlo-box
-prune: no
-
-test_url: http://www.nosalty.hu/recept/szupergyors-fank \ No newline at end of file
diff --git a/data/GrabberConfig/notebookcheck.net.txt b/data/GrabberConfig/notebookcheck.net.txt
deleted file mode 100644
index 1e9a4b13..00000000
--- a/data/GrabberConfig/notebookcheck.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.notebookcheck.net%2FLenovo-ThinkPad-X1-Carbon-Ultrabook-Review.138033.0.html
-
-body: //div[@id='nbc_maincontent']
-test_url: http://www.notebookcheck.net/Lenovo-ThinkPad-X1-Carbon-Ultrabook-Review.138033.0.html
diff --git a/data/GrabberConfig/nplusonemag.com.txt b/data/GrabberConfig/nplusonemag.com.txt
deleted file mode 100644
index 1b817c04..00000000
--- a/data/GrabberConfig/nplusonemag.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: /html/body/div[3]/div/div/h1
-
-body: //*[@id="article-body"]
-
-
-test_url: http://nplusonemag.com/the-outskirts-of-progress \ No newline at end of file
diff --git a/data/GrabberConfig/npr.org.txt b/data/GrabberConfig/npr.org.txt
deleted file mode 100644
index acd73e48..00000000
--- a/data/GrabberConfig/npr.org.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-title: //div[contains(@class, 'storytitle')]//h1
-author: //p[@class="byline"]/span
-body: //div[@id='primaryaudio']//*[@class='duration' or @class='download' or contains(@class, 'photo')] | //div[@id='storytext' or @id='supplementarycontent' or contains(@class, 'transcript')]
-date: //meta[@name="date"]/@content
-
-strip_id_or_class: enlarge_measure
-strip_id_or_class: enlarge_html
-strip: //a[contains(@class, 'enlargeicon')]
-strip: //div[contains(@class, 'bookedition')]
-strip: //div[@class='textsize']
-strip: //ul[@class='genres']
-strip: //span[@class='bull']
-strip_id_or_class: secondary
-strip_id_or_class: con1col
-strip: //h3[@class='conheader']
-
-replace_string(<a name="more">&nbsp;</a>): <!-- no more -->
-replace_string(<div class="transcript">): <div class="transcript"><h2>Transcript</h2>
-replace_string(<div class="transcript storytext">): <div class="transcript storytext"><h2>Transcript</h2>
-
-prune: no
-strip://div[@class="ecommercepop"]
-strip://span[@class="bull"]
-strip://span[@class="purchaseLink"]
-strip://div[@class="enlarge_html"]
-strip://div[@class="enlarge_measure"]
-strip://div[@class="container con1col small"]
-strip://a[contains(@class, "enlargebtn")]
-strip://div[contains(@class, "bucketwrap internallink")]
-
-test_url: http://www.npr.org/blogs/thetwo-way/2011/07/12/137799301/sports-loses-its-escapist-gleam-in-a-summer-of-court-dates
-test_url: http://www.npr.org/2012/07/04/156190948/feeling-under-siege-catholic-leadership-shifts-right
-test_url: http://www.npr.org/2012/12/13/166480907/the-years-best-sci-fi-crosses-galaxies-and-genres
-test_url: http://www.npr.org/templates/story/story.php?storyId=229103221 \ No newline at end of file
diff --git a/data/GrabberConfig/nrc.nl.txt b/data/GrabberConfig/nrc.nl.txt
deleted file mode 100644
index 24f8a038..00000000
--- a/data/GrabberConfig/nrc.nl.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' nmt-layout--sidebar-align-right ')]
-strip_id_or_class: article__footer
-strip_id_or_class: nmt-layout__sidebar
-
-test_url: http://www.nrc.nl/nieuws/2016/10/02/de-nederlandse-school-wanorde-onrust-en-lawaai-4566603-a1524441
diff --git a/data/GrabberConfig/numerama.com.txt b/data/GrabberConfig/numerama.com.txt
deleted file mode 100644
index cb874f5e..00000000
--- a/data/GrabberConfig/numerama.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-strip://section[@class='related-article']
diff --git a/data/GrabberConfig/nybooks.com.txt b/data/GrabberConfig/nybooks.com.txt
deleted file mode 100644
index d95ec68e..00000000
--- a/data/GrabberConfig/nybooks.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-strip_id_or_class: sIFR-alternate
-title: //div[@id='page-title-wrapper']/div[@id='page-title']/h2
-single_page_link: //a[contains(@href, 'pagination=false') and not(contains(@href, 'printpage=true'))]
-
-body: //div[@id = 'article-body']
-strip_id_or_class:article-tools
-strip_id_or_class:js_target
-strip_id_or_class:marker
-author://div[@id = 'page-title']/h3
-date://div[@id = 'page-title']/h5/a[starts-with(@href,'/issues/')]
-
-
-test_url: http://www.nybooks.com/articles/archives/2012/feb/23/were-more-unequal-you-think/ \ No newline at end of file
diff --git a/data/GrabberConfig/nymag.com.txt b/data/GrabberConfig/nymag.com.txt
deleted file mode 100644
index 64ed647d..00000000
--- a/data/GrabberConfig/nymag.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //h2[contains(@class, 'primary')]
-body: //*[@itemprop="articleBody"]
-body: //div[@id='story']
-author: //*[@class='by']/a
-date: substring-after(//*[@class='date'], 'Published')
-
-parser: html5php
-tidy: no
-
-next_page_link: //div[@class='page-navigation']//li[@class='next']/a
-
-test_url: http://nymag.com/news/features/wall-street-2012-2/
-test_contains: bonus season is a sacred ritual
-
-test_url: http://nymag.com/daily/intelligencer/2016/04/america-tyranny-donald-trump.html
-test_contains: This rainbow-flag polity
diff --git a/data/GrabberConfig/nyteknik.se.txt b/data/GrabberConfig/nyteknik.se.txt
deleted file mode 100644
index f4bedb6a..00000000
--- a/data/GrabberConfig/nyteknik.se.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@class="article default-article"]/h1
-author: //p[@class="author"]/a[2]
-
-# Article introduction:
-#move_into(//div[@class="article-bread"]): //p[@class="lead"]
-
-body: //div[@class="article-bread"]
-test_url: http://www.nyteknik.se/nyheter/energi_miljo/energi/article3391426.ece \ No newline at end of file
diff --git a/data/GrabberConfig/nytimes.com.txt b/data/GrabberConfig/nytimes.com.txt
deleted file mode 100644
index 54735ec7..00000000
--- a/data/GrabberConfig/nytimes.com.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-title://h1[@class="articleHeadline"]
-body://div[@id="article"]
-body://*[@itemprop="articleBody"]
-strip_id_or_class:articleTools
-strip_id_or_class:readerscomment
-#strip://div[contains(@class, "articleInline runaroundLeft")]
-strip: //div[contains(@class, "doubleRule")]
-# strip image credit - appears as a bold heading
-strip: //div[contains(@class, "articleInline")]//h6
-strip_id_or_class:enlargeThis
-strip_id_or_class:pageLinks
-strip_id_or_class:memberTools
-strip_id_or_class:articleExtras
-strip_id_or_class:singleAd
-strip_id_or_class:byline
-strip_id_or_class:dateline
-strip_id_or_class:articleheadline
-strip_id_or_class:articleBottomExtra
-strip_id_or_class:shareTools
-strip://a[contains(@href, 'nytimes.com/adx/')]
-strip: //nyt_byline
-strip: //span[contains(@class, 'slideshow') or contains(@class, 'video')]
-strip: //p[@class='caption']//a[contains(., 'More Photos')]
-
-prune: no
-tidy: no
-
-find_string: <script
-replace_string: <div style="display:none"
-find_string: </script>
-replace_string: </div>
-
-date: substring-after(//*[contains(@class, 'dateline')], 'Published:')
-
-single_page_link: //link[contains(@href, 'pagewanted=all')]
-single_page_link: //link[@rel='alternate' and contains(@href, 'mobile.nytimes.com')]/@href
-single_page_link: concat(substring-before(//div[@id='pageLinks']//a[contains(@href, 'pagewanted=')]/@href, 'pagewanted='), 'pagewanted=all')
-#single_page_link: //a[contains(@href, 'pagewanted=all') and not(contains(@href, 'login'))]
-
-strip://ul[@id = 'toolsList']
-strip://h6[@class = 'kicker']
-author:substring-after(//h6[@class='byline'],'By ')
-
-test_url: http://www.nytimes.com/2011/07/24/books/review/an-academic-authors-unintentional-masterpiece.html
-test_contains: In this column I want to look at a not uncommon way of writing
-
-test_url: http://www.nytimes.com/2012/06/10/arts/television/the-newsroom-aaron-sorkins-return-to-tv.html
-test_contains: IF you’ve seen enough of Aaron Sorkin’s theater
-
-test_url: http://www.nytimes.com/2013/03/25/world/middleeast/israeli-military-responds-after-patrols-come-under-fire-from-syria.html
-test_url: http://www.nytimes.com/2013/08/15/nyregion/when-the-new-york-city-subway-ran-without-rails.html
-test_url: http://www.nytimes.com/2004/02/29/weekinreview/correspondence-class-consciousness-china-s-wealthy-live-creed-hobbes-darwin-meet.html
-test_url: http://www.nytimes.com/2014/06/19/opinion/gail-collins-romney-and-the-2016-contenders-huddle.html
diff --git a/data/GrabberConfig/nzz.ch.txt b/data/GrabberConfig/nzz.ch.txt
deleted file mode 100644
index 749f4f2a..00000000
--- a/data/GrabberConfig/nzz.ch.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //*[@class='article-full']
-title: //h3
-strip: //header[@class='group']
-#body: //p[@class='lead']
-#move_into(//p[@class='lead']): //*[@class='article-full']/figure
-#move_into(//p[@class='lead']): //div[@id='articleBodyText']
-strip: //div[@id='social-media-floater']
-strip: //div[@class='advertisement']
-strip: //div[@class='infobox']
-strip: //div[@id='articleComments']
-
-test_url: http://www.nzz.ch/wissen/wissenschaft/sonnenschutz-fuer-die-erde-1.17282213 \ No newline at end of file
diff --git a/data/GrabberConfig/o6asan.com.txt b/data/GrabberConfig/o6asan.com.txt
deleted file mode 100644
index 711a23ee..00000000
--- a/data/GrabberConfig/o6asan.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fo6asan.com%2Fblog-e%2F2016%2F03%2F14%2Fhow-to-install-a-lets-encrypt-certificate-supports-sans-to-apache-on-windows%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: https://o6asan.com/blog-e/2016/03/14/how-to-install-a-lets-encrypt-certificate-supports-sans-to-apache-on-windows/
diff --git a/data/GrabberConfig/off.net.mk.txt b/data/GrabberConfig/off.net.mk.txt
deleted file mode 100644
index bf107876..00000000
--- a/data/GrabberConfig/off.net.mk.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[(@id = "content")]
-strip: //div[(@class = "links-bar")]
-strip: //div[(@class = "povrzani")]
-strip: //div[(@class = "povrzani-dolu")]
-strip: //div[(@class = "tags")]
-strip: //h1[(@id = "page-title")]
-test_url: http://off.net.mk/zhivot-i-zabava/gadzheti/dzhabe-raboti-dzhabe-ne-dishi \ No newline at end of file
diff --git a/data/GrabberConfig/omaha.com.txt b/data/GrabberConfig/omaha.com.txt
deleted file mode 100644
index 53db061d..00000000
--- a/data/GrabberConfig/omaha.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='story']
-test_url: http://www.omaha.com/article/20111031/BIGRED/111039984#pelini-tremendous-challenge-ahead-for-huskers \ No newline at end of file
diff --git a/data/GrabberConfig/omgubuntu.co.uk.txt b/data/GrabberConfig/omgubuntu.co.uk.txt
deleted file mode 100644
index 466ff8f4..00000000
--- a/data/GrabberConfig/omgubuntu.co.uk.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-tidy: no
-prune: no
-
-title: //h2[@class='entry-title']
-author: //a[@rel='author']
-
-body: //div[@class='entry-content']
-
-strip: //div[@class='entry-share']
-strip: //div[@class='entry-meta']
-strip: //div[@class='sharedaddy sd-sharing-enabled']
-strip: //div[@class='tag-links']
-test_url: http://www.omgubuntu.co.uk/2015/04/facebook-chat-api-empathy-pidgin-stop-working
diff --git a/data/GrabberConfig/omiliya.org.txt b/data/GrabberConfig/omiliya.org.txt
deleted file mode 100644
index 4b3a7202..00000000
--- a/data/GrabberConfig/omiliya.org.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='squeeze']/h1
-strip: //div[@id='squeeze']/h1
-author: //div[@class='submitted']/a
-strip: //div[@class='submitted']/a
-convert_double_br_tags: yes
-
-
-
-test_url: http://omiliya.org/content/predchuvstvie.html \ No newline at end of file
diff --git a/data/GrabberConfig/onlinewelten.com.txt b/data/GrabberConfig/onlinewelten.com.txt
deleted file mode 100644
index 1609fa83..00000000
--- a/data/GrabberConfig/onlinewelten.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@id='news_detail']//div[@class='contents clearfix']
-test_url: http://www.onlinewelten.com/games/aliens-colonial-marines/news/offizielle-spiel-ankuendigung-nintendos-wii-u-103690/ \ No newline at end of file
diff --git a/data/GrabberConfig/onstartups.com.txt b/data/GrabberConfig/onstartups.com.txt
deleted file mode 100644
index cccce8cd..00000000
--- a/data/GrabberConfig/onstartups.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip: //div[@id="dnn_LeftPane"] | //div[@id="dnn_ContentPane"]//h1 | //div[@id="dnn_ContentPane"]//p[@class="Normal"] | //div[@class="Submissions"] | //div[@id="listing"]//h3 | //div[@id="listing"][2] | //div[@id="emart-fail"] | //div[@id="emart-success"] | //div[@id="emart-form"]
-test_url: http://onstartups.com/tabid/3339/bid/37737/Secrets-Of-Freemium-Pricing-Make-The-Cheapskates-Pay.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/ontologicalgeek.com.txt b/data/GrabberConfig/ontologicalgeek.com.txt
deleted file mode 100644
index a9bf71ef..00000000
--- a/data/GrabberConfig/ontologicalgeek.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class='entry-title']
-
-author: //a[@rel='author']
-
-date: substring-before(//aside[@class='entry-meta'], '|')
-
-body: //div[@class='entry-content']
-test_url: http://ontologicalgeek.com/change-or-live-final-fantasy-x-as-catholic-dystopia/ \ No newline at end of file
diff --git a/data/GrabberConfig/opensource.org.txt b/data/GrabberConfig/opensource.org.txt
deleted file mode 100644
index 2bd3ccdb..00000000
--- a/data/GrabberConfig/opensource.org.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='content clear-block']
-test_url: http://opensource.org/node/537 \ No newline at end of file
diff --git a/data/GrabberConfig/openthemagazine.com.txt b/data/GrabberConfig/openthemagazine.com.txt
deleted file mode 100644
index 6913eb0e..00000000
--- a/data/GrabberConfig/openthemagazine.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id = 'content-inner']
-strip: //div[@id = 'content-bottom']
-strip_id_or_class: print_sharebutton
-test_url: http://openthemagazine.com/article/nation/sania-vs-saina \ No newline at end of file
diff --git a/data/GrabberConfig/openwebx.org.txt b/data/GrabberConfig/openwebx.org.txt
deleted file mode 100644
index a5dcdb59..00000000
--- a/data/GrabberConfig/openwebx.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class="chapter"]
-prune: no
-tidy: no
-test_url: http://openwebx.org/docs/springext.html \ No newline at end of file
diff --git a/data/GrabberConfig/orf.at.txt b/data/GrabberConfig/orf.at.txt
deleted file mode 100644
index 9eb29c3d..00000000
--- a/data/GrabberConfig/orf.at.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-single_page_link: //div[@id='ss-storyText']//p[@class='readMore']/a
-single_page_link: //div[@id='ss-storyText']//p[contains(., 'Mehr dazu')]/a
-
-title: substring-before(//title,' - ')
-body: //div[@id="ss-storyText"]
-author: substring-before(//div[@id="ss-storyText"]//p[contains(text(), ', ORF.at')], ', ORF.at')
-strip: //div[@id="ss-storyText"]//p[contains(text(), ', ORF.at')]
-date: substring-after(//div[@class='storyMeta socialshare']//p[@class='date'],'Publiziert am')
-strip: //p[@class='date']
-
-strip: //p[@class='credit']
-strip: //p[@class='toplink']
-strip: //div[@id="ss-storyText"]/h1
-strip: //div[@class='socialButtons']
-strip: //div[@class='storyMeta socialshare']
-strip: //div[@class='socialShareWrapper']
-strip: //div[@id='socialshareprivacy']
-strip: //div[@class='storyMeta']
-strip: //div[@class='remote']
-
-prune: no
-tidy: no
-
-test_url: http://orf.at/stories/2317355/
-test_url: http://orf.at/stories/2084731/
-test_url: http://orf.at/stories/2317313/2317311/
-test_url: http://wien.orf.at/news/stories/2746414/
-test_url: http://ooe.orf.at/news/stories/2750613/
-test_url: http://science.orf.at/stories/2774991/
-test_url: http://orf.at/stories/2339962/
-test_url: http://orf.at/stories/2339958/
-test_url: http://help.orf.at/stories/1770242/
diff --git a/data/GrabberConfig/origo.hu.txt b/data/GrabberConfig/origo.hu.txt
deleted file mode 100644
index 50717f25..00000000
--- a/data/GrabberConfig/origo.hu.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: /html/body/div[5]/div[2]/h1
-body: /html/body/div[5]/div[2]/div[6]/div/div
-body: //*[@id="cikk"]
-strip: /html/body/div[5]/div[2]/h1
-strip: /html/body/div[5]/div[2]/div[4]
-strip: //*[@id="multidoboz"]
-strip: /html/body/div[5]/div[2]/div[6]/div[2]
-strip: //*[@id="comments"]
-strip: //*[@id="rating-doboz"]
-strip: /html/body/div[5]/div[2]/div[10]
-strip: /html/body/div[5]/div[2]/a
-strip: /html/body/div[5]/div[2]/span
-strip: /html/body/div[5]/div[2]/span[2]
-strip: /html/body/div[5]/div[2]/span[3]
-strip: /html/body/div[5]/div[2]/span[4]
-strip: /html/body/div[5]/div[2]/span[5]
-strip: //*[@id="kommentszam"]
-test_url: http://www.origo.hu/itthon/20110119-lemondott-a-kulturaert-felelos-helyettes-allamtitkar.html \ No newline at end of file
diff --git a/data/GrabberConfig/oschina.net.txt b/data/GrabberConfig/oschina.net.txt
deleted file mode 100644
index 56451539..00000000
--- a/data/GrabberConfig/oschina.net.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1
-strip_id_or_class: syntaxhighlighter
-test_url: http://www.oschina.net/translate/event-based-programming-what-async-has-over-sync?print \ No newline at end of file
diff --git a/data/GrabberConfig/outsideonline.com.txt b/data/GrabberConfig/outsideonline.com.txt
deleted file mode 100644
index ee559e4a..00000000
--- a/data/GrabberConfig/outsideonline.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class="article__column--right"]
-strip_id_or_class: block-recirc
-strip_id_or_class: social
-strip: //a[@data-pin-custom="true"]
-
-test_url: http://www.outsideonline.com/2108066/emerald-citys-velo-thieves-have-problem-bike-batman
diff --git a/data/GrabberConfig/pakmedia.tv.txt b/data/GrabberConfig/pakmedia.tv.txt
deleted file mode 100644
index 5d6e4c8c..00000000
--- a/data/GrabberConfig/pakmedia.tv.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //h1[@class='entry-title']
-body: //article//div[@class='entry']
-strip_id_or_class: addthis
-strip_id_or_class: gdsrcacheloader
-strip_id_or_class: entry-meta
-strip_id_or_class: entry-tags
-strip_id_or_class: authorbox
-strip: //div[@class='entry']/p[1]
-strip: //img[@width='600' and @height='70']
-# related posts
-strip: //h3[contains(., 'Related posts')]
-strip: //div[contains(@style, 'border: 0pt none ; margin: 0pt; padding: 0pt;')]
-
-prune: no
-tidy: no
-
-test_url: http://pakmedia.tv/tv-one/feed \ No newline at end of file
diff --git a/data/GrabberConfig/palmbeachpost.com.txt b/data/GrabberConfig/palmbeachpost.com.txt
deleted file mode 100644
index a08c39b3..00000000
--- a/data/GrabberConfig/palmbeachpost.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' story-text ')]
-
-test_url: http://www.palmbeachpost.com/news/local/voted-from-space-lone-american-off-planet-casts-ballot/eXKHtCfugZ1ulykswYp9kO/
diff --git a/data/GrabberConfig/pandagon.net.txt b/data/GrabberConfig/pandagon.net.txt
deleted file mode 100644
index 35121e14..00000000
--- a/data/GrabberConfig/pandagon.net.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title://h2
-author://div[@class="posted"]/a
-date://div[@class="date"]
-body://div[@class="entry"]
-test_url: http://pandagon.net/index.php/site/its-okay-to-admit-that-mass-hysteria-is-real \ No newline at end of file
diff --git a/data/GrabberConfig/pandodaily.com.txt b/data/GrabberConfig/pandodaily.com.txt
deleted file mode 100644
index a5d427af..00000000
--- a/data/GrabberConfig/pandodaily.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-tidy: no
-body: //article
-date: //time/@datetime
-strip_id_or_class: sharedaddy
-test_url: http://pandodaily.com/2012/01/19/ibooks-author-is-not-going-to-hurt-publishers-it-might-even-help-them/ \ No newline at end of file
diff --git a/data/GrabberConfig/panic.com.txt b/data/GrabberConfig/panic.com.txt
deleted file mode 100644
index e0e2595c..00000000
--- a/data/GrabberConfig/panic.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='entry']
-date: //h3[@class='postDate']
-test_url: http://www.panic.com/blog/2011/07/panic-is-ready-for-lion/ \ No newline at end of file
diff --git a/data/GrabberConfig/papodehomem.com.br.txt b/data/GrabberConfig/papodehomem.com.br.txt
deleted file mode 100644
index 2c522da4..00000000
--- a/data/GrabberConfig/papodehomem.com.br.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2[@class="page_title"]
-body: //div[@class="entry arquivo"]
-author: //span[@class="author"]
-footnotes: yes
-prune: yes
-test_url: http://papodehomem.com.br/um-relato-confessional-sobre-a-maioridade-penal/ \ No newline at end of file
diff --git a/data/GrabberConfig/parislemon.com.txt b/data/GrabberConfig/parislemon.com.txt
deleted file mode 100644
index cd9bd55d..00000000
--- a/data/GrabberConfig/parislemon.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2[@class="post-title"]
-author: substring-after(//div[@class="description"],'Words by ')
-date: //li[@class="date"]
-strip: //h2[@class="post-title"]
-body: //div[@class="copy"]
-test_url: http://parislemon.com/post/13462682469/the-15-inch-air \ No newline at end of file
diff --git a/data/GrabberConfig/parliament.uk.txt b/data/GrabberConfig/parliament.uk.txt
deleted file mode 100644
index caaa2e94..00000000
--- a/data/GrabberConfig/parliament.uk.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1
-body: //div[@id='news-article']
-test_url: http://www.parliament.uk/business/committees/committees-a-z/commons-select/backbench-business-committee/news/guidance-for-e-petitioners/ \ No newline at end of file
diff --git a/data/GrabberConfig/parool.nl.txt b/data/GrabberConfig/parool.nl.txt
deleted file mode 100644
index 65fc5a98..00000000
--- a/data/GrabberConfig/parool.nl.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-#bypass cookie check
-single_page_link: //a[contains(@href, '/accept?url=')]
-
-test_url: http://www.parool.nl/parool/nl/4/AMSTERDAM/article/detail/4042734/2015/05/29/MRSA-bacterie-niet-verder-verspreid-in-Bijlmerbajes.dhtml
-test_contains: De twee gevangenen die
-
-http_header(user-agent): Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
-
-test_url: http://www.parool.nl/amsterdam/rss.xml
diff --git a/data/GrabberConfig/pastebin.com.txt b/data/GrabberConfig/pastebin.com.txt
deleted file mode 100644
index 03b67b7e..00000000
--- a/data/GrabberConfig/pastebin.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title://div[@class="paste_box_line1"]/h1
-author://div[@class="paste_box_line2"]/a
-body://div[@class="text"]
-date:substring-before(substring-after(//div[@class="paste_box_line2"],'|'),'|')
-dissolve://li
-test_url: http://pastebin.com/LAykd1es \ No newline at end of file
diff --git a/data/GrabberConfig/pastepad.fivefilters.org.txt b/data/GrabberConfig/pastepad.fivefilters.org.txt
deleted file mode 100644
index c535158d..00000000
--- a/data/GrabberConfig/pastepad.fivefilters.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h1
-body: //div[@id='ff-pastepad-content']
-prune: no
-# todo: add test file
-test_url: http://pastepad.fivefilters.org/test.html \ No newline at end of file
diff --git a/data/GrabberConfig/pathawks.com.txt b/data/GrabberConfig/pathawks.com.txt
deleted file mode 100644
index 25042224..00000000
--- a/data/GrabberConfig/pathawks.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title://*[contains(@class,'post-title')]
-body://div[contains(@class,'post-body')]
-body://div[contains(@class,'entry-content')]
-strip_comments:no
-prune:no
-convert_double_br_tags:yes
-tidy:yes
-test_url: http://www.pathawks.com/2011/06/crazyawesomecoloradotrip.html \ No newline at end of file
diff --git a/data/GrabberConfig/pcmag.com.txt b/data/GrabberConfig/pcmag.com.txt
deleted file mode 100644
index 96bdd95a..00000000
--- a/data/GrabberConfig/pcmag.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-prune:yes
-
-date://*[contains(@class,'date')]
-
-body://div[contains(@id,'content')]
-
-next_page_link://a[contains(.,'Next >')]
-
-strip_id_or_class:sponsors
-test_url: http://www.pcmag.com/article2/0,2817,2401676,00.asp \ No newline at end of file
diff --git a/data/GrabberConfig/pcworld.com.txt b/data/GrabberConfig/pcworld.com.txt
deleted file mode 100644
index 7193f87e..00000000
--- a/data/GrabberConfig/pcworld.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-title: //div[@class='articleHead']//h1
-author: //div[@class="author-name"]/a[1]
-body: //div[@class="main"]
-
-# remove 'From the Lab' and 'Recent posts' text
-strip: //div[@class='blogLabel']
-
-# remove byline and meta info
-strip: //h1
-strip: //div[@class="article-meta"]
-strip: //div[@class="author-info"]
-
-#strip tags and categories
-strip: //div[@class="department"]
-
-#strip product cap links
-strip: //div[@class="cap-main"]
-strip: //div[@id="compare-lede"]
-test_url: http://www.pcworld.com/article/262034/are-printer-companies-gouging-us-on-laser-toner-pricing.html \ No newline at end of file
diff --git a/data/GrabberConfig/penny-arcade.com.txt b/data/GrabberConfig/penny-arcade.com.txt
deleted file mode 100644
index a0d5099e..00000000
--- a/data/GrabberConfig/penny-arcade.com.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# 2012-01-14 carlo@... - fixed title, body; added author, date
-
-title: //div[@class="title"]/h2/a
-# body: //div[@class="post"]
-# author: //p[@class="iconEmail"]/a
-# date: //p[@class="iconDate"]
-
-# 1/24/2013 yosoyju - fixed author, date, and body, added support for PA Report
-
-# Penny Arcade
-
-author: //li[@class="iconEmail"]/a
-date: //li[@class="iconDate"]
-body: //div[@class="body"]
-
-# PA Report
-
-author: //div[@class="meta"]/p/a
-date: substring-after(//div[@class="meta"]/p, '/ ')
-title: substring-after(//title, '- ')
-
-test_url: http://penny-arcade.com/2012/01/13/i-put-some-news-in-your-news
-test_url: http://penny-arcade.com/report/editorial-article/the-dystopian-future-of-casual-games-personalized-targeted-pricing-and-mech \ No newline at end of file
diff --git a/data/GrabberConfig/pentaxforums.com.txt b/data/GrabberConfig/pentaxforums.com.txt
deleted file mode 100644
index 00f61a48..00000000
--- a/data/GrabberConfig/pentaxforums.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-next_page_link: //a[contains(., 'Next:')]
-test_url: http://www.pentaxforums.com/reviews/long-exposure-handhelds/introduction.html \ No newline at end of file
diff --git a/data/GrabberConfig/perthnow.com.au.txt b/data/GrabberConfig/perthnow.com.au.txt
deleted file mode 100644
index b0ce56c5..00000000
--- a/data/GrabberConfig/perthnow.com.au.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-#body: //div[@class='story-body']
-body: //div[contains(@class, 'story-body')]
-title: //div[@class='story-headline']//h1
-author: //cite[contains(@class, 'author')]
-date: //span[@class='datestamp']
-
-strip_id_or_class: story-info
-strip: //div[contains(@class, 'story-promo')]
-strip: //div[contains(@class, 'story-related')]
-
-prune: no
-tidy: no
diff --git a/data/GrabberConfig/phastidio.net.txt b/data/GrabberConfig/phastidio.net.txt
deleted file mode 100644
index ae06172d..00000000
--- a/data/GrabberConfig/phastidio.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fphastidio.net%2F2015%2F11%2F10%2Fa-sportellate-sul-renzismo%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-test_url: http://phastidio.net/2015/11/10/a-sportellate-sul-renzismo/
diff --git a/data/GrabberConfig/philadelphiaeagles.com.txt b/data/GrabberConfig/philadelphiaeagles.com.txt
deleted file mode 100644
index 5ba5f772..00000000
--- a/data/GrabberConfig/philadelphiaeagles.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-prune: no
-tidy: no
-body: //div[@class='article-content']
-dissolve: //nobr/a
-dissolve: //nobr
-test_url: http://www.philadelphiaeagles.com/news/article-1/Jacksons-Light-Shined-On-Sunday-Night/51a862de-42b4-40f1-a5a8-ba0fb8a435b7 \ No newline at end of file
diff --git a/data/GrabberConfig/philly.com.txt b/data/GrabberConfig/philly.com.txt
deleted file mode 100644
index 4e04d56a..00000000
--- a/data/GrabberConfig/philly.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //h1[@class='entry-title']
-author: //p[@class='byline']/span
-body: //div[contains(@class, 'body-content')]
-date: //div[@class='article_timestamp']/span
-
-strip_id_or_class: related-links
-
-strip: //@class=b-group
-strip: //*[contains(@style, 'none')]
-strip: //a[contains(@href, 'comments')]
-strip: //*[contains(@class, 'comment')]
-test_url: http://www.philly.com/philly/blogs/sports/eagles/Davis-Happy-For-Kendricks.html
-test_url: http://www.philly.com/philly/sports/eagles/20120127_Ohio_State_s_Posey_didn_t_waste_time_lost_to_suspension.html \ No newline at end of file
diff --git a/data/GrabberConfig/phonandroid.com.txt b/data/GrabberConfig/phonandroid.com.txt
deleted file mode 100644
index 138cf19f..00000000
--- a/data/GrabberConfig/phonandroid.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //section[@class='content-txt']
-title: //h1[@class='entry-title']
-author: //span[@class='author']
-date: //span[@class='infos']/time/@datetime
-
-prune: no
-test_url: http://www.phonandroid.com/marche-tablettes-encore-pris-belle-claque-2015.html
-test_url: http://krugman.blogs.nytimes.com/2012/09/12/a-vote-of-confidence/
-test_url: http://bits.blogs.nytimes.com/2012/01/16/wikipedia-plans-to-go-dark-on-wednesday-to-protest-sopa/
diff --git a/data/GrabberConfig/phoronix.com.txt b/data/GrabberConfig/phoronix.com.txt
deleted file mode 100644
index e7dd21c1..00000000
--- a/data/GrabberConfig/phoronix.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# based on the grabber rules of picofeed
-
-body: //div[@class="content"]/child::node()
-test_url: http://www.phoronix.com/scan.php?page=article&item=amazon_ec2_bare&num=1
-
-# replace_string(<h5>): <h2>
-
-next_page_link: //a[@title='Go To Next Page']
diff --git a/data/GrabberConfig/photo.tutsplus.com.txt b/data/GrabberConfig/photo.tutsplus.com.txt
deleted file mode 100644
index 7f7e3830..00000000
--- a/data/GrabberConfig/photo.tutsplus.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-author: substring-before(//div[@class='post_meta'],' on')
-date: substring-after(substring-before(//div[@class='post_meta'],'with'),' on')
-title: //h1[class='post_title']
-body: //div[@class='article']
-
-test_url: http://photo.tutsplus.com/articles/news/a-brilliant-beginners-guide-to-architectural-photography/ \ No newline at end of file
diff --git a/data/GrabberConfig/php.net.txt b/data/GrabberConfig/php.net.txt
deleted file mode 100644
index cc643f05..00000000
--- a/data/GrabberConfig/php.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='content']
-strip_id_or_class: manualnavbar
-
-prune: no
-
-test_url: http://www.php.net/manual/en/migration5.incompatible.php \ No newline at end of file
diff --git a/data/GrabberConfig/pieria.co.uk.txt b/data/GrabberConfig/pieria.co.uk.txt
deleted file mode 100644
index 31f2c84a..00000000
--- a/data/GrabberConfig/pieria.co.uk.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='article']
-
-test_url: http://www.pieria.co.uk/articles/need_a_fiscal_rule_george__try_get_the_economy_growing
diff --git a/data/GrabberConfig/pinterest.com.txt b/data/GrabberConfig/pinterest.com.txt
deleted file mode 100644
index b35c00f6..00000000
--- a/data/GrabberConfig/pinterest.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //title
-body: //div[contains(@class, 'imageContainer')]
-
-test_url: http://pinterest.com/pin/380906080954441188/
-test_url: http://pinterest.com/michaelsorm/architecture.rss
diff --git a/data/GrabberConfig/pitchfork.com.txt b/data/GrabberConfig/pitchfork.com.txt
deleted file mode 100644
index eee96a9c..00000000
--- a/data/GrabberConfig/pitchfork.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title:concat(//h1,' - ',//h2,' - ',//h3)
-author://address
-date://span[@class='pub-date']
-body://div[@id='main']
-single_page_link://link[@rel='canonical']
-strip://div[@class='info']
-strip_id_or_class:'object-grid related-content'
-strip_id_or_class:'object-prevnext'
-strip_id_or_class:'object-header'
-strip_id_or_class:'source'
-strip_id_or_class:'label'
-strip_id_or_class:'title'
-dissolve://ul
-strip://li[@class='next']
-strip://li[@class='prev']
-test_url: http://pitchfork.com/features/why-we-fight/8796-on-the-far-slope-of-the-uncanny-valley/ \ No newline at end of file
diff --git a/data/GrabberConfig/pittsburgh.pirates.mlb.com.txt b/data/GrabberConfig/pittsburgh.pirates.mlb.com.txt
deleted file mode 100644
index f2948528..00000000
--- a/data/GrabberConfig/pittsburgh.pirates.mlb.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: substring-before(//title,'pirates.com')
-date: //span[@class='timeStamp']
-author: substring-before(substring-after(//div[@class='byLine'],'By'),'/')
-body: //div[@id='article']
-#strip: //div[@class='inner']
-strip: //div[@id='article_head']
-strip: //p[@class='tagLine']
-strip: //div[@id='article_related_links']
-strip: //div[@id='article_related_mlb']
-strip: //div[@id='article_related_club']
-strip: //span[@class='more']
-strip: //div[@class='article_component']
-strip: //span[@class='screen_reader']
-strip: //ul[@class='columnists_blurb']
-test_url: http://pittsburgh.pirates.mlb.com/news/article.jsp?ymd=20120330&content_id=27759040&vkey=news_pit&c_id=pit \ No newline at end of file
diff --git a/data/GrabberConfig/pittsburghlive.com.txt b/data/GrabberConfig/pittsburghlive.com.txt
deleted file mode 100644
index cc7891f3..00000000
--- a/data/GrabberConfig/pittsburghlive.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: substring-before(//title,'- Pittsburgh Tribune')
-author: substring-before(substring-after(//div[@class='byline'],'By '),',')
-date: substring-after(substring-after(//div[@class='byline'],','),',')
-body: //div[@id='storyBody']
-strip: //div[@class='morestories']
-dissolve: //p[@class='subheader']
-test_url: http://www.pittsburghlive.com/x/pittsburghtrib/sports/columnists/s_785654.html \ No newline at end of file
diff --git a/data/GrabberConfig/pittsburghmagazine.com.txt b/data/GrabberConfig/pittsburghmagazine.com.txt
deleted file mode 100644
index 4d02f6bb..00000000
--- a/data/GrabberConfig/pittsburghmagazine.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //title
-author: substring-after(//div[@class='by-line'],'BY')
-
-body: //div[@id='article-body']
-
-strip: //div[@class='by-line']
-strip: //div[@id='article-body']/h1
-test_url: http://www.pittsburghmagazine.com/Pittsburgh-Magazine/May-2012/Verde-Lights-the-Night/ \ No newline at end of file
diff --git a/data/GrabberConfig/pittsburghpanthers.com.txt b/data/GrabberConfig/pittsburghpanthers.com.txt
deleted file mode 100644
index c372284a..00000000
--- a/data/GrabberConfig/pittsburghpanthers.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //span[@class='StoryHeadline']
-strip: //div[@class='fivevert']
-body: //div[@id='Content']
-test_url: http://www.pittsburghpanthers.com/sports/m-baskbl/recaps/031412aaa.html \ No newline at end of file
diff --git a/data/GrabberConfig/pittscriptblog.com.txt b/data/GrabberConfig/pittscriptblog.com.txt
deleted file mode 100644
index 571874a4..00000000
--- a/data/GrabberConfig/pittscriptblog.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class='articletitle']
-author: substring-after(//span[@class='author'],'by')
-date: //span[@class='created']
-body: //div[@class='article']
-strip: //div[@class='headline']
-strip: //p[@class='articleinfo']
-#dissolve: //p[@class='subheader']
-test_url: http://www.pittscriptblog.com/2012-articles/march/2012-football-opponents-set-and-the-attendance-dilemma.html \ No newline at end of file
diff --git a/data/GrabberConfig/pjmedia.com.txt b/data/GrabberConfig/pjmedia.com.txt
deleted file mode 100644
index 214e858e..00000000
--- a/data/GrabberConfig/pjmedia.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-find_string:display:none
-replace_string: ..
-
-single_page_link: //div[@class='single-page-button']//a
-
-test_url:
-https://pjmedia.com/eddriscoll/2016/08/31/tom-wolfe-kingdom-of-speech/
diff --git a/data/GrabberConfig/planet3dnow.de.txt b/data/GrabberConfig/planet3dnow.de.txt
deleted file mode 100644
index 23db6b00..00000000
--- a/data/GrabberConfig/planet3dnow.de.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-# Author: Jan Lukas Gernert
-
-tidy: no
-prune: no
-
-title: //title
-author: //span[@class='author vcard']/a
-
-body: //article
-next_page_link: //span[@class='multipage-navlink nav-next']/a
-
-strip: //div[@id='pagination_top']
-strip: //header[@class='entry-header']
-strip: //span[@class='multipage-navlink nav-previous']
-
-test_url: http://www.planet3dnow.de/cms/14809-test-fractal-design-node-804/
diff --git a/data/GrabberConfig/planetsave.com.txt b/data/GrabberConfig/planetsave.com.txt
deleted file mode 100644
index d6f34e22..00000000
--- a/data/GrabberConfig/planetsave.com.txt
+++ /dev/null
@@ -1 +0,0 @@
-strip_id_or_class: author-bio-box
diff --git a/data/GrabberConfig/planetvita.de.txt b/data/GrabberConfig/planetvita.de.txt
deleted file mode 100644
index bfc3342d..00000000
--- a/data/GrabberConfig/planetvita.de.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@id='frnRahmen']/div/div[@id='content']/div[2]/h2
-author: //div[@id='content']/div[1]/div/a
-body: //div[@id='content']/div[2]/span
-strip: //div[@id='commenthead']
-test_url: http://www.planetvita.de/news/10389-psn-store-update-vom-03-april-neue-inhalte-fuer-psvita.html \ No newline at end of file
diff --git a/data/GrabberConfig/playboy.com.txt b/data/GrabberConfig/playboy.com.txt
deleted file mode 100644
index 92834947..00000000
--- a/data/GrabberConfig/playboy.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-author: //article//*[@class="author"]
-date: //article//*[@class="publication-date"]
-body: //article
-strip: //article/header
-strip: //article/section
-test_url: http://www.playboy.com/playground/view/playboy-interview-jon-hamm \ No newline at end of file
diff --git a/data/GrabberConfig/ploum.net.txt b/data/GrabberConfig/ploum.net.txt
deleted file mode 100644
index bbd454ae..00000000
--- a/data/GrabberConfig/ploum.net.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //article[contains(concat(' ',normalize-space(@class),' '),' post ')]
-
-strip_id_or_class: readoffline-embed
-strip_id_or_class: fasteasysocialsharing
-strip_id_or_class: entry-tags
-strip_id_or_class: entry-author-bottom
-
-test_url: https://ploum.net/sunrise-le-calendrier-du-futur/
diff --git a/data/GrabberConfig/plus.google.com.txt b/data/GrabberConfig/plus.google.com.txt
deleted file mode 100644
index ea36f5b7..00000000
--- a/data/GrabberConfig/plus.google.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' Ig ')]//div//div[contains(concat(' ',normalize-space(@class),' '),' Ct ')]
-
-author: //div[@id='contentPane']//h3//a[@rel="author"]/@content
-
-strip: //*[@title="People who +1'd this"]/../..
-strip: //*[contains(@class, 'a-b-f-i-Hg-Uf')]
-strip: //*[@role='menu']
-strip: //img[contains(@alt, 'profile photo')]
-strip: //*[@class='a-f-i-Ad']
-
-tidy: no
-
-test_url: http://plus.google.com/u/0/117840649766034848455/posts/FddaP6jeCqp
-test_url: https://plus.google.com/+googleplus/posts/d1XubVAZ5hV
diff --git a/data/GrabberConfig/plzkthxbai.com.txt b/data/GrabberConfig/plzkthxbai.com.txt
deleted file mode 100644
index ec151b42..00000000
--- a/data/GrabberConfig/plzkthxbai.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h2[@class='jcw-pagetitle'
-date: //p[@class='postinfo']
-body: //div[@class='contenttext']
-test_url: http://plzkthxbai.com/blog/2011/06/28/1password-and-internet-security/ \ No newline at end of file
diff --git a/data/GrabberConfig/pogue.blogs.nytimes.com.txt b/data/GrabberConfig/pogue.blogs.nytimes.com.txt
deleted file mode 100644
index 65ddba54..00000000
--- a/data/GrabberConfig/pogue.blogs.nytimes.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id="content"]/div[1]
-
-title: //h1[@class="entry-title"]
-test_url: http://pogue.blogs.nytimes.com/2011/05/12/the-future-of-skype/ \ No newline at end of file
diff --git a/data/GrabberConfig/politico.com.txt b/data/GrabberConfig/politico.com.txt
deleted file mode 100644
index d8f5e575..00000000
--- a/data/GrabberConfig/politico.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title://div[contains(@class, "article")]/h1
-body://div[contains(@class,"story-text")]
-
-# Why doesn't this work? next_page_link://ul[contains(@class,"pagination")]/li/a[@rel="next"]
-
-next_page_link://ul[contains(@class,"pagination")]/li[contains(@class, "current")]/following-sibling::node()/a
-date://meta[@name="publish_date"]/@content
-
-strip://div[contains(@class, "breadcrumbs")]
-strip://a[contains(@class, "hidden")]
-strip://div[contains(@class, "story-embed")]
-strip://div[contains(@class, "story-text")]//p/a[contains(text(), "Also on POLITICO:")]/..
-test_url: http://www.politico.com/news/stories/0712/78105.html \ No newline at end of file
diff --git a/data/GrabberConfig/politifact.com.txt b/data/GrabberConfig/politifact.com.txt
deleted file mode 100644
index 65a8fc57..00000000
--- a/data/GrabberConfig/politifact.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id="content"]
-
-strip: //div[@class="pfcontentmid"]/div[position()>4]|//div[@class="pfad"]
-test_url: http://www.politifact.com/truth-o-meter/statements/2011/may/30/barbara-boxer/barbara-boxer-says-medicare-overhead-far-lower-pri/ \ No newline at end of file
diff --git a/data/GrabberConfig/politiken.dk.txt b/data/GrabberConfig/politiken.dk.txt
deleted file mode 100644
index b13f8f87..00000000
--- a/data/GrabberConfig/politiken.dk.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# 21/10-2011:
-# Added Author+Date
-# Remove fakta-boks if found
-# Deleted 'Læs også...' filter
-# - Change in markup caused it to strip too much.
-
-author://span[@class='autor-name']
-date:substring-after(//div[@class='art-created'], ' ')
-title: //h1[contains(@class, 'stor-type')]
-body: //div[@id='art-body']
-strip: //div[@class='art-fakta article-box']
-
-test_url: http://politiken.dk/kultur/boger/skonlitteratur_boger/ECE1426386/makabre-tegneserie-zombier-aeder-alt-levende/ \ No newline at end of file
diff --git a/data/GrabberConfig/polygon.com.txt b/data/GrabberConfig/polygon.com.txt
deleted file mode 100644
index 8fe9b1be..00000000
--- a/data/GrabberConfig/polygon.com.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-body: //div[@id='article-content']
-body: //article[@id='entry-top']/div[@class='float_wrapper']
-author: //header/p[@class='byline']/em/a
-date: //header/p[@class='byline']/span[@class='timestamp']
-
-strip: //div[@id='article-content']//header
-strip: //label
-
-#photos on left column (delete all)
-strip: //div[@class='big_photo']
-
-#photos on left column (remove extras used for scroll effect)
-#strip: //div[@class='big_photo']/div[./img]
-#strip: //div[@class='big_photo']/img[position()>1]
-
-strip_id_or_class: vox-lazy-load
-strip_id_or_class: social_buttons
-strip_id_or_class: feature_toc
-
-prune: no
-
-find_string: <noscript>
-replace_string: <div>
-find_string: </noscript>
-replace_string: </div>
-
-#find_string: <script
-#replace_string: <div style="display:none"
-#find_string: </script>
-#replace_string: </div>
-
-strip: //div[@class='float_wrapper']/header
-test_url: http://www.polygon.com/2013/4/5/4189028/donkey-kong-country-returns-3d-new-content
-test_url: http://www.polygon.com/features/2013/8/22/4602568/30-years-xbox-360-playstation-3-wii \ No newline at end of file
diff --git a/data/GrabberConfig/popehat.com.txt b/data/GrabberConfig/popehat.com.txt
deleted file mode 100644
index 45b76ae1..00000000
--- a/data/GrabberConfig/popehat.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='entry-title']
-author: //div[@class='entry-author']
-date: //div[@class='entry-time']
-body: //div[@class='entry-content']
-
-test_url: https://popehat.com/2015/12/16/eric-posner-the-first-amendments-nemesis/
diff --git a/data/GrabberConfig/popsci.com.txt b/data/GrabberConfig/popsci.com.txt
deleted file mode 100644
index 2a928e26..00000000
--- a/data/GrabberConfig/popsci.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[contains(@class, 'field-body')]
-strip_image_src: placeholder
-find_string: <noscript>
-replace_string: <div>
-find_string: </noscript>
-replace_string: </div>
-
-prune: no
-
-test_url: http://www.popsci.com/nasa-crashed-another-plane-today
-test_url: http://www.popsci.com/rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/popularmechanics.com.txt b/data/GrabberConfig/popularmechanics.com.txt
deleted file mode 100644
index 2582e6fb..00000000
--- a/data/GrabberConfig/popularmechanics.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-next_page_link: //div[@id='longPagination']/a[@class='next']
-
-title: //div[@id='contentHeader']//h1
-
-body: //div[@id='articleBody']
-# this is so sad
-body: //div[@id='intelliTXT']
-test_url: http://www.popularmechanics.com/technology/aviation/crashes/what-really-happened-aboard-air-france-447-6611877 \ No newline at end of file
diff --git a/data/GrabberConfig/portertech.ca.txt b/data/GrabberConfig/portertech.ca.txt
deleted file mode 100644
index 2897cb57..00000000
--- a/data/GrabberConfig/portertech.ca.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-author: //*[(@class = "author")]
-date: //*[(@class = "date")]
-test_url: http://portertech.ca/2012/12/10/iac-morning-market/ \ No newline at end of file
diff --git a/data/GrabberConfig/positioningmag.com.txt b/data/GrabberConfig/positioningmag.com.txt
deleted file mode 100644
index f8eeb0a3..00000000
--- a/data/GrabberConfig/positioningmag.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-title: //div[@id="newsDetailTitle"]
-author: //span[@id="showAuthor"]
-date: //span[@id="showRefDate"]
-
-strip: //div[@id="breadcrumbs"]
-strip: //span[@id="PageTitle"]
-strip: //div[@id="newsDetailAuthorPublish"]
-
-strip: //div[@class="leadPix"]
-
-strip: //span[@id="ctl00_PageTitle"]
-strip: //div[@id="newsDetailTitle"]
-convert_double_br_tags:yes
-
-strip: //div[@id="newsDetailCredential"]
-strip: //div[@id="sidebar2"]
-strip: //div[@id="footer"]
-
-test_url: http://www.positioningmag.com/magazine/details.aspx?id=41083 \ No newline at end of file
diff --git a/data/GrabberConfig/post-gazette.com.txt b/data/GrabberConfig/post-gazette.com.txt
deleted file mode 100644
index baa9d69d..00000000
--- a/data/GrabberConfig/post-gazette.com.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-title: //div[@class='story_headline']
-author: substring-before(substring-after(//div[@class='story_byline'],'By'),'/')
-date: //div[@class='story_lastupdate']
-body: //div[@id='story']
-strip: //div[@class='story_byline']
-strip: //div[@class='story_lastupdate']
-strip: //div[@class='story_headline']
-strip: //div[@id='abuse']
-strip: //h2
-strip: //div[@class='pagenumbers_wrap']
-strip: //ul[@class='pagenumbers']
-strip: //div[starts-with(., 'To report inappropriate comments')]
-
-strip_id_or_class: story_share
-strip_id_or_class: OUTBRAIN
-strip_id_or_class: story_box_right
-strip: //div[a[@href='http://www.post-gazette.com/pg/12062/1213990-42.stm']]
-strip: //ul[@id='pikame']/li[position()>1]
-
-prune: no
-tidy: no
-
-single_page_link: //a[contains(@href, '?p=0')]
-
-test_url: http://www.post-gazette.com/stories/sports/penguins/pens-crosby-expects-to-return-thursday-226648/
-test_url: http://www.post-gazette.com/stories/sports/pirates/pirates-fork-over-changes-for-fans-at-pnc-park-629789 \ No newline at end of file
diff --git a/data/GrabberConfig/posta.com.tr.txt b/data/GrabberConfig/posta.com.tr.txt
deleted file mode 100644
index 0f01149c..00000000
--- a/data/GrabberConfig/posta.com.tr.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: //div[@id='divAdnetKeyword']/h1
-body: //div[@id='_middle_content_bottom']
-
-wrap_in(fieldset)://div[@id='_middle_content_bottom_child2']/img
-
-strip: //div[@id='_middle_content_bottom_child1']
-strip: //div[@id='_middle_content_bottom_child4']
-strip: //div[@class='cls']
-strip: //div[@class='iphoneBox']
-strip: //ul[@class='ilgiliHaber']
-strip: //div[@class='yorumlar']
-strip: //div[@class='kategoriler']
-strip: //div[@class='textSize']
-strip: //span[@class='tarih']
-test_url: http://www.posta.com.tr/yasam/teknoloji/HaberDetay/Fedailer_Istanbul_da.htm?ArticleID=101044 \ No newline at end of file
diff --git a/data/GrabberConfig/prb.org.txt b/data/GrabberConfig/prb.org.txt
deleted file mode 100644
index 3952ea99..00000000
--- a/data/GrabberConfig/prb.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1
-date: /html/head/meta[@name="date"]/@content
-body: //div[@id="featuredlinksbox"]
-strip: //div[@class="relatedbox"]
-strip: //h1
-strip: //br
-strip_image_src: "/images"
-test_url: http://www.prb.org/Journalists/Webcasts/2011/military-families.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/presse-citron.net.txt b/data/GrabberConfig/presse-citron.net.txt
deleted file mode 100644
index 6262ab8c..00000000
--- a/data/GrabberConfig/presse-citron.net.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //header[@class='post-header cf']/h1[@class='post-title']
-author: //div[@class="post-meta"]/span[@class='posted-by']/span[@class='reviewer']/a
-date: //div[@class="post-meta"]/span[@class='posted-on']/span[@class='dtreviewed']/time/@datetime
-body: //div[@class="post-content description"]
-
-strip: //div[@id="essb_links essb_counters essb_displayed_bottom essb_share essb_template_fancy-retina essb_1179534949 essb_links_right print-no"]
-strip: //div[@class="tagcloud"]
-
-test_url: http://www.presse-citron.net/voici-comment-vous-pourrez-customiser-vos-fils-dactualite-facebook/
diff --git a/data/GrabberConfig/presseportal.de.txt b/data/GrabberConfig/presseportal.de.txt
deleted file mode 100644
index 703806d8..00000000
--- a/data/GrabberConfig/presseportal.de.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' story-text ')]
-
-strip_id_or_class: news-bodycopy
-
-parser: html5php
-tidy: no
-
-test_url: http://www.presseportal.de/pm/103258/2930232/felix-neureuther-vor-der-ski-wm-ich-denke-von-rennen-zu-rennen
-test_url: http://www.presseportal.de/pm/66749/2933779/koelner-stadt-anzeiger-bahnmitarbeiter-werden-in-nrw-immer-haeufiger-angegriffen-zahl-der/rss
-test_contains: kleineren Bahnhöfen installieren und erhofft
-test_url: http://www.presseportal.de/rss/presseportal.rss2
diff --git a/data/GrabberConfig/pro-linux.de.txt b/data/GrabberConfig/pro-linux.de.txt
deleted file mode 100644
index 57bf7010..00000000
--- a/data/GrabberConfig/pro-linux.de.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-tidy: no
-prune: no
-
-title: //h2[@class='title']
-date: //div[@class='tidescr']
-
-body: //div[@id='article']
-body: //div[@id='news']
-
-next_page_link: //a[@title='nächste']
-
-strip: //div[@class='topic']
-strip: //h2[@class='title']
-strip: //div[a[contains(@href,'/user/')]]
-strip: //div[@class='picto']
-strip: //p[@class='addinfo']
-strip: //h3[@class='topic']
-
-test_url: http://www.pro-linux.de/artikel/2/1762/ubuntu-und-kubuntu-1504.html
diff --git a/data/GrabberConfig/prog21.dadgum.com.txt b/data/GrabberConfig/prog21.dadgum.com.txt
deleted file mode 100644
index 9a49557e..00000000
--- a/data/GrabberConfig/prog21.dadgum.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1
-body: //div[@id='left']
-strip: //h1
-convert_double_br_tags: yes
-strip_id_or_class: entry-footer
-strip: //h1[. = 'Previously']/following::*
-author: string('James Hague')
-date: //div[@class = 'entry-footer']/text()
-test_url: http://prog21.dadgum.com/105.html \ No newline at end of file
diff --git a/data/GrabberConfig/prolost.com.txt b/data/GrabberConfig/prolost.com.txt
deleted file mode 100644
index 82ebf6bb..00000000
--- a/data/GrabberConfig/prolost.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='body']
-title: //h2[@class='title']
-date: //span[@class='posted-on']
-test_url: http://prolost.com/blog/2011/10/13/real-men-comp-with-film.html \ No newline at end of file
diff --git a/data/GrabberConfig/propublica.org.txt b/data/GrabberConfig/propublica.org.txt
deleted file mode 100644
index d141ac90..00000000
--- a/data/GrabberConfig/propublica.org.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[@class="article-title"]
-author: //meta[@name="author"]/@content
-body: //div[@class="article-full"]
-strip_id_or_class: sidebar_inject
-strip_id_or_class: callout
-strip_id_or_class: content-inset
-strip_id_or_class: byline-block
-strip_id_or_class: photo-caption
-strip_id_or_class: foot-tools
-
-test_url: http://www.propublica.org/article/pardon-applicants-benefit-from-friends-in-high-places \ No newline at end of file
diff --git a/data/GrabberConfig/prosa.dk.txt b/data/GrabberConfig/prosa.dk.txt
deleted file mode 100644
index ba9ce8b8..00000000
--- a/data/GrabberConfig/prosa.dk.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //p[@class='name']
-date: substring-before(//p[@class='date'], ' | ')
-body: //div[@class='news_single_item']
-test_url: http://www.prosa.dk/aktuelt/nyhed/artikel/internetaktivisten-uden-maske/ \ No newline at end of file
diff --git a/data/GrabberConfig/prospectmagazine.co.uk.txt b/data/GrabberConfig/prospectmagazine.co.uk.txt
deleted file mode 100644
index 739d1b9e..00000000
--- a/data/GrabberConfig/prospectmagazine.co.uk.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-#basics
-author: (//div[contains(@class,'author')])[1]
-date: substring-before(//a[@class='issue'], '&mdash;')
-#body://div[@class = 'entry']
-# use this until move_into support is ready
-body: //div[@class = 'entry' or @class='standfirst' or @class='lead_image']
-
-#moves header image and tagline into body
-move_into(//div[@class='entry']/div)://div[@class = 'lead_image']
-move_into(//div[@class='entry']/div)://div[@class = 'standfirst']
-
-
-# moves author info to end of text
-move_into(//p[strong[string(.) = 'Follow Prospect on Twitter']])://div[@id='sidebar_content']/p/em
-
-prune: no
-
-# strips social links
-strip_id_or_class:login-status
-strip_id_or_class:shareinpost
-strip_id_or_class:content_subscribe
-strip_id_or_class:postinfo
-strip_id_or_class:postutils
-strip_id_or_class:comments
-strip://strong[string(.) = 'Follow Prospect on Twitter']
-test_url: http://www.prospectmagazine.co.uk/2011/07/postmodernism-is-dead-va-exhibition-age-of-authenticism/ \ No newline at end of file
diff --git a/data/GrabberConfig/protothema.gr.txt b/data/GrabberConfig/protothema.gr.txt
deleted file mode 100644
index fae261b0..00000000
--- a/data/GrabberConfig/protothema.gr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //a[contains(@rel, 'mainphotos')] | //div[contains(@class, 'article-content')]
-
-prune: no
-
-test_url: http://www.protothema.gr//politics/article/326464/diamadopoulou-floridis-kaminis-kai-boutaris-se-ekdilosi-ton-europaion-fileleutheron/
-test_url: http://www.protothema.gr/rss/news/politics/ \ No newline at end of file
diff --git a/data/GrabberConfig/psychologytoday.com.txt b/data/GrabberConfig/psychologytoday.com.txt
deleted file mode 100644
index 1bb63c29..00000000
--- a/data/GrabberConfig/psychologytoday.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@class="page-title"]/h1
-author: //a[@title="View Bio"]
-date: substring-before(substring-after(//span[@class="submitted"], 'Published on '), ' by')
-strip://div[@class="page-title"]/h1
-strip://div[@class="article-abstract"]
-strip://div[@class="article-meta"]
-strip://div[@id="rightColumn"]
-strip://div[@id="inline-content-bottom-left"]
-test_url: http://www.psychologytoday.com/blog/how-happiness/201205/my-quibble-facebook \ No newline at end of file
diff --git a/data/GrabberConfig/publications.parliament.uk.txt b/data/GrabberConfig/publications.parliament.uk.txt
deleted file mode 100644
index 8f32d7a4..00000000
--- a/data/GrabberConfig/publications.parliament.uk.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //meta[@name="Author"]
-date: //meta[@name="Date"]
-strip: //h5
-test_url: http://www.publications.parliament.uk/pa/ld201011/ldhansrd/text/111109-0003.htm \ No newline at end of file
diff --git a/data/GrabberConfig/publico.pt.txt b/data/GrabberConfig/publico.pt.txt
deleted file mode 100644
index bb6a05e1..00000000
--- a/data/GrabberConfig/publico.pt.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h1[@class="entry-title"]
-author: //span[@class="author"]
-body: //article[@itemtype="http://schema.org/Article"]
-date: //time[@itemprop="dateCreated"]
-
-strip: //header[@class="entry-header single-header"]
-strip: //aside[@class="entry-assets"]
-strip: //div[@class="entry-options entry-options-above group"]
-strip: //div[@class="entry-options entry-options-below group"]
-
-convert_double_br_tags: yes
-test_url: http://www.publico.pt/politica/noticia/passos-diz-que-se-limitacao-de-mandatos-fosse-para-todos-os-concelhos-estaria-claro-na-lei-1577691 \ No newline at end of file
diff --git a/data/GrabberConfig/purpleplanetmedia.com.txt b/data/GrabberConfig/purpleplanetmedia.com.txt
deleted file mode 100644
index 0f1392a4..00000000
--- a/data/GrabberConfig/purpleplanetmedia.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //div[@class='title']
-body: //div[@class='body']
-next_page_link: //div[@class='source']/text()[contains(., 'page')]/following-sibling::a
-test_url: http://purpleplanetmedia.com/eye/inte/ngaiman.php \ No newline at end of file
diff --git a/data/GrabberConfig/putaindecode.io.txt b/data/GrabberConfig/putaindecode.io.txt
deleted file mode 100644
index 45825935..00000000
--- a/data/GrabberConfig/putaindecode.io.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fputaindecode.io%2Ffr%2Farticles%2Ffavicon%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' putainde-Post-md ')]//div
-test_url: http://putaindecode.io/fr/articles/favicon/
diff --git a/data/GrabberConfig/pymotw.com.txt b/data/GrabberConfig/pymotw.com.txt
deleted file mode 100644
index 0f9db08e..00000000
--- a/data/GrabberConfig/pymotw.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[starts-with(@id, 'module-')]
-
-test_url: https://pymotw.com/3/configparser/
-test_url: https://pymotw.com/3/shlex/
-test_url: https://pymotw.com/3/sys/
diff --git a/data/GrabberConfig/pérotin.com.txt b/data/GrabberConfig/pérotin.com.txt
deleted file mode 100644
index 7784fa4c..00000000
--- a/data/GrabberConfig/pérotin.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=xn--protin-bva.com%2Fpost%2F2009%2F06%2F09%2FSAV-Free-un-sketch-kafkaien
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' post ')]
-test_url: http://xn--protin-bva.com/post/2009/06/09/SAV-Free-un-sketch-kafkaien
diff --git a/data/GrabberConfig/qctimes.com.txt b/data/GrabberConfig/qctimes.com.txt
deleted file mode 100644
index 3c3edfeb..00000000
--- a/data/GrabberConfig/qctimes.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-# this site seems to work OK in the web view, but only occasionally in the instapaper app itself.
-
-body: //div[@class='entry-content']
-author: //span[@class='byline']
-test_url: http://qctimes.com/news/local/woman-faces-perjury-charges-in-meth-case/article_83f4c470-956a-11e2-a921-001a4bcf887a.html \ No newline at end of file
diff --git a/data/GrabberConfig/quantumdiaries.org.txt b/data/GrabberConfig/quantumdiaries.org.txt
deleted file mode 100644
index c17fb312..00000000
--- a/data/GrabberConfig/quantumdiaries.org.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //div[contains(@class, "hentry")]/h3
-
-author: //div[contains(@class, "hentry")]/h2[contains(@class, "author_bio")]
-
-date: substring-before(substring-after(normalize-space(//p[contains(@class, "postmetadata")]/small), "was posted on "), " and is filed under")
-
-body: //div[contains(@class, "entry")]
-
-strip_id_or_class: addtoany_share_save_container
-strip_id_or_class: postmetadata
-strip_id_or_class: author_bio
-strip_id_or_class: author_bio_2
-strip: //div[contains(@class, "hentry")]/h3
-test_url: http://www.quantumdiaries.org/2011/10/25/piling-up/ \ No newline at end of file
diff --git a/data/GrabberConfig/quechoisir.org.txt b/data/GrabberConfig/quechoisir.org.txt
deleted file mode 100644
index a8bacdb7..00000000
--- a/data/GrabberConfig/quechoisir.org.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1[@id='titre']
-body://h2[@id="surtitre"]|//div[@id="ctn_introarticle"]|//div[@class="ctn_globalcontent"]
-
-strip_id_or_class: qc-container-main
-strip_id_or_class: article_footer
-
-tidy: no
-prune: no
-
-test_url: http://www.quechoisir.org/alimentation/securite-hygiene/actualite-acrylamide-un-contaminant-trop-present-dans-nos-assiettes
diff --git a/data/GrabberConfig/queerty.com.txt b/data/GrabberConfig/queerty.com.txt
deleted file mode 100644
index fc7ab37f..00000000
--- a/data/GrabberConfig/queerty.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='copy']
-title: //h1[@class='hed']
-test_url: http://www.queerty.com/rawhide-radicals-meet-five-heroes-from-the-leather-community-20120302/ \ No newline at end of file
diff --git a/data/GrabberConfig/quora.com.txt b/data/GrabberConfig/quora.com.txt
deleted file mode 100644
index cfa7bd6c..00000000
--- a/data/GrabberConfig/quora.com.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-tidy: no
-prune: no
-body: //div[contains(concat(' ',normalize-space(@class),' '),' Answer ')] | //div[contains(concat(' ',normalize-space(@class),' '),' header ')] | //div[contains(concat(' ',normalize-space(@class),' '),' AnswerWikiArea ')] | //hr
-#body: //div[contains(@class, 'main_col')]
-
-strip_id_or_class: AnswerFooter
-strip_id_or_class: ActionBar
-strip_id_or_class: hidden
-strip_id_or_class: item_action_bar
-strip_id_or_class: answer_voters
-strip_id_or_class: question_topics
-strip_id_or_class: answer_header_text
-strip_id_or_class: editor_link
-strip_id_or_class: view_tag
-strip_id_or_class: include_details
-strip_id_or_class: sig_edit
-strip_id_or_class: profile_photo_img
-strip_id_or_class: question_text_icons
-
-# insert hr between answers
-find_string: <div class="Answer"
-replace_string: <hr /><div class="Answer"
-
-test_url: http://www.quora.com/What-everyday-habit-do-you-wish-you-had-developed-earlier-in-life
-test_contains: Exercising every day
-
-test_url: http://www.quora.com/What-is-the-greatest-illusion-in-life
-test_contains: What is the greatest illusion in life?
diff --git a/data/GrabberConfig/racjonalista.pl.txt b/data/GrabberConfig/racjonalista.pl.txt
deleted file mode 100644
index 19c719d4..00000000
--- a/data/GrabberConfig/racjonalista.pl.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: /html/body/center/b
-date: /html/body/table/tr[2]/td/i
-single_page_link: //*[@id='oTxt']/table[3]/tr[2]/td/a[1]
-
-test_url: http://www.racjonalista.pl/kk.php/s,7214/q,Geneza.szubrawstwa \ No newline at end of file
diff --git a/data/GrabberConfig/radar.oreilly.com.txt b/data/GrabberConfig/radar.oreilly.com.txt
deleted file mode 100644
index fa66b815..00000000
--- a/data/GrabberConfig/radar.oreilly.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-date://span[@class='date']
-body://div[@class='entry-body']
-test_url: http://radar.oreilly.com/2012/01/genome-cloud-digital-humanities-hadoop-world-strata.html \ No newline at end of file
diff --git a/data/GrabberConfig/radionz.co.nz.txt b/data/GrabberConfig/radionz.co.nz.txt
deleted file mode 100644
index 2496ddab..00000000
--- a/data/GrabberConfig/radionz.co.nz.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='body']
-title: //div[@class='newsstory']/h2
-test_url: http://www.radionz.co.nz/news/stories/2010/07/18/12481029a86d \ No newline at end of file
diff --git a/data/GrabberConfig/randsinrepose.com.txt b/data/GrabberConfig/randsinrepose.com.txt
deleted file mode 100644
index 6970a744..00000000
--- a/data/GrabberConfig/randsinrepose.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@id='center-col']/h4
-author: substring-before(//title,'In')
-date: substring-after(//div[@class='commenttext']/span,'#')
-body: //div[@id='center-col']
-strip: //div[@id='center-col']/h4
-strip: //div[@class='graytext']
-
-# Anthony Perez-Sanz 2012.3.14
-# Removed long gif from the end
-strip: //img[@src='http://www.randsinrepose.com/spreader.gif']
-test_url: http://www.randsinrepose.com/archives/2012/03/13/hacking_is_important.html \ No newline at end of file
diff --git a/data/GrabberConfig/rasgolatente.es.txt b/data/GrabberConfig/rasgolatente.es.txt
deleted file mode 100644
index fcdbbd97..00000000
--- a/data/GrabberConfig/rasgolatente.es.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='entry-title']
-author: //div[@class='entry-author']
-date: //div[@class='entry-time']
-body: //div[@class='entry-content']
-
-test_url: http://rasgolatente.es/estupidez-psicologia-estupidos/
diff --git a/data/GrabberConfig/readability.com.txt b/data/GrabberConfig/readability.com.txt
deleted file mode 100644
index 2d5aba76..00000000
--- a/data/GrabberConfig/readability.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //link[@rel='canonical']/@href
-
-test_url: http://www.readability.com/read?url=http://feeds.gawker.com/~r/lifehacker/full/~3/jaxAjSay_Rw/add-a-rain-gutter-to-a-picnic-table-for-a-built+in-drink-cooler \ No newline at end of file
diff --git a/data/GrabberConfig/readwriteweb.com.txt b/data/GrabberConfig/readwriteweb.com.txt
deleted file mode 100644
index e2aabda9..00000000
--- a/data/GrabberConfig/readwriteweb.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class="titlelink"]
-date: //span[@class="timestamp"]/@data-published
-body: //div[@class="asset-content"]
-strip_id_or_class: related-entries
-strip_id_or_class: like-and-retweet
-
-author: //div[@id="submeta"]/a[1]
-test_url: http://www.readwriteweb.com/archives/why_facebook_terrifies_google.php \ No newline at end of file
diff --git a/data/GrabberConfig/real.gr.txt b/data/GrabberConfig/real.gr.txt
deleted file mode 100644
index ce0a3c43..00000000
--- a/data/GrabberConfig/real.gr.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(@class, 'article-photo-wrapper')]
-prune: no
-
-test_url: http://www.real.gr/DefaultArthro.aspx?page=arthro&id=360962&catID=1
-test_contains: Επισήμως το αποψινό υπουργικό
diff --git a/data/GrabberConfig/rebooti.com.txt b/data/GrabberConfig/rebooti.com.txt
deleted file mode 100644
index fb68b26b..00000000
--- a/data/GrabberConfig/rebooti.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Frebooti.com%2F2015%2F11%2Fsamsung-gear-vr-sold-out-online-at-amazon-and-best-buy%2F
-
-body: //div[@id='content-anchor-inner']
-
-strip_id_or_class: adsbygoogle
-strip: //ins
-
-test_url: http://rebooti.com/2015/11/samsung-gear-vr-sold-out-online-at-amazon-and-best-buy/
diff --git a/data/GrabberConfig/recipe.com.txt b/data/GrabberConfig/recipe.com.txt
deleted file mode 100644
index a01aaef4..00000000
--- a/data/GrabberConfig/recipe.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@class='recipedetailsleft' or @id='recipePrepAndServe' or @id='recipeingredients']
-
-strip_id_or_class: location
-strip_id_or_class: savings
-strip_id_or_class: recipeDetailDescButton
-
-prune: no
-tidy: no
-
-test_url: http://www.recipe.com/avocado-basil-pasta/ \ No newline at end of file
diff --git a/data/GrabberConfig/reddit.com.txt b/data/GrabberConfig/reddit.com.txt
deleted file mode 100644
index d7c8c138..00000000
--- a/data/GrabberConfig/reddit.com.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# This setup grabs the text from a Reddit self post. It ignores all comments etc.
-
-title: //p[@class="title"]/a/text()
-
-author: //p[@class="tagline"]/a
-
-# this doesn't work for some reason...?
-date: //p[@class="tagline"]//@datetime
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' usertext-body ') and (contains(concat(' ',normalize-space(@class),' '),' may-blank-within ')) and (contains(concat(' ',normalize-space(@class),' '),' md-container '))]//div[contains(concat(' ',normalize-space(@class),' '),' md ')]
-
-strip_id_or_class: tagline
-strip_id_or_class: unvotable-message
-strip_id_or_class: buttons
-
-# follow the posted link (unless it's a self post - relative URL, no http://)
-single_page_link: //p[@class="title"]/a[contains(@href, 'http://')]
-
-test_url: http://www.reddit.com/r/truegaming/comments/wfe7r/i_wrote_about_the_problems_i_honestly_feel_that/
-test_url: http://www.reddit.com/r/worldnews/comments/1as37r/twelve_north_korean_soldiers_attempting_to_defect/
-test_url: http://www.reddit.com/r/WritingPrompts/comments/2786lw/wp_in_a_world_where_puns_are_illegal_one_man/chybk8e
-test_url: https://www.reddit.com/r/LinuxActionShow/comments/1fccny/arch_linux_survival_guide/
diff --git a/data/GrabberConfig/redmondpie.com.txt b/data/GrabberConfig/redmondpie.com.txt
deleted file mode 100644
index 66cc1707..00000000
--- a/data/GrabberConfig/redmondpie.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //div[@class='posthead']//h2
-body: //div[contains(@class, 'postcontent') or @class='posthead']
-author: //div[@class='posthead']//a[@rel='author']
-
-strip: //div[@class='posthead']//h2
-replace_string(>Advertisements</div>): ></div>
-replace_string(<p>You can follow us on): <p style="display:none;">
-strip_id_or_class: likeThisPost
-
-prune: no
-tidy: no
-
-test_url: http://www.redmondpie.com/how-to-play-music-directly-from-home-screen-folders-on-iphone/ \ No newline at end of file
diff --git a/data/GrabberConfig/reflets.info.txt b/data/GrabberConfig/reflets.info.txt
deleted file mode 100644
index 39e71a26..00000000
--- a/data/GrabberConfig/reflets.info.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body://div[@class='maincontent']
-date://div[@class='meta-date']
-strip://li[@class='sharing_label']
-strip://a[@class='FlattrButton']
-strip://div[@class='jp-relatedposts']
-test_url: http://reflets.info/orange-nokia-siemens-deep-packet-inspection/
diff --git a/data/GrabberConfig/renenekuda.cz.txt b/data/GrabberConfig/renenekuda.cz.txt
deleted file mode 100644
index a5361fd0..00000000
--- a/data/GrabberConfig/renenekuda.cz.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //*[@class='entry-title']
-body: //div[@class='entry-content']
-test_url: http://www.renenekuda.cz/recept-na-produktivitu/ \ No newline at end of file
diff --git a/data/GrabberConfig/resume.se.txt b/data/GrabberConfig/resume.se.txt
deleted file mode 100644
index a165f57e..00000000
--- a/data/GrabberConfig/resume.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'article-body')]
-
-prune: no
-
-test_url: http://www.resume.se/nyheter/media/2013/09/18/cecilia-blankens-lamnar-mama-for-konkurrent/
-test_url: http://www.resume.se/nyheter/reklam/2013/09/18/ravelli-trodde-jag-var-med-i-blasningen/
-test_url: http://www.resume.se/rss-nyheter
diff --git a/data/GrabberConfig/reuters.com.txt b/data/GrabberConfig/reuters.com.txt
deleted file mode 100644
index 7411e62b..00000000
--- a/data/GrabberConfig/reuters.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1[@class='headline3']
-author: substring-after(//p[@class="byline"], 'By ')
-date: //meta[@name="REVISION_DATE"]/@content
-body: //div[@id='articleImage' or @id='frame_fd1fade'] | //span[@id='articleText'] | //div[@class='pageNavigation']
-strip: //li[@class='next']
-strip: //span[@class='articleLocation']
-prune: no
-tidy: no
-
-test_url: http://www.reuters.com/article/2011/04/08/us-ivorycoast-killings-idUSTRE73732A20110408 \ No newline at end of file
diff --git a/data/GrabberConfig/revistapiaui.estadao.com.br.txt b/data/GrabberConfig/revistapiaui.estadao.com.br.txt
deleted file mode 100644
index 30e627dc..00000000
--- a/data/GrabberConfig/revistapiaui.estadao.com.br.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //div[@class="article_header"]/h3
-author: //div[@class="autor"]/p/*
-date: substring-after(substring-after(//div[@class="flt-left"],"> "), "> ")
-
-move_into(//div[@class="new_article"]): //div[@class="img_article"]/img
-
-body: //div[@class="article_content"]
-convert_double_br_tags: yes
-
-test_url: http://revistapiaui.estadao.com.br/edicao-68/questoes-latino-americanas/filhos-da-guerra-suja \ No newline at end of file
diff --git a/data/GrabberConfig/rezeptwelt.de.txt b/data/GrabberConfig/rezeptwelt.de.txt
deleted file mode 100644
index 2093573b..00000000
--- a/data/GrabberConfig/rezeptwelt.de.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='step-content'] | //div[@class='global-active ingredients-box']
-title: //div[@class='step-1-container']
-
-tidy: no
-test_url: http://www.rezeptwelt.de/backen-herzhaft-rezepte/w%C3%BCrstchen-schlangen/530372 \ No newline at end of file
diff --git a/data/GrabberConfig/rhenus.com.txt b/data/GrabberConfig/rhenus.com.txt
deleted file mode 100644
index ed2c2933..00000000
--- a/data/GrabberConfig/rhenus.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' news-single-item ')]
-title: //div[contains(concat(' ',normalize-space(@class),' '),' news-single-item ')]//h1
-strip_id_or_class: news-single-backlink
-
-test_url: http://www.rhenus.com/en/infocenter/press/single-news/article/rhenus-sells-freight-forwarding-centre-in-fellbach-to-raben/
diff --git a/data/GrabberConfig/robertsspaceindustries.com.txt b/data/GrabberConfig/robertsspaceindustries.com.txt
deleted file mode 100644
index b0b90fb7..00000000
--- a/data/GrabberConfig/robertsspaceindustries.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-strip_id_or_class: 'sharedaddy'
-strip_id_or_class: 'respond'
-strip_id_or_class: 'meta'
-test_url: http://www.robertsspaceindustries.com/news-update-ai-pilots/ \ No newline at end of file
diff --git a/data/GrabberConfig/robots.thoughtbot.com.txt b/data/GrabberConfig/robots.thoughtbot.com.txt
deleted file mode 100644
index da5b7bd8..00000000
--- a/data/GrabberConfig/robots.thoughtbot.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //section[@class='post text']
-title: //h1[@class='title']
-date: //p[@class='post-date']
-strip: //section[@class='meta-info']
-test_url: http://robots.thoughtbot.com/post/32455387133/four-phase-test \ No newline at end of file
diff --git a/data/GrabberConfig/rockpapershotgun.com.txt b/data/GrabberConfig/rockpapershotgun.com.txt
deleted file mode 100644
index 83342cb7..00000000
--- a/data/GrabberConfig/rockpapershotgun.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h2
-
-strip: //div[ contains(@class, 'respond') ] | //h2 | //h1
-strip_id_or_class: social
-strip_id_or_class: dd_post_share
-
-date: substring-after(//p[@class='info'], ' on ')
-
-author: //p[@class='info']//a
-test_url: http://www.rockpapershotgun.com/2010/07/29/rps-half-verdict-starcraft-2/
diff --git a/data/GrabberConfig/rodrigo.sharpcube.com.txt b/data/GrabberConfig/rodrigo.sharpcube.com.txt
deleted file mode 100644
index eef8b11c..00000000
--- a/data/GrabberConfig/rodrigo.sharpcube.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-author: //article/header/span[@class='author']
-title://article/header/h1
-body: //article
-strip: //article/header
-strip: //article/p[@class='metadata']
-footnotes: yes
-test_url: http://rodrigo.sharpcube.com/2010/06/20/using-and-sharing-a-vpn-connection-on-your-mac/ \ No newline at end of file
diff --git a/data/GrabberConfig/rogerebert.com.txt b/data/GrabberConfig/rogerebert.com.txt
deleted file mode 100644
index da215109..00000000
--- a/data/GrabberConfig/rogerebert.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: substring-before(//title,':')
-author: substring-after(substring-before(//div[@class='text']/b,'/'),'BY')
-
-body: //div[@class='text']
-
-strip: //a[contains(@href,'printart')]
-strip_id_or_class: enlarge_photo
-test_url: http://rogerebert.com/apps/pbcs.dll/article?AID=/20120411/REVIEWS/120419998/1005/GLOSSARY \ No newline at end of file
diff --git a/data/GrabberConfig/rollingstone.com.txt b/data/GrabberConfig/rollingstone.com.txt
deleted file mode 100644
index 9a10a69e..00000000
--- a/data/GrabberConfig/rollingstone.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1
-author: //h3[@class="byline"]/strong
-
-body: //div[@id='main']/h2 | //div[@id='main']//div[@class='body']
-
-prune: no
-
-single_page_link: //a[@class='print-page']
-
-test_url: http://www.rollingstone.com/politics/news/the-plastic-bag-wars-20110725 \ No newline at end of file
diff --git a/data/GrabberConfig/root.cz.txt b/data/GrabberConfig/root.cz.txt
deleted file mode 100644
index 7c1c7642..00000000
--- a/data/GrabberConfig/root.cz.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class='urs'] | //div[@itemprop='articleBody']
-
-strip_id_or_class: perex__impressum
-
-test_url: http://www.root.cz/zpravicky/google-testuje-moznost-vyzkouset-mobilni-aplikace-pred-instalaci/
-test_url: http://www.root.cz/clanky/let-s-encrypt-otevrel-branu-ve-verejne-bete-muze-mit-certifikat-kazdy/ \ No newline at end of file
diff --git a/data/GrabberConfig/rottentomatoes.com.txt b/data/GrabberConfig/rottentomatoes.com.txt
deleted file mode 100644
index ef327691..00000000
--- a/data/GrabberConfig/rottentomatoes.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@class='movie_content_area']
-strip_id_or_class: tomatometer_bar_help
-strip_id_or_class: critic-links
-strip_id_or_class: top-critics-numbers
-strip_id_or_class: fan_side
-strip_id_or_class: fblike
-strip_id_or_class: rating_widget
-strip_id_or_class: friend_reviews
-prune: no
-
-test_url: http://www.rottentomatoes.com/m/thor/ \ No newline at end of file
diff --git a/data/GrabberConfig/roughtype.com.txt b/data/GrabberConfig/roughtype.com.txt
deleted file mode 100644
index a012a67d..00000000
--- a/data/GrabberConfig/roughtype.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='content']
-strip: //p[@class='postmeta']/following::*
-strip: //p[@class='postmeta']
-strip: //p[@align='left']
-test_url: http://www.roughtype.com/archives/2012/01/power_to_the_da.php \ No newline at end of file
diff --git a/data/GrabberConfig/roy.gbiv.com.txt b/data/GrabberConfig/roy.gbiv.com.txt
deleted file mode 100644
index 6ff03de8..00000000
--- a/data/GrabberConfig/roy.gbiv.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip_comments: no
-test_url: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven \ No newline at end of file
diff --git a/data/GrabberConfig/rpgsite.net.txt b/data/GrabberConfig/rpgsite.net.txt
deleted file mode 100644
index 9ddbf0f2..00000000
--- a/data/GrabberConfig/rpgsite.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id='news-text']
-prune: no
-test_url: http://www.rpgsite.net/news/1964-tetsuya-nomura-says-hell-soon-show-the-future-of-final-fantasy
-test_url: http://www.rpgsite.net/news/1965-new-atelier-totori-plus-screens-and-artwork \ No newline at end of file
diff --git a/data/GrabberConfig/rubysfera.pl.txt b/data/GrabberConfig/rubysfera.pl.txt
deleted file mode 100644
index d9d9a431..00000000
--- a/data/GrabberConfig/rubysfera.pl.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-author: //div[contains(@class, 'author_text')]/h4/text()
-date: //li[@class='date']
-
-# stripping excessive tags
-strip: //div[contains(@class, 'entry_meta')]
-strip: //div[contains(@class, 'single_meta')]
-strip: //br[contains(@class, 'clear')]
-strip: //h3[contains(., 'Komentarz')]
-test_url: http://rubysfera.pl/2011/09/10-porad-o-rvm/ \ No newline at end of file
diff --git a/data/GrabberConfig/ruhlman.com.txt b/data/GrabberConfig/ruhlman.com.txt
deleted file mode 100644
index e54b0f0e..00000000
--- a/data/GrabberConfig/ruhlman.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class='entry-title']
-author: ///span[@class='author vcard']
-date: //abbr[@class='published']
-body: //div[@class='entry-content']
-
-test_url: http://ruhlman.com/2009/05/cookbooks-that-teach/ \ No newline at end of file
diff --git a/data/GrabberConfig/saadaalnews.net.txt b/data/GrabberConfig/saadaalnews.net.txt
deleted file mode 100644
index b9ce04e5..00000000
--- a/data/GrabberConfig/saadaalnews.net.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[contains(@class, 'section-content-left')]
-
-strip_id_or_class: related
-strip_id_or_class: nocontent
-strip_id_or_class: comment
-strip_id_or_class: widget
-strip_id_or_class: respond
-strip: //h3[.='Comments']
-strip: //p[.='comments']
-
-test_url: http://saadaalnews.net/?p=42624
diff --git a/data/GrabberConfig/salon.com.txt b/data/GrabberConfig/salon.com.txt
deleted file mode 100644
index d669fdb3..00000000
--- a/data/GrabberConfig/salon.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //meta[@property='og:title']/@content
-author: (//span[@class="byline"]/a)[1]
-date: //span[contains(@class, "toLocalTime")]
-body: (//div[contains(@class, "articleInner")]//img[contains(@src, 'media.salon.com') and contains(@src, '460x')])[1] | //div[contains(@class, "articleContent") or contains(@class, "writerMeta")]
-
-prune: no
-
-# deal with singleton links
-single_page_link: (//h1/a[contains(@href, '/singleton')])[1]
-
-test_url: http://www.salon.com/2011/10/25/occupying_the_rust_belt/
diff --git a/data/GrabberConfig/salzburg.com.txt b/data/GrabberConfig/salzburg.com.txt
deleted file mode 100644
index 464f99f1..00000000
--- a/data/GrabberConfig/salzburg.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //p[@class='teaser1 darkgrey myriad']
-move_into(//p[@class='teaser1 darkgrey myriad']): //div[@class='artikel clear']
-strip: //div[@class='hidden']
-strip: //div[@id='article_related_source']
-
-test_url: http://www.salzburg.com/nachrichten/oesterreich/politik/sn/artikel/deutliche-nachbesserungen-bei-lehrerdienstrecht-19469/ \ No newline at end of file
diff --git a/data/GrabberConfig/sanpedrosun.com.txt b/data/GrabberConfig/sanpedrosun.com.txt
deleted file mode 100644
index 3f19cced..00000000
--- a/data/GrabberConfig/sanpedrosun.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //div[contains(@class, 'post')]//h1
-date: //div[contains(@class, 'post')]//h6
-body: //div[contains(@class, 'entry')]
-strip_id_or_class: post_stats
-strip_id_or_class: related-posts
-strip_id_or_class: after_story
-prune: no
-
-test_url: http://www.sanpedrosun.com/community-and-society/2013/06/05/little-angelspre-school-talent-show/
-test_url: http://www.sanpedrosun.com/feed/ \ No newline at end of file
diff --git a/data/GrabberConfig/saveyourself.ca.txt b/data/GrabberConfig/saveyourself.ca.txt
deleted file mode 100644
index 5a5605d9..00000000
--- a/data/GrabberConfig/saveyourself.ca.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-title://h1
-
-# my section divs seem to interfere with the Instapaper parser, so I ditch 'em
-dissolve://div[contains(@class, 'section')]
-
-#these don't seem to be necessary, but just in case
-strip_id_or_class:'masthead'
-strip_id_or_class:'footer'
-
-#again, Instapaper seems to understand where my content is, but just in case
-body://div[@id='content']
-
-# in general, I want the Instapaper view to look like my print CSS, so I remove things specified for the screen or non-printing
-strip_id_or_class:'screen-only'
-strip_id_or_class:'no-print'
-
-#other misc removals and simplifications
-strip_id_or_class:'popup'
-strip_id_or_class:'ZoomSpin'
-
-#I have a lot of content in sidebars and "meta" asides that can work inline just fine, but has to be distinguished somehow with some minimal formatting, so I put them in blockquotes
-wrap_in(blockquote)://div[contains(@class, 'sidebar')]
-wrap_in(blockquote)://div[contains(@class, 'meta')]
-wrap_in(blockquote)://p[contains(@class, 'meta')]
-test_url: http://saveyourself.ca/tutorials/low-back-pain.php \ No newline at end of file
diff --git a/data/GrabberConfig/sayidaty.net.txt b/data/GrabberConfig/sayidaty.net.txt
deleted file mode 100644
index 2d9f1884..00000000
--- a/data/GrabberConfig/sayidaty.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-date: //meta[@property='article:published_time']/@content
-body: (//div[contains(@class, 'article-slider')]//img)[1] | //div[contains(@class, 'bottom-article-con')]
-
-test_url: http://www.sayidaty.net/taxonomy/term/10/all/feed \ No newline at end of file
diff --git a/data/GrabberConfig/sbnation.com.txt b/data/GrabberConfig/sbnation.com.txt
deleted file mode 100644
index 41b36755..00000000
--- a/data/GrabberConfig/sbnation.com.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-title: //h1[@id='stream_title']
-
-# Author and date don't work
-author: //div[@class='byline']
-date: //div[@class='date-stamp']
-
-body: //div[@class='node-article']
-
-strip_id_or_class: fb-like-box
-strip_id_or_class: stream-fb-like
-strip_id_or_class: social-meta
-strip_id_or_class: social-spoken
-strip_id_or_class: twitter-share-button
-strip_id_or_class: twitter-follow-button
-strip_id_or_class: spinner_node_list
-strip_id_or_class: node-sort-link
-strip_id_or_class: stream_title
-strip_id_or_class: stream_summary
-strip_id_or_class: update-count-container
-strip_id_or_class: major-updates
-strip_id_or_class: newsletter-slide
-strip_id_or_class: author-mini-profile
-strip_id_or_class: byline
-strip_id_or_class: header
-strip_id_or_class: footer
-
-# Works, but "no text" errors on: http://www.sbnation.com/nba/2012/3/9/2856780/nba-scores-dwight-howard-bulls-magic-mavs-suns
-test_url: http://www.sbnation.com/nba/2012/3/13/2867226/dwight-howard-trade-rumors-2012-faq-orlando-magic \ No newline at end of file
diff --git a/data/GrabberConfig/schneier.com.txt b/data/GrabberConfig/schneier.com.txt
deleted file mode 100644
index 0074a86a..00000000
--- a/data/GrabberConfig/schneier.com.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-author: //p[@class='mastname']
-
-body: //div[@class='indivbody']
-date: //div[@class='indivbody']/h2[1]
-
-# Remove blog title. Specify first occurrence in case h1 is used in article
-strip: //div[@class='indivbody']/h1[1]
-
-# Remove blog description (the first p element)
-strip: //div[@class='indivbody']/p[1]
-
-# Remove navigation (second p element)
-strip: //div[@class='indivbody']/p[2]
-
-# Remove duplicate of article title. Specify first occurrence in case h3 is used in article
-strip: //div[@class='indivbody']/h3[1]
-
-# Remove publishing date, it's extracted by rule above
-strip: //div[@class='indivbody']/h2[1]
-
-# Remove duplicate of date at end, and newsletter signup
-strip: //p[@class='posted']
-
-# Leave date at top
-test_url: http://www.schneier.com/blog/archives/2010/12/security_in_202.html \ No newline at end of file
diff --git a/data/GrabberConfig/scienceblogs.de.txt b/data/GrabberConfig/scienceblogs.de.txt
deleted file mode 100644
index b0dec3d2..00000000
--- a/data/GrabberConfig/scienceblogs.de.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-single_page_link: //div[@class='c2c1']/div[@class='toptheme further line']//ul//li/a
-
-author: //div[@class='details clear']//a[@class='hi']
-body: //div[@class='title']
-strip: //p[@class='entrypagination']
-strip: //p[@class='details_top']
-date: //p[@class='details_top']
-title: //div[@class='title']/h1
-strip: //p[@class='details']
-strip: //p[@class='details_bottom']
-
-test_url: http://www.scienceblogs.de/astrodicticum-simplex/2011/10/weltuntergang-reloaded-das-jungste-gericht-findet-am-21-oktober-statt.php \ No newline at end of file
diff --git a/data/GrabberConfig/scienceticker.info.txt b/data/GrabberConfig/scienceticker.info.txt
deleted file mode 100644
index 2a06f734..00000000
--- a/data/GrabberConfig/scienceticker.info.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[@class='post']
-title: //h1[@id='singlePageTitle']
-date: substring-before(//small,'&bull; Rubrik')
-
-strip: //div[@class='post-ratings']
-strip: //div[@class='post-ratings-loading']
-strip: //a[@title='Empfehlen Sie den Text weiter!']
-strip: //a[@title='Drucken']
-strip: //div[@class='share']
-
-test_url: http://www.scienceticker.info/2011/11/24/forscher-finden-gedachtnismolekul/ \ No newline at end of file
diff --git a/data/GrabberConfig/scientificamerican.com.txt b/data/GrabberConfig/scientificamerican.com.txt
deleted file mode 100644
index 1b3f31cf..00000000
--- a/data/GrabberConfig/scientificamerican.com.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# After site revisions at SciAm, this configuration does
-# not work, especially for multi-page articles. For
-# every article there is now a "Print" link which
-# is far more reliable. So this configuration should be
-# removed or disabled.
-# 2/3/13
-#
-
-# meta data
-title://h1[@class = 'articleTitle']
-author:substring-after(//span[@class = 'byline'],'By ')
-date:substring-before(//span[@class = 'datestamp'],'|')
-
-#body content
-body://div[@id = 'articleContent']
-#next_page_link://li[@id = 'flairPagination']/a[last()]
-
-single_page_link: //a[contains(@href, 'print=true')]
-
-#cleanup
-strip://div[@class = 'fsgBooks']
-
-test_url: http://www.scientificamerican.com/article.cfm?id=do-brain-scans-comatose-patients-reveal-conscious-state
-test_url: http://www.scientificamerican.com/article.cfm?id=solar-wind-transforms-venus-into-shape-of-comet \ No newline at end of file
diff --git a/data/GrabberConfig/scilogs.de.txt b/data/GrabberConfig/scilogs.de.txt
deleted file mode 100644
index b24d7844..00000000
--- a/data/GrabberConfig/scilogs.de.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: //h1
-author: //div[@class='date']/a
-date: substring-after(//div[@class='date'], ',')
-body: //div[@class='entrybody']
-
-strip_id_or_class: socialshareprivacy
-strip: //div[@class='entrybody']/br[1]
-
-# Strip related articles
-# 'p'-Tag strips 'Ähnliche Artikel: ' (<br> tags become <p>)
-strip: //div[@class='entrybody']/p[last()]
-strip: //div[@class='entrybody']/ul[last()]
-
-convert_double_br_tags: yes
-test_url: http://www.scilogs.de/wblogs/blog/formbar/fusion/2012-10-08/rundgang-durch-deutschlands-gr-tes-fusionsexperiment \ No newline at end of file
diff --git a/data/GrabberConfig/scotusblog.com.txt b/data/GrabberConfig/scotusblog.com.txt
deleted file mode 100644
index 8881bb45..00000000
--- a/data/GrabberConfig/scotusblog.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //title
-author: //p[@id='author-name-role']/a
-date: substring-after(//p[@class='time'],'Posted')
-body: //div[@id='main']
-strip: //div[@id='author-info']
-strip: //div[@id='author-links']
-strip: //h1
-test_url: http://www.scotusblog.com/2012/04/shaken-baby-case-an-update/ \ No newline at end of file
diff --git a/data/GrabberConfig/scripting.com.txt b/data/GrabberConfig/scripting.com.txt
deleted file mode 100644
index 5fb0ee79..00000000
--- a/data/GrabberConfig/scripting.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-strip: //a[starts-with(@href, '#')]
-strip: //*[@class='storyByline']
-body: //*[@class='storyPageText']/..
-author: string('Dave Winer')
-date: substring-before(substring-after(//*[@class='storyByline'], 'on'), 'at')
-title: //h1
-footnotes: no
-test_url: http://scripting.com/stories/2011/07/08/yeahImStillYawning.html \ No newline at end of file
diff --git a/data/GrabberConfig/searchenginejournal.com.txt b/data/GrabberConfig/searchenginejournal.com.txt
deleted file mode 100644
index dc98af3c..00000000
--- a/data/GrabberConfig/searchenginejournal.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip: //ul[contains(@id, "social")]
-strip: //div[contains(@class, "ts-fab-wrapper")]
-strip: //div[contains(@id, 'gpt-ad')]
-
-test_url: http://www.searchenginejournal.com/web-design-vs-seo-it-doesnt-make-much-sense/62294/
diff --git a/data/GrabberConfig/searchengineland.com.txt b/data/GrabberConfig/searchengineland.com.txt
deleted file mode 100644
index 9ccc5898..00000000
--- a/data/GrabberConfig/searchengineland.com.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-body: //div[contains(concat(' ',normalize-space(@class),' '),' article ') and (contains(concat(' ',normalize-space(@class),' '),' clear '))]
-title: //div[@class="storyBox"]/h1
-author: //a[@rel="author"]
-date: substring-before(//span[@class="dateline"], 'by')
-
-#Removes related content but cleans up article text
-strip: //h1
-strip: //p[@class="homeStory tdmSideInfo"]
-strip: //div[@id="bylineShare"]
-strip: //script
-strip: //hr
-
-strip_id_or_class: homeStory
-strip_id_or_class: authorpic
-strip_id_or_class: insideComments
-strip_id_or_class: authorbio
-strip_id_or_class: gpt-ad-sel-cube
-strip_id_or_class: smxTextAd
-
-test_url: http://searchengineland.com/googles-jaw-dropping-sponsored-post-campaign-for-chrome-106348 \ No newline at end of file
diff --git a/data/GrabberConfig/seattletransitblog.com.txt b/data/GrabberConfig/seattletransitblog.com.txt
deleted file mode 100644
index 5129c069..00000000
--- a/data/GrabberConfig/seattletransitblog.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h3[@class="storytitle"]
-date: //div[@class='meta']
-body: //div[@class='storycontent']
-
-test_url: http://seattletransitblog.com/2012/06/19/times-st-louis-interested-in-buying-waterfront-streetcars/ \ No newline at end of file
diff --git a/data/GrabberConfig/secushare.com.txt b/data/GrabberConfig/secushare.com.txt
deleted file mode 100644
index 6d1429ff..00000000
--- a/data/GrabberConfig/secushare.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http://secushare.org/PGP
-
-strip: //div[@id='nav']
-strip: //div[@id='header']
-
-date: //meta[@name='generated']/@content
-author: //meta[@name='author']/@content
-
-body: //div[@id='content']
-test_url: http://secushare.org/PGP
diff --git a/data/GrabberConfig/select.yeeyan.org.txt b/data/GrabberConfig/select.yeeyan.org.txt
deleted file mode 100644
index 6e98b149..00000000
--- a/data/GrabberConfig/select.yeeyan.org.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# This filter is tested on:
-# http://select.yeeyan.org/view/18312/332365
-# http://select.yeeyan.org/view/365295/333788
-# http://select.yeeyan.org/view/174464/332336
-
-tidy:no
-prune:no
-title://h1
-author: //div[@class='sa_author']/span/a
-date: substring-after(//div[@class='sa_author']/span/following-sibling::span, ':')
-body: //div[@class='sa_left closetag']
-wrap_in(b)://div[@class='sa_abstract']
-
-strip://ul[@class='sa_next clearfix']
-strip: //div[@class='sa_author']
-strip: //div[@class='sa_title_box']
-
-test_url: http://select.yeeyan.org/view/258033/333481 \ No newline at end of file
diff --git a/data/GrabberConfig/semiaccurate.com.txt b/data/GrabberConfig/semiaccurate.com.txt
deleted file mode 100644
index d3a24db3..00000000
--- a/data/GrabberConfig/semiaccurate.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-tidy: no
-prune: no
-
-title: //section[@id='content']//h1
-date: //span[@class='date']
-author: //span[@class='post-author']/a
-
-body: //div[@class='entry-content']
-
-strip: //div[@id='ts-fab-below']
-strip: //div[@class='sharedaddy sd-sharing-enabled']
-
-test_url: http://semiaccurate.com/2015/04/21/ubuntu-strips-phone-os-core/
diff --git a/data/GrabberConfig/seriouseats.com.txt b/data/GrabberConfig/seriouseats.com.txt
deleted file mode 100644
index 5e633470..00000000
--- a/data/GrabberConfig/seriouseats.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body: //div[@id='content']
-
-# clean up recipe pages
-strip: //h2[@class='fn'] | //h2[@class='double-lined'] | //h3 | //div[@id='threeColumn2'] | //div[@id='threeColumn3']
-
-#recipe pages
-strip_id_or_class: "recipe-feedback"
-strip_id_or_class: "comments"
-strip_id_or_class: "procedure-number"
-strip_id_or_class: "more-with-author"
-
-#slice
-strip_id_or_class: "inner"
-
-test_url: http://www.seriouseats.com/recipes/2010/09/peking-duck-mandarin-pancakes-plum-sauce-recipe.html \ No newline at end of file
diff --git a/data/GrabberConfig/servethehome.com.txt b/data/GrabberConfig/servethehome.com.txt
deleted file mode 100644
index 6f69dd90..00000000
--- a/data/GrabberConfig/servethehome.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fwww.servethehome.com%2Ffirefox-is-eating-your-ssd-here-is-how-to-fix-it%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' the-content ')]
-test_url: https://www.servethehome.com/firefox-is-eating-your-ssd-here-is-how-to-fix-it/ \ No newline at end of file
diff --git a/data/GrabberConfig/sf.curbed.com.txt b/data/GrabberConfig/sf.curbed.com.txt
deleted file mode 100644
index 4c10e9c7..00000000
--- a/data/GrabberConfig/sf.curbed.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class='post-title']
-author: //div[@class='post-byline']/a
-date: substring-before(//div[@class='post-byline'], ', by')
-
-body: //div[@class='post-body']
-dissolve: //noscript
-test_url: http://sf.curbed.com/archives/2011/10/17/lower_haight_loft_would_really_really_really_like_a_buyer.php \ No newline at end of file
diff --git a/data/GrabberConfig/sf.eater.com.txt b/data/GrabberConfig/sf.eater.com.txt
deleted file mode 100644
index 1e7c85a0..00000000
--- a/data/GrabberConfig/sf.eater.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[@class="post-title"]
-author: //div[@class="post-byline"]/a
-date: substring-before(//div[@class='post-byline'], ', by')
-
-body: //div[@class='post-body']
-strip_id_or_class: post-kicker
-test_url: http://sf.eater.com/archives/2012/05/22/nate_pollack_talks_about_the_american_grilled_cheese_kitchen_moving_into_the_mission.php \ No newline at end of file
diff --git a/data/GrabberConfig/sfgate.com.txt b/data/GrabberConfig/sfgate.com.txt
deleted file mode 100644
index 54691122..00000000
--- a/data/GrabberConfig/sfgate.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: /html/head/title
-
-body: //div[@id = 'articlecontent']/div[contains(@class, 'bodytext')]
-author: //div[@class = 'articleheadings']/p[contains(@class,'author')]/span[@class = 'fn']
-date: //div[@class = 'articleheadings']/span[@class = 'updated']
-strip: //div[div[contains(@class, 'imgbox')]]
-
-body: //div[@class = 'blogitem']
-author: //p[@class="credit"]/span[@class="author"]/a[position() = 1]
-date: //span[@class = 'pubdate']
-
-test_url: http://www.sfgate.com/columnists/garchik/ \ No newline at end of file
diff --git a/data/GrabberConfig/sfweekly.com.txt b/data/GrabberConfig/sfweekly.com.txt
deleted file mode 100644
index 73c3017e..00000000
--- a/data/GrabberConfig/sfweekly.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[contains(@class, 'content_body')]
-strip_id_or_class: det_rel
-test_url: http://www.sfweekly.com/2012-03-14/news/cia-lsd-wayne-ritchie-george-h-white-mk-ultra/ \ No newline at end of file
diff --git a/data/GrabberConfig/shabayek.com.txt b/data/GrabberConfig/shabayek.com.txt
deleted file mode 100644
index 9a0d60ae..00000000
--- a/data/GrabberConfig/shabayek.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-date: //span[@class='date']
-body: //div[@class='post_content']
-test_url: http://www.shabayek.com/blog/2011/10/16/%D8%AF%D8%B1%D9%88%D8%B3-%D9%85%D9%86-%D9%82%D8%B5%D8%A9-%D8%AA%D8%A3%D8%B3%D9%8A%D8%B3-%D8%AA%D9%88%D9%8A%D8%AA%D8%B1-%E2%80%93%D8%AC3/ \ No newline at end of file
diff --git a/data/GrabberConfig/shawnblanc.net.txt b/data/GrabberConfig/shawnblanc.net.txt
deleted file mode 100644
index bd8438f7..00000000
--- a/data/GrabberConfig/shawnblanc.net.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title://*[@class='primary']/h1
-date: //*[@class='articledate']
-author: substring-before(substring-after(//*[@class='block first']/p,'2012 '),'.')
-body: //div[@class='primary']
-footnotes: yes
-strip: //*[@class='primary']/h1
-strip: //*[@class='articledate']
-strip: //*[@class='detailsarticle']
-strip: //*[@class='endnav']
-strip: //*[@class='endmeta']
-test_url: http://shawnblanc.net/2011/11/kindle-touch-review/ \ No newline at end of file
diff --git a/data/GrabberConfig/shifteleven.com.txt b/data/GrabberConfig/shifteleven.com.txt
deleted file mode 100644
index 43fd871d..00000000
--- a/data/GrabberConfig/shifteleven.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[ @class='entry-content' ]
-
-strip: //div[ contains(@class, 'sharing') ]
-
-date: //div[ @class='entry-meta' ]/a
-test_url: http://shifteleven.com/articles/2008/05/10/issue-tracking-git-ticgit \ No newline at end of file
diff --git a/data/GrabberConfig/siasat.pk.txt b/data/GrabberConfig/siasat.pk.txt
deleted file mode 100644
index b10e12de..00000000
--- a/data/GrabberConfig/siasat.pk.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-#body: (//div[@class='ftr-yt-vid'])[1]
-body: (//blockquote[contains(@class, 'postcontent')])[1]
-body: (//div[starts-with(@id, 'post_message')])[1]
-
-prune: no
-tidy: no
-
-#replace_string(<iframe title="YouTube video player"): <div class="ftr-yt-vid"><iframe title="YouTube video player"
-#replace_string(</iframe>): </iframe>&nbsp;</div>
-
-test_url: http://www.siasat.pk/forum/showthread.php?107668-Policy-Matters-17th-March-2012-Dr-Shahid-Masood-Gen-Hameed-gul-amp-Fawad-Chudhary-Pak-US-Relationship&p=787733 \ No newline at end of file
diff --git a/data/GrabberConfig/signalscv.com.txt b/data/GrabberConfig/signalscv.com.txt
deleted file mode 100644
index 2d3c388e..00000000
--- a/data/GrabberConfig/signalscv.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-author: //span[contains(@class, 'byline_1')]
-date: //span[@class='posted_date']
-body: //*[contains(@class, 'bigimage_container') or contains(@class, 'overlay_text') or contains(@id, 'articlebody')]
-
-strip_id_or_class: leftWrapper
-
-prune: no
-
-test_url: http://www.signalscv.com/section/46/article/102948/
-test_url: http://www.signalscv.com/syndication/feeds/rss/ \ No newline at end of file
diff --git a/data/GrabberConfig/singaporeanstocksinvestor.blogspot.com.txt b/data/GrabberConfig/singaporeanstocksinvestor.blogspot.com.txt
deleted file mode 100644
index 46e2d5f2..00000000
--- a/data/GrabberConfig/singaporeanstocksinvestor.blogspot.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='post-body']
-strip: //div[@id='lws_0']
-prune: no
-
-test_url: http://singaporeanstocksinvestor.blogspot.com/2011/04/aims-amp-capital-industrial-reit.html \ No newline at end of file
diff --git a/data/GrabberConfig/singularityhub.com.txt b/data/GrabberConfig/singularityhub.com.txt
deleted file mode 100644
index 3999d4d4..00000000
--- a/data/GrabberConfig/singularityhub.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body://div[contains(@class,"entry-content")]
-test_url: http://singularityhub.com/2011/05/21/google-invades-your-home-android-phones-control-your-appliances-and-accessories-video/ \ No newline at end of file
diff --git a/data/GrabberConfig/sintagoulis.gr.txt b/data/GrabberConfig/sintagoulis.gr.txt
deleted file mode 100644
index 0d05c40e..00000000
--- a/data/GrabberConfig/sintagoulis.gr.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@class='headline']//h2
-body: //div[contains(@class, 'storycontent')]
-
-prune: no
-
-test_url: http://sintagoulis.gr/sokolatenia/sokolatenia-mpompa-me-amaretti- \ No newline at end of file
diff --git a/data/GrabberConfig/skanesfria.se.txt b/data/GrabberConfig/skanesfria.se.txt
deleted file mode 100644
index a0ddac79..00000000
--- a/data/GrabberConfig/skanesfria.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.skanesfria.se/artikel/112045 \ No newline at end of file
diff --git a/data/GrabberConfig/slashfilm.com.txt b/data/GrabberConfig/slashfilm.com.txt
deleted file mode 100644
index 4d17176a..00000000
--- a/data/GrabberConfig/slashfilm.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: substring-before(//title,'| /Film')
-date: substring-before(substring-after(//p[@class='post-info'],'Posted on '),'by')
-strip: //div[@class='pm-left']
-strip: //div[@class='pm-right']
-strip: //h2/span
-next_page_link: //h2/strong/a
-strip: //h2/strong/a
-strip: //p[contains(text(),'we have to split this post over')]
-strip: //p[@class='post-info']
-strip: //h1/a
-strip: //img[contains(@src,'siteimages/authors')]
-strip: //div[@id='header']
-strip: //div[@class='topad-right']
-strip: //strong[contains(text(),'Cool Posts From Around the Web:')]
-test_url: http://www.slashfilm.com/superhero-bits-206/ \ No newline at end of file
diff --git a/data/GrabberConfig/slate.com.txt b/data/GrabberConfig/slate.com.txt
deleted file mode 100644
index d5798e01..00000000
--- a/data/GrabberConfig/slate.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-title: //h1[@class="sl-art-head-dek"]
-body: //article//div[@class='sl-art-body']/div[contains(@class, 'body')]
-strip: //div[@class="department_kicker"]
-strip: //div[@id="insider_ad_wrapper" or @id="insider_ad_inner"]
-strip: //div[@id="bottom_sponsored_links"]
-strip: //div[@class="sl-art-ad-midflex"]
-#strip: //dl
-#strip: //p[em/a[contains(@href, 'facebook.com')]]
-prune: no
-
-author: //div[@id='author_bio']//a[contains(@href, '/author/')]
-author: //a[contains(@href, '/authors.')]
-
-date: substring-before(substring-after(//span[@class='sl-art-byline'], 'Posted '), ', at ')
-
-single_page_link: //a[@class='sl-art-sinpage']
-
-test_url: http://www.slate.com/id/2274583/pagenum/all/
-test_url: http://www.slate.com/id/2293116/ \ No newline at end of file
diff --git a/data/GrabberConfig/slate.fr.txt b/data/GrabberConfig/slate.fr.txt
deleted file mode 100644
index 32374c4c..00000000
--- a/data/GrabberConfig/slate.fr.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.slate.fr%2Fstory%2F115631%2Ftwitter-devin-tirages-ligue-champions
-
-body: //article[contains(concat(' ',normalize-space(@class),' '),' full_article ')]
-strip_id_or_class: media_legend
-strip_id_or_class: article_author
-strip_id_or_class: tag_articles
-strip_id_or_class: article_insert
-
-test_url: http://www.slate.fr/story/115631/twitter-devin-tirages-ligue-champions
diff --git a/data/GrabberConfig/slice.seriouseats.com.txt b/data/GrabberConfig/slice.seriouseats.com.txt
deleted file mode 100644
index e62a3966..00000000
--- a/data/GrabberConfig/slice.seriouseats.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body: //div[@id='content']
-
-# clean up recipe pages
-strip: //h2[@class='fn'] | //h2[@class='double-lined'] | //h3 | //div[@id='threeColumn2'] | //div[@id='threeColumn3']
-
-#recipe pages
-strip_id_or_class: "recipe-feedback"
-strip_id_or_class: "comments"
-strip_id_or_class: "procedure-number"
-strip_id_or_class: "more-with-author"
-
-#slice
-strip_id_or_class: "inner"
-
-test_url: http://slice.seriouseats.com/archives/2010/10/the-pizza-lab-how-to-make-great-new-york-style-pizza.html \ No newline at end of file
diff --git a/data/GrabberConfig/slog.thestranger.com.txt b/data/GrabberConfig/slog.thestranger.com.txt
deleted file mode 100644
index f9526945..00000000
--- a/data/GrabberConfig/slog.thestranger.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-strip_id_or_class: postCategory
-title: //h3[@class='postTitle']
-body: //div[@class='postBody']
-test_url: http://slog.thestranger.com/slog/archives/2010/10/12/sl-letter-of-the-day-leave-it-alone \ No newline at end of file
diff --git a/data/GrabberConfig/smartmania.cz.txt b/data/GrabberConfig/smartmania.cz.txt
deleted file mode 100644
index b833d244..00000000
--- a/data/GrabberConfig/smartmania.cz.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-strip_id_or_class: komentare
-replace_string(<h2>Nepřehlédněte</h2>): <!-- nothing -->
-next_page_link: //div[contains(concat(' ',normalize-space(@class),' '),' navigation ')]/a[@class='right']
-
-test_url: http://smartmania.cz/bleskovky/oppo-vanoce-2015-adventni-kalendar-r7-12597
-test_url: http://smartmania.cz/recenze/lumia-950-recenze-microsoft-windows-10-test-12623 \ No newline at end of file
diff --git a/data/GrabberConfig/smbc-comics.com.txt b/data/GrabberConfig/smbc-comics.com.txt
deleted file mode 100644
index 66e3718a..00000000
--- a/data/GrabberConfig/smbc-comics.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-find_string:display:none
-replace_string:display:inline
-
-find_string:<img src
-replace_string:<div/><img src
-
-body: //*[@id="cc-comicbody"] | //*[@id="aftercomic"]
-
-test_url: http://www.smbc-comics.com/index.php?id=2039
-
-prune: no
-tidy: no
diff --git a/data/GrabberConfig/sme.sk.txt b/data/GrabberConfig/sme.sk.txt
deleted file mode 100644
index d41612cc..00000000
--- a/data/GrabberConfig/sme.sk.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //meta[@property='og:title']/@content
-date: //p[@class='autor_line']/b/text()
-test_url: http://www.sme.sk/c/6268206/lipsic-vidi-malcharkove-uplatky.html \ No newline at end of file
diff --git a/data/GrabberConfig/smh.com.au.txt b/data/GrabberConfig/smh.com.au.txt
deleted file mode 100644
index f647f812..00000000
--- a/data/GrabberConfig/smh.com.au.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-body: //div[@id='content']
-title: //h1[@class='cN-headingPage']
-author: //h3[@class='authorName']
-date: //dd[@class='updated dtstamp']
-
-strip: //ul[@class='social sponsored cfix']
-strip: //div[contains(@class, 'hiddenVisually')]
-strip: //dd[@class='updated dtstamp']
-strip: //h3[@class='authorName']
-strip: //ul[@class='social cfix']
-strip: //div[contains(@id, 'adspot')]
-
-strip: //div[contains(@class, 'overlayPlayCountdown')]
-strip: //div[@class='fdVideoWof']//span[@class='gone']
diff --git a/data/GrabberConfig/smh.drive.com.au.txt b/data/GrabberConfig/smh.drive.com.au.txt
deleted file mode 100644
index 463fd88b..00000000
--- a/data/GrabberConfig/smh.drive.com.au.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-body: //div[@id='content']
-title: //h1[@class='cN-headingPage']
-author: //h3[@class='authorName']
-date: //dd[@class='updated dtstamp']
-
-strip: //ul[@class='social sponsored cfix']
-strip: //div[contains(@class, 'hiddenVisually')]
-strip: //dd[@class='updated dtstamp']
-strip: //h3[@class='authorName']
-strip: //ul[@class='social cfix']
-strip: //div[contains(@id, 'adspot')]
-
-test_url: http://smh.drive.com.au/roads-and-traffic/driver-distraction-responsible-for-more-car-crashes-than-alcohol-20130503-2iyg0.html
diff --git a/data/GrabberConfig/smithsonianmag.com.txt b/data/GrabberConfig/smithsonianmag.com.txt
deleted file mode 100644
index fc479c2a..00000000
--- a/data/GrabberConfig/smithsonianmag.com.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# meta data
-title://h1[@id = 'articleTitle']
-author:substring-after(//ul[@id = 'byLine']/li[1],'By ')
-date:substring-before(substring-after(//ul[@id = 'byLine']/li[last()],','),',')
-body://div[@id = 'article-body']
-
-# full content
-single_page_link://td/li[@class = 'article-singlepage']/a
-
-# continue link
-single_page_link: //a[@id='continue-btn']
-
-# caption clean up
-wrap_in(i)://span[@class='articleImageCaptionwide']
-move_into (//span[@class='articleImageCaptionwide'])://div[@id = 'articleImage']/p
-
-
-# clean up
-strip://p[@id = 'articlePaginationWrapper']
-strip://ul[contains(@class, 'cat-breadcrumb')]
-strip://div [@class= 'viewMorePhotos']
-
-test_url: http://www.smithsonianmag.com/history-archaeology/The-Goddess-Goes-Home.html
diff --git a/data/GrabberConfig/snip.ly.txt b/data/GrabberConfig/snip.ly.txt
deleted file mode 100644
index 4e80fcae..00000000
--- a/data/GrabberConfig/snip.ly.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //meta[@property="og:url"]/@content
-
-test_url: http://snip.ly/qa1R \ No newline at end of file
diff --git a/data/GrabberConfig/somethingawful.com.txt b/data/GrabberConfig/somethingawful.com.txt
deleted file mode 100644
index 48547948..00000000
--- a/data/GrabberConfig/somethingawful.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //h1
-body: //div[@id = 'content-area']
-author: //p[contains(@class, 'byline')]/a
-autodetect_next_page: yes
-tidy: no
-
-strip_id_or_class: articleid
-strip_id_or_class: logo
-strip_id_or_class: pagebar
-strip_id_or_class: featurenavlinks
-strip_id_or_class: featured_frontpage
-strip_id_or_class: sidebar
-strip_id_or_class: footer
-strip_id_or_class: byline
-strip_id_or_class: logo
-strip_id_or_class: nav_network
-test_url: http://www.somethingawful.com/d/dungeons-and-dragons/wtf-monster-manual.php \ No newline at end of file
diff --git a/data/GrabberConfig/songshuhui.net.txt b/data/GrabberConfig/songshuhui.net.txt
deleted file mode 100644
index a9233593..00000000
--- a/data/GrabberConfig/songshuhui.net.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# This filter is tested on:
-# http://songshuhui.net/archives/65522
-# http://songshuhui.net/archives/75760
-title://h2/span/a
-date:substring-before(substring-after(//div[@class='atrctitle']/div, '发表于'),' |')
-body://div[@class='entry']
-test_url: http://songshuhui.net/archives/74819 \ No newline at end of file
diff --git a/data/GrabberConfig/soundcity.tv.txt b/data/GrabberConfig/soundcity.tv.txt
deleted file mode 100644
index c26b9f95..00000000
--- a/data/GrabberConfig/soundcity.tv.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-strip_id_or_class: sharing
-
-test_url: http://soundcity.tv/feed/
diff --git a/data/GrabberConfig/sourcebooks.com.txt b/data/GrabberConfig/sourcebooks.com.txt
deleted file mode 100644
index 86e3df5e..00000000
--- a/data/GrabberConfig/sourcebooks.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-#grab the actual content div
-body: //div[@class='rt-article']
-
-test_url: http://www.sourcebooks.com/blog/happy-27th-birthday-sourcebooks.html
diff --git a/data/GrabberConfig/spectrum.ieee.org.txt b/data/GrabberConfig/spectrum.ieee.org.txt
deleted file mode 100644
index aea3627e..00000000
--- a/data/GrabberConfig/spectrum.ieee.org.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body://div[@class="articleBody"]
-author://p[@class="articleBodyTtl"]
-test_url: http://spectrum.ieee.org/semiconductors/processors/behind-intels-new-randomnumber-generator/ \ No newline at end of file
diff --git a/data/GrabberConfig/speirs.org.txt b/data/GrabberConfig/speirs.org.txt
deleted file mode 100644
index 3bf859e3..00000000
--- a/data/GrabberConfig/speirs.org.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body://div[@class="body"]
-test_url: http://speirs.org/blog/2011/5/5/ipad-trials-at-oklahoma-state.html \ No newline at end of file
diff --git a/data/GrabberConfig/spiegel.de.txt b/data/GrabberConfig/spiegel.de.txt
deleted file mode 100644
index 7b7b1752..00000000
--- a/data/GrabberConfig/spiegel.de.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-# A. Niepel, narya.de@...
-# - added single_page_link
-# - added author for default and single page view
-# - added date for single page view
-# fforst@...
-# - Fixed it
-# bode2104@...
-# - Fixed single_page_link
-# - Included intro text in single page view
-# - Added body in default view
-# stesie@
-# - removed copyright box
-# - removed "print more" box
-
-# set body
-tidy: no
-# body in single page view
-body: //div[@id="spArticleContent"]
-# body in default view
-body: //div[@id="spArticleSection"]
-body: //div[contains(@class, 'article-section')] | //div[@id='js-article-top-wide-asset'] | //p[contains(@class, 'article-intro')] | //div[contains(@class, 'js-module-box-image')]
-# body in "Fotostrecke"
-body: //div[@id="spBigaContent"]
-
-# set date in single page view
-date: //div[@id="spArticleContent"]/h3
-# strip date
-strip: //div[@id="spArticleContent"]/h3
-# set date in "Fotostrecke"
-date: //div[@id="spBigaDatum"]
-
-# title in default view
-title: //h2[contains(@class, 'article-title')]
-#set title in single page view
-title: //div[@id='spArticleContent']/h2
-# strip title
-strip: //div[@id='spArticleContent']/h1
-strip: //div[@id='spArticleContent']/h2
-#set title in "Fotostrecke"
-title: //div[@class='spBigaHeadline']
-
-# set author
-author: //p[@class="spAuthor"]/a
-author: substring-after(//p[@class="spAuthor"], 'Von ')
-# strip author
-strip: //p[@class='spAuthor']
-
-# remove captions
-strip: //*/span[@class='spPicLayerText']
-strip: //*/div[@class='spPanoPlayerPaneControl']
-strip: //*/div[@class='spCredit']
-strip: //*/div[@class='spCredit']/following-sibling::p
-
-# remove ads
-strip: //div[@class='spMInline']
-
-# remove photogalleries and extras
-strip: //div[contains(@class, 'spPhotoGallery')]
-strip: //div[@class='spPhotoGallery']/following-sibling::br
-strip: //div[@class='spAssetAlignleft']
-strip: //div[contains(@class,'spAsset')]
-strip: //br[@clear='all']
-
-# remove community functions
-strip: //div[@id='spSocialBookmark']
-strip: //div[contains(@class, 'spCommunityBox')]
-strip: //div[contains(@class, 'spArticleNewsfeedBox')]
-strip: //div[@class='spArticleCredit']
-
-# remove clutter in "Fotostrecke"
-strip: //div[@id='spBreadcrumb']
-strip: //div[@id='spBigaLatestEntries']
-strip: //div[contains(@class, 'spBigaNavi')]
-strip: //div[@class='spDottedLine']
-
-strip: //div[@class='asset-box article-print-more']
-strip: //div[@class='article-copyright']
-strip: //span[@class='image-buttons']
-
-# Use link to print article for single page view
-single_page_link: //a[contains(@href, '-druck')]
-if_page_contains: //div[contains(@class, 'multi-pager-control')]
-
-# Clean up title in print view
-find_string: <title>Druckversion -
-replace_string: <title>
-
-# use next link in "Fotostrecke"
-next_page_link: //a[@class='spBigaControlForw']
-test_url: http://www.spiegel.de/politik/deutschland/0,1518,787602,00.html
-
-# regular article
-test_url: http://www.spiegel.de/wirtschaft/soziales/griechenland-was-den-griechischen-buergern-nun-droht-a-1042682.html
-
-# multipage article
-test_url: http://www.spiegel.de/spiegel/a-710880.html \ No newline at end of file
diff --git a/data/GrabberConfig/spiil.org.txt b/data/GrabberConfig/spiil.org.txt
deleted file mode 100644
index dd12fb88..00000000
--- a/data/GrabberConfig/spiil.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Fwww.spiil.org%2Fguide-bonnes-pratiques-editeurs-de-presse-ligne
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' node-content ')]
-test_url: https://www.spiil.org/guide-bonnes-pratiques-editeurs-de-presse-ligne
diff --git a/data/GrabberConfig/spiked-online.com.txt b/data/GrabberConfig/spiked-online.com.txt
deleted file mode 100644
index 7ec39c2b..00000000
--- a/data/GrabberConfig/spiked-online.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //div[@id='articleTitleWrapper' or @id='mainFeature']//h1
-author: //*[@id='authorNameJob']//a
-date: //div[@id='articleMeta']/p
-body: //div[@id='mainFeature']//img | //div[contains(@class, 'fullText')]
-
-test_url: http://www.spiked-online.com/newsite/article/standing_up_to_the_white-coated_gods_of_fortune/13785
-test_url: http://www.spiked-online.com/newsite/article/sex_box_and_the_crisis_of_intimacy/14168 \ No newline at end of file
diff --git a/data/GrabberConfig/spin.com.txt b/data/GrabberConfig/spin.com.txt
deleted file mode 100644
index 88eb454c..00000000
--- a/data/GrabberConfig/spin.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-tidy: no
-body: //section[contains(@class, 'main')]
-strip: //footer
-strip: //a[@class='paginated']
-test_url: http://www.spin.com/articles/bathlands-deep-heart-americas-new-drug-nightmare \ No newline at end of file
diff --git a/data/GrabberConfig/splatf.com.txt b/data/GrabberConfig/splatf.com.txt
deleted file mode 100644
index 3e05a225..00000000
--- a/data/GrabberConfig/splatf.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author:string('Dan Frommer/SplatF')
-date://div[@class='postdate']
-body://div[@class='entry']
-title://div[@class='post']/h1
-test_url: http://www.splatf.com/2012/02/month-six/ \ No newline at end of file
diff --git a/data/GrabberConfig/splitsider.com.txt b/data/GrabberConfig/splitsider.com.txt
deleted file mode 100644
index 4bbc7aac..00000000
--- a/data/GrabberConfig/splitsider.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //div[@class='byline']/a
-date: //div[@id='date']
-body: //div[@class='entry']
-test_url: http://splitsider.com/2011/10/saturday-nights-children-rob-riggle-2004-2005/ \ No newline at end of file
diff --git a/data/GrabberConfig/sport.detik.com.txt b/data/GrabberConfig/sport.detik.com.txt
deleted file mode 100644
index 18552d1e..00000000
--- a/data/GrabberConfig/sport.detik.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title://div[@class="content_detail"]/h1
-
-author://div[@class="author"]/strong
-
-date:substring-before(substring-after(//div[@class="content_detail"]/*[@class="date"], ','), ' WIB')
-
-body://div[@class='text_detail']
-test_url: http://sport.detik.com/sepakbola/read/2012/05/23/065011/1922350/71/agen-silva-ingin-bertahan-di-milan?b99220270 \ No newline at end of file
diff --git a/data/GrabberConfig/sport365.fr.txt b/data/GrabberConfig/sport365.fr.txt
deleted file mode 100644
index 8688f40b..00000000
--- a/data/GrabberConfig/sport365.fr.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //h2[contains(@class, 'body_head')] | //div[@id='img_article' or contains(@class, 'body_content')]
-body: //div[contains(@class, 'cpanel')]//div[contains(@class, 'thumbnails')]
-prune: no
-strip: //div[starts-with(@class, 'actu_')]
-strip: //div[contains(@class, 'data')]
-
-test_url: http://www.sport365.fr/basketball/nba/new-york-accord-avec-toronto-pour-bargnani-1038773.shtml
-test_url: http://www.sport365.fr/rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/sports.espn.go.com.txt b/data/GrabberConfig/sports.espn.go.com.txt
deleted file mode 100644
index 8c21ef2b..00000000
--- a/data/GrabberConfig/sports.espn.go.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //div[@class='headline'] | //div[@class='mod-header']/h3
-body: //div[contains(@class, 'article')]
-strip: //div[contains(@class, 'mod-inline')]
-strip: //*/span[@class='page-actions']/a
-strip: //*/span[@class='page-actions']/a
-strip: //div[@class='page-actions']/*
-strip: //div[@class='headline'] | //div[@class='mod-header']/h3
-strip: //div[@class='mod-blog-navigation']
-strip: //div[@class='monthday']
-strip: //div[@class='time']
-strip: //div[@class='timeofday']
-test_url: http://sports.espn.go.com/espn/page2/story?page=simmonsnfl2010/lebron_james_return_clevelend&sportCat=nba \ No newline at end of file
diff --git a/data/GrabberConfig/sports.yahoo.com.txt b/data/GrabberConfig/sports.yahoo.com.txt
deleted file mode 100644
index b0f57e2c..00000000
--- a/data/GrabberConfig/sports.yahoo.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //div[@id='article']/div[@class='hd']/h1
-body: //p[@id='byline'] | //div[@id='article']//div[@class='body_copy 0']
-strip: //div[@class='foot']
-strip: //div[@id='sidebar']//div[@class='ft']
-strip: //p[@id='byline']//em
-tidy: no
-prune: no
-
-test_url: http://sports.yahoo.com/nba/news?slug=ap-nbafinals \ No newline at end of file
diff --git a/data/GrabberConfig/sprengsatz.de.txt b/data/GrabberConfig/sprengsatz.de.txt
deleted file mode 100644
index 5b683811..00000000
--- a/data/GrabberConfig/sprengsatz.de.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h2
-author: string('Michael Spreng')
-date: //div[@class='date']
-body: //div[@class='entry']
-test_url: http://www.sprengsatz.de/?p=3691 \ No newline at end of file
diff --git a/data/GrabberConfig/sqlite.org.txt b/data/GrabberConfig/sqlite.org.txt
deleted file mode 100644
index 15763c32..00000000
--- a/data/GrabberConfig/sqlite.org.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@id='ff-body']
-
-replace_string(<h1 align=center>): <div id="ff-body"><h1 align=center>
-
-prune: no
-
-test_url: http://www.sqlite.org/fileformat2.html \ No newline at end of file
diff --git a/data/GrabberConfig/squashed.tumblr.com.txt b/data/GrabberConfig/squashed.tumblr.com.txt
deleted file mode 100644
index 8eae13ed..00000000
--- a/data/GrabberConfig/squashed.tumblr.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='content']
-date: substring-before( //div[@class='unit dateAndNotes'], 'with')
-title: //h3
-test_url: http://squashed.tumblr.com/post/17613522228/lets-stop-blaming-the-victims-of-predatory-lending \ No newline at end of file
diff --git a/data/GrabberConfig/srf.ch.txt b/data/GrabberConfig/srf.ch.txt
deleted file mode 100755
index d07a9050..00000000
--- a/data/GrabberConfig/srf.ch.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-# Author: cirnod@gmail.com
-
-tidy: no
-prune: no
-
-body: //div[@id="article-content"]/p | //div[@class="main-article-content clearfix"]
-
-# General Cleanup
-strip_id_or_class: offscreen
-strip_id_or_class: video-description
-strip_id_or_class: v2 big-video
-strip_id_or_class: module smb freetext
-strip_id_or_class: asset span3
-strip_id_or_class: module smb related-links
-
-# fix image-galleries
-strip_id_or_class: module lightbox-gallery image hide
-replace_string(width="624"): width="100%"
-replace_string(height="468"): height="%"
-
-# Try yourself
-test_url: http://www.srf.ch/news/wirtschaft/weltbank-korrigiert-konjunktur-erwartungen-nach-unten
-test_url: http://www.srf.ch/news/wirtschaft/ural-statt-alpen-russische-touristen-bleiben-zuhause
-test_url: http://www.srf.ch/news/international/zwei-schweizer-bei-blutigem-attentat-in-mali-verletzt \ No newline at end of file
diff --git a/data/GrabberConfig/stackoverflow.com.txt b/data/GrabberConfig/stackoverflow.com.txt
deleted file mode 100644
index bb95e93a..00000000
--- a/data/GrabberConfig/stackoverflow.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-body: //div[@class='post-text' or @class='user-action-time' or @class='user-details' or @class='vote'] | //div[@id='answers-header']//h2
-
-replace_string(<div class="user-details"><br></div>): <!-- nothing -->
-replace_string(<div class="vote">): <div class="vote"><h3>Vote count:
-
-strip_id_or_class: vote-up
-strip_id_or_class: vote-down
-strip_id_or_class: star-off
-strip_id_or_class: favoritecount
-strip_id_or_class: -share
-strip_id_or_class: badgecount
-
-
-test_url: http://stackoverflow.com/questions/4484289/id-like-to-understand-the-jquery-plugin-syntax \ No newline at end of file
diff --git a/data/GrabberConfig/stalbansreview.co.uk.txt b/data/GrabberConfig/stalbansreview.co.uk.txt
deleted file mode 100644
index a0f1587c..00000000
--- a/data/GrabberConfig/stalbansreview.co.uk.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //div[@class='articleLeft']/h3
-
-author: substring-after(//span[@class='articleAuthor']/a,'By ')
-
-date: substring-before(//span[@class='articleDateTime'],'in ')
-
-body: //div[@class='articleLeft']
-strip: //div[@class='articleMoreNews']
-strip: //div[@class='articleLeft']/h3
-strip: //div[@class='articleLeft']/p[@class='articleInfo clearfix']
-
-# Remove duplicate title from text
-strip: //div[@id='site']/div[5][@class='holder']/div[1][@class='hBlock']/div[1][@class='sglCol article']/h3
-test_url: http://www.stalbansreview.co.uk/news/9581446.New_roundabout_in_King_Harry_Lane/r/?ref=rss \ No newline at end of file
diff --git a/data/GrabberConfig/standard.co.uk.txt b/data/GrabberConfig/standard.co.uk.txt
deleted file mode 100644
index 71a2bda1..00000000
--- a/data/GrabberConfig/standard.co.uk.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-autodetect_next_page: no
-footnotes: no
-dissolve: //div[@class="column-2"]//div[@class="widget"]
-dissolve: //div[@class="column-2"]//div
-
-author: //div[@class="innerbyline"]/a
-strip: //div[@class="innerbyline"]/a
-
-strip: //p[@class="dateline"]
-date: //p[@class="dateline"]
-
-title: //h1[@class="title"]
-author: //div[@class="innerbyline"]/a
-date: //p[@class="dateline"]
-body: //div[@class="column-2"]
-test_url: http://www.standard.co.uk/lifestyle/esmagazine/grace-and-flavour-pizarro-7938350.html \ No newline at end of file
diff --git a/data/GrabberConfig/stephenfry.com.txt b/data/GrabberConfig/stephenfry.com.txt
deleted file mode 100644
index efd1ec2b..00000000
--- a/data/GrabberConfig/stephenfry.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: /html/head/meta[@name='title']/@content
-author: //span[contains(concat(' ',normalize-space(@class),' '),' article_author ')]/a
-date: //span[contains(concat(' ',normalize-space(@class),' '),' article_date ')]
-
-body: //div[@class='entry-content']
-
-single_page_link: //p[@class='pagination']/a
-test_url: http://www.stephenfry.com/2011/10/06/steve-jobs/ \ No newline at end of file
diff --git a/data/GrabberConfig/stlbeacon.org.txt b/data/GrabberConfig/stlbeacon.org.txt
deleted file mode 100644
index 75379a9c..00000000
--- a/data/GrabberConfig/stlbeacon.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: article/h1
-author: //p[@class='byline']
-date: //p[@class='date']
-body: //div[@class='body']
-test_url: https://www.stlbeacon.org/#!/content/23404/mogop_caucus_031712 \ No newline at end of file
diff --git a/data/GrabberConfig/stockholm.etc.se.txt b/data/GrabberConfig/stockholm.etc.se.txt
deleted file mode 100755
index 2f4f8cb8..00000000
--- a/data/GrabberConfig/stockholm.etc.se.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-strip_id_or_class: 'left'
-strip_id_or_class: 'right'
-strip_id_or_class: 'block-belowcontent'
-
-test_url: http://stockholm.etc.se/reportage/bakom-stangda-dorrar-pa-fas-3-massa \ No newline at end of file
diff --git a/data/GrabberConfig/stockholmsfria.se.txt b/data/GrabberConfig/stockholmsfria.se.txt
deleted file mode 100755
index ee874832..00000000
--- a/data/GrabberConfig/stockholmsfria.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.stockholmsfria.se/artikel/112068
diff --git a/data/GrabberConfig/straightdope.com.txt b/data/GrabberConfig/straightdope.com.txt
deleted file mode 100644
index f01d7ad1..00000000
--- a/data/GrabberConfig/straightdope.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='article' or @id='current_illustration']
-title: //div[@id='article']//h1
-date: //div[@id='article']//div[@class='date']
-prune: no
-
-test_url: http://www.straightdope.com/columns/read/947/whatever-happened-to-adoption-of-the-metric-system-in-the-u-s \ No newline at end of file
diff --git a/data/GrabberConfig/streetsblog.net.txt b/data/GrabberConfig/streetsblog.net.txt
deleted file mode 100644
index 6cf03ca6..00000000
--- a/data/GrabberConfig/streetsblog.net.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h2[@class="post-title"]
-date: //span[@class="post-date"]
-body: //div[@class="post-entry"]
-
-#This is also good for *.streetsblog.org, for example:
-#http://dc.streetsblog.org/2011/10/21/friday-job-market/
-test_url: http://streetsblog.net/2011/10/20/look-out-below-one-in-nine-bridges-structurally-deficient-reports-t4a/ \ No newline at end of file
diff --git a/data/GrabberConfig/stuff.co.nz.txt b/data/GrabberConfig/stuff.co.nz.txt
deleted file mode 100644
index 3756092c..00000000
--- a/data/GrabberConfig/stuff.co.nz.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-title://div[@id='left_col']/h1
-author:substring-after(//span[contains(@class,'storycredit')],'BY ')
-author://span[contains(@class,'storycredit')]
-date:substring-after(//div[contains(@class,'toolbox_date')],'Last updated ')
-date://div[contains(@class,'toolbox_date')]
-body://div[@id='left_col']
-
-strip_id_or_class: toolbox
-strip_id_or_class: story_features
-strip_id_or_class: sharebox_new
-strip_id_or_class: related_box
-strip_id_or_class: sponsored_links
-strip_id_or_class: hidden_ad
-strip_id_or_class: story_content_top
-strip_id_or_class: total_number
-strip_id_or_class: sort_order
-strip_id_or_class: subscribe_order
-
-strip://div[contains(@class,'ad_story')]
-
-test_url: http://www.stuff.co.nz/national/politics/3930344/PM-issues-challenge
-test_url: http://www.stuff.co.nz/entertainment/7045944/International-praise-for-Ladyhawke \ No newline at end of file
diff --git a/data/GrabberConfig/stumbleupon.com.txt b/data/GrabberConfig/stumbleupon.com.txt
deleted file mode 100644
index 9adc3c50..00000000
--- a/data/GrabberConfig/stumbleupon.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link: //iframe[@id='tb-stumble-frame']/@src
-
-test_url: http://www.stumbleupon.com/su/35V0wB/zouchmagazine.com/poetry-violet/ \ No newline at end of file
diff --git a/data/GrabberConfig/subtraction.com.txt b/data/GrabberConfig/subtraction.com.txt
deleted file mode 100644
index 9ba6eb77..00000000
--- a/data/GrabberConfig/subtraction.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //*[@id='posts']/div[1]/h2
-author: //*[@id='posts']/div[1]/div[2]/span[2]/a
-date: //*[@class='date']
-body: //div[@class='body-lead']
-
-# take out the bit saying 'body'
-strip: //div[@class='body-lead']/div[@class='info-label']
-
-
-
-
-
-
-
-
-
-test_url: http://www.subtraction.com/2011/02/01/unnecessary-explanations \ No newline at end of file
diff --git a/data/GrabberConfig/sueddeutsche.de.txt b/data/GrabberConfig/sueddeutsche.de.txt
deleted file mode 100644
index ef6a9956..00000000
--- a/data/GrabberConfig/sueddeutsche.de.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-# Important Note:
-# The last paragraph of any article seems to be a teaser from the sports section.
-
-tidy: no
-prune: no
-autodetect_on_failure: yes
-
-date: //time[@class='timeformat']
-title: //section[@class='header']//h2
-body: //article[@id="sitecontent"]
-author: //meta[@name="author"]/@content
-
-replace_string(<h2>): <h3>
-replace_string(</h2>): </h3>
-
-#strip: //section[@class="header"]
-strip: //section[@class='header']//time
-strip: //section[@class='header']//strong
-strip: //div[@id="article-sidebar-wrapper"]
-strip: //p[@class="anzeige"]
-strip: //section[@class="authors"]
-strip_id_or_class: teaserable-layout
-strip: //noscript
-strip: //div//i
-
-next_page_link: //a[@class='article-paging-nav-btn']
-
-# 1 page
-test_url: http://www.sueddeutsche.de/reise/bergwinter-saisonstart-in-den-skigebieten-geht-schon-1.3251799
-# 2 pages
-test_url: http://www.sueddeutsche.de/kultur/politik-und-philosophie-warum-trump-jedes-mittel-recht-ist-1.3256078
-# 3 pages
-test_url: http://www.sueddeutsche.de/muenchen/mietshaus-am-gaertnerplatz-alles-muss-raus-1.1556693
diff --git a/data/GrabberConfig/sunshinecoastdaily.com.au.txt b/data/GrabberConfig/sunshinecoastdaily.com.au.txt
deleted file mode 100644
index bf5e9189..00000000
--- a/data/GrabberConfig/sunshinecoastdaily.com.au.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //section//article//p
-
-strip: //aside
-strip: //div[@class='margin-top-15']
-strip: //p[@class='tags']
-
-author: //span[@class='byline']//ul[@class='piped']//li[1]
-date: //span[@class='byline']//ul[@class='piped']//li[2]
-
-parser: html5lib
diff --git a/data/GrabberConfig/suntimes.com.txt b/data/GrabberConfig/suntimes.com.txt
deleted file mode 100644
index 6d4594cf..00000000
--- a/data/GrabberConfig/suntimes.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-title: //div[@class='story-details']/h1
-date: //span[@class='date-time']
-Author: substring-after(//p[@class='by-line'], 'By ')
-
-strip: //div[@class='videoThumbnails']
-strip: //div[@class='ad-square2-container']
-strip: //div[@class='homeDeliveryContainer5']
-
-strip: //div[@class='image-description']
-strip: //div[@id='internal-side-bar']
-
-strip: //span[@class='hide']
-strip: //div[@class='date']
-test_url: http://www.suntimes.com/technology/ihnatko/8816567-452/review-kindle-fire-is-no-ipad-killer-but-it-is-a-killer-device.html \ No newline at end of file
diff --git a/data/GrabberConfig/svd.se.txt b/data/GrabberConfig/svd.se.txt
deleted file mode 100644
index bc0a1ca0..00000000
--- a/data/GrabberConfig/svd.se.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-body: //div[@id='article-content']
-author: //div[@id='article']//div[@class='byline']/p
-
-# Ads
-strip_id_or_class: articlead
-
-# Sharing
-strip_id_or_class: share
-
-prune: no
-
-test_url: http://www.svd.se/nyheter/inrikes/oppositionen-stoppar-skattesankning_8531228.svd
-test_url: http://www.svd.se/nyheter/inrikes/manga-huggormsbitna-golfare_5004031.svd
-test_url: http://www.svd.se/?service=rss&type=senastenytt \ No newline at end of file
diff --git a/data/GrabberConfig/svt.se.txt b/data/GrabberConfig/svt.se.txt
deleted file mode 100644
index ba35f7d1..00000000
--- a/data/GrabberConfig/svt.se.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //article[@role='main']//h1
-body: //article[@role='main']
-strip: //aside
-replace_string(<noscript>): <div>
-replace_string(</noscript>): </div>
-strip_id_or_class: svtHide-No-Js
-strip_id_or_class: aside
-strip_id_or_class: Aside
-strip_id_or_class: hidden
-strip_id_or_class: Share
-tidy: no
-prune: no
-
-test_url: http://www.svt.se/ug/framtidsdrommar-om-jobb-blev-lackande-gifthal
-test_url: http://www.svt.se/nyheter/het-debatt-mellan-borg-och-andersson
-test_url: http://www.svt.se/nyheter/regionalt/svtsormland/sj-tag-evakuerades-efter-rokdrama \ No newline at end of file
diff --git a/data/GrabberConfig/sydsvenskan.se.txt b/data/GrabberConfig/sydsvenskan.se.txt
deleted file mode 100644
index 24ba1426..00000000
--- a/data/GrabberConfig/sydsvenskan.se.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: //h1
-
-author: //a[contains(@href, '/sok/?')]/text()
-
-date: //meta[@name='bi3dPubDate']/@content
-
-body: (//div[contains(@class, 'slider_wrapper')])[1] | //div[@id='article_image' or @class='two_column_left']
-strip_id_or_class: story
-strip_id_or_class: article_body_ad
-strip: //div[@class='leadText saplo:lead']/h5
-
-replace_string(<br />): <br /><br />
-
-prune: no
-
-test_url: http://www.sydsvenskan.se/malmo/allt-jag-ager-ligger-pa-botten/
-test_url: http://www.sydsvenskan.se/kultur-och-nojen/-jag-vill-garna--stanna--
-test_url: http://www.sydsvenskan.se/rss.xml \ No newline at end of file
diff --git a/data/GrabberConfig/symmetrymagazine.org.txt b/data/GrabberConfig/symmetrymagazine.org.txt
deleted file mode 100644
index 5bcfb9ef..00000000
--- a/data/GrabberConfig/symmetrymagazine.org.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //div[contains(@class, "post")]/h2
-
-author: //div[contains(@class, "post")]/p[position()=last()]/text()[1]
-
-date: //div[contains(@class, "post")]/p[1]
-
-body: //div[contains(@class, "post")]
-
-strip: //div[contains(@class, "post")]/h2[1]
-strip: //div[contains(@class, "post")]/p[1]
-strip: //div[contains(@class, "post")]/p[position()=last()]
-test_url: http://www.symmetrymagazine.org/breaking/?p=12784 \ No newline at end of file
diff --git a/data/GrabberConfig/sz-magazin.sueddeutsche.de.txt b/data/GrabberConfig/sz-magazin.sueddeutsche.de.txt
deleted file mode 100644
index e058032c..00000000
--- a/data/GrabberConfig/sz-magazin.sueddeutsche.de.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-title: //h1
-body://div[@class='drucken']
-author: substring-after(//span[@class='autor'], 'Von ')
-author: //span[@class='autor']
-
-single_page_link://a[contains(@href, '/drucken/')]
-convert_double_br_tags:yes
-
-dissolve://div[@class='vorspann']
-
-strip://h1
-strip_id_or_class: klassifizierung
-strip_id_or_class: source
-strip_id_or_class: autor
-test_url: http://sz-magazin.sueddeutsche.de/texte/anzeigen/37567 \ No newline at end of file
diff --git a/data/GrabberConfig/sz.de.txt b/data/GrabberConfig/sz.de.txt
deleted file mode 100644
index db98c609..00000000
--- a/data/GrabberConfig/sz.de.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //article[@id="sitecontent"]
-author: //meta[@name="author"]/@content
-
-strip: //section[@class="header"]
-strip: //div[@id="article-sidebar-wrapper"]
-strip: //p[@class="anzeige"]
-strip: //section[@class="authors"]
-strip: //div[contains(@class, "embed")]
-
-test_url: http://sz.de/1.1556693
-test_contains: ist selbst der alte Eigentümer erstaunt
diff --git a/data/GrabberConfig/tabletmag.com.txt b/data/GrabberConfig/tabletmag.com.txt
deleted file mode 100644
index 58b1f5bb..00000000
--- a/data/GrabberConfig/tabletmag.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[contains(@class, 'story-text')]
-
-strip_id_or_class: related
-
-test_url: http://www.tabletmag.com/jewish-news-and-politics/181181/mossberg-parallel-states?all=1 \ No newline at end of file
diff --git a/data/GrabberConfig/tagesanzeiger.ch.txt b/data/GrabberConfig/tagesanzeiger.ch.txt
deleted file mode 100755
index 45c5cd02..00000000
--- a/data/GrabberConfig/tagesanzeiger.ch.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Author: cirnod@gmail.com
-
-tidy: no
-prune: no
-
-body: //div[@id="article"]/h3 | //*[@id="mainContent"]
-
-# General Cleanup
-#strip_id_or_class: info_panel
-
-
-# Try yourself
-test_url: http://www.tagesanzeiger.ch/zuerich/stadt/Nach-spektakulaerer-Abseilaktion-verhaftet/story/18039895
-test_url: http://www.tagesanzeiger.ch/ausland/naher-osten-und-afrika/IS-zerstoert-auch-das-antike-Hatra/story/19865699
diff --git a/data/GrabberConfig/tagesschau.de.txt b/data/GrabberConfig/tagesschau.de.txt
deleted file mode 100644
index 9df9a3d6..00000000
--- a/data/GrabberConfig/tagesschau.de.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body: //div[contains(@class, 'sectionArticle') and contains(@class, 'sectionZ')]
-
-strip_id_or_class: infokasten
-strip_id_or_class: teaserImTeaser
-strip_id_or_class: Comments
-strip_id_or_class: mediaInfo
-strip: //div[contains(@class, 'mediaCon')]//iframe
-strip_id_or_class: metablockwrapper
-
-prune: no
-
-test_url: http://www.tagesschau.de/ausland/aleppo-477.html
-test_contains: bevor aus Aleppo ein einziger großer Friedhof wird
-
-test_url: http://www.tagesschau.de/xml/rss2
diff --git a/data/GrabberConfig/tagesspiegel.de.txt b/data/GrabberConfig/tagesspiegel.de.txt
deleted file mode 100644
index 57e7d3df..00000000
--- a/data/GrabberConfig/tagesspiegel.de.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-# Author: zinnober
-# Should work with "normal" articles as well as with image galleries
-
-prune: no
-
-# Title
-title: //h1/span[@class='hcf-headline']
-
-# Set author
-author: //a[@rel='author']
-
-# Set date
-date: //span[@class='date hcf-atlas']
-
-# Fetch full multipage articles
-next_page_link: //a[contains(@class, 'hcf-forward')]
-
-# Content is here
-body: //article
-body: //div[contains(@class, 'hcf-screen')]
-
-# Remove tracking and ads
-strip_id_or_class: hcf-ad
-strip_id_or_class: hcf-autoload-ad
-strip_id_or_class: hcf-content-ad
-
-# Tidy up before article
-strip: //article/h1
-strip_id_or_class: hcf-atlas
-strip_id_or_class: hcf-author
-strip_id_or_class: date hcf-atlas
-strip_id_or_class: date hcf-atlas
-
-# General cleanup
-strip: //div[contains(@class, 'hcf-screen')]//h1
-strip: //div[@class='hcf-subpage-titles']//ul
-strip_id_or_class: hcf-doctype-media
-strip_id_or_class: hcf-inline-gallery
-strip_id_or_class: hcf-doctype-video
-strip_id_or_class: hcf-links
-strip_id_or_class: hcf-mini-navi
-strip_id_or_class: hcf-media-control
-strip_id_or_class: hcf-hidden
-replace_string(<span class="hcf-update">Update</span>): <strong>Update: </strong>
-
-# Fix pictures and captions
-replace_string(<a class="hcf-doctype-gallery): <p class="hcf-doctype-gallery
-replace_string(<a class="hcf-doctype-enlarge): <p class="hcf-doctype-enlarge
-replace_string(<figcaption class="hcf-caption">): <br><small><em>
-replace_string(</figcaption>): </em></small>
-
-# Fix image galleries
-replace_string(<a class=" ajaxify): <p class="ajaxify
-replace_string(<div class="hcf-caption"><div><p>): <small><em>
-
-# Try it yourself
-test_url: http://www.tagesspiegel.de/berlin/bezirke/wedding/wedding-jetzt/auf-der-suche-nach-einem-stadtteil-wilder-weiter-wedding/8757156.html
-test_url: http://www.tagesspiegel.de/berlin/olympia-in-berlin-der-flughafen-tegel-soll-das-olympische-dorf-werden/10645036.html
-test_url: http://www.tagesspiegel.de/mediacenter/fotostrecken/berlin/bildergalerie-kreuzberger-der-woche/9305534.html
-
diff --git a/data/GrabberConfig/tampabay.com.txt b/data/GrabberConfig/tampabay.com.txt
deleted file mode 100644
index 47a6ffab..00000000
--- a/data/GrabberConfig/tampabay.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //span[@class="entry-title"]
-author: //*[contains(@class, 'item')]/p/a/text()
-date: substring-after(//*[contains(@class, 'item')]/p/text()[3], 'Posted:')
-body: //div[@class="entry-content"]
-test_url: http://www.tampabay.com/news/salvador-dali-leaders-want-st-petersburg-city-council-to-put-brakes-on/1236349 \ No newline at end of file
diff --git a/data/GrabberConfig/taptaptap.com.txt b/data/GrabberConfig/taptaptap.com.txt
deleted file mode 100644
index e1e79428..00000000
--- a/data/GrabberConfig/taptaptap.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h3[@class="storytitle"]
-body: //div[@class="post"]
-strip: //div[@class="blurbBox"]
-test_url: http://taptaptap.com/blog/apples-precedents-vs-apples-guidelines/ \ No newline at end of file
diff --git a/data/GrabberConfig/tasteofhome.com.txt b/data/GrabberConfig/tasteofhome.com.txt
deleted file mode 100644
index f3234f34..00000000
--- a/data/GrabberConfig/tasteofhome.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //div[@id='ctl00_MainContent_ctl00_Div1']//h2
-body: //div[@id='ctl00_MainContent_ctl00_Div1']
-
-single_page_link: //div[contains(@class, 'recipeHeader')]//a[contains(@href, '/print')]
-
-strip_image_src: tohPrintL.png
-
-prune: no
-
-test_url: http://www.tasteofhome.com/recipes/Grinch-Punch
-test_url: http://www.tasteofhome.com/recipes/lactose-free-chocolate-chip-cookies \ No newline at end of file
diff --git a/data/GrabberConfig/taz.de.txt b/data/GrabberConfig/taz.de.txt
deleted file mode 100644
index a3368568..00000000
--- a/data/GrabberConfig/taz.de.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-date: //div[@class='secthead']
-body: (//div[@class='sectbody'])[1]
-title: concat(//div[@class='sectbody']/h4,': ',//div[@class='sectbody']/h1)
-author: //span[@class='author']
-strip: //p[@class='caption']
-strip_id_or_class: ad_bin
-strip_id_or_class: rack
-
-test_url: http://www.taz.de/Protestbewegung-Occupy/!80188/ \ No newline at end of file
diff --git a/data/GrabberConfig/tbray.org.txt b/data/GrabberConfig/tbray.org.txt
deleted file mode 100644
index 558dc9c8..00000000
--- a/data/GrabberConfig/tbray.org.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@id='centercontent']
-strip: //div[@id='rightcontent']
-date: substring-before( //div[@id='cats'], '·')
-title: //h1
-test_url: http://www.tbray.org/ongoing/When/201x/2012/03/04/Mobile-Money \ No newline at end of file
diff --git a/data/GrabberConfig/teamliquid.net.txt b/data/GrabberConfig/teamliquid.net.txt
deleted file mode 100644
index c9a4f546..00000000
--- a/data/GrabberConfig/teamliquid.net.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-# Author: Jan Lukas Gernert
-
-tidy: no
-prune: no
-
-title: //div[@class='Newsheader']/h1
-#date: //time
-#author: //a[@rel='author']
-
-body: //div[@id='Newswrap']
-body: //div[@class='text']
-body: (//article)[1]
-
-strip: //div[@id='Newscontents']
-strip: //div[@class='Newsbanner']
-strip: //style
-strip: //a[@title='Share on Facebook']/parent::div
-
-
-
-test_url: http://www.teamliquid.net/forum/starcraft-2/484380-code-s-ro32-group-c-on-the-way-back-s2-2015
diff --git a/data/GrabberConfig/tech.fortune.cnn.com.txt b/data/GrabberConfig/tech.fortune.cnn.com.txt
deleted file mode 100644
index da198622..00000000
--- a/data/GrabberConfig/tech.fortune.cnn.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h1[@class='storyheadline']
-body: //div[@class='storytext']
-strip: //strong
-test_url: http://tech.fortune.cnn.com/2011/03/17/why-startups-dont-go-public-anymore/?section=money_topstories&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+rss%2Fmoney_topstories+%28Top+Stories%29 \ No newline at end of file
diff --git a/data/GrabberConfig/tech.sina.com.cn.txt b/data/GrabberConfig/tech.sina.com.cn.txt
deleted file mode 100644
index 75126f9c..00000000
--- a/data/GrabberConfig/tech.sina.com.cn.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title://h1[contains(@id,'artibodyTitle')]
-
-date://span[contains(@id,'pub_date')]
-
-body://div[contains(@id,'artibody')]
-
-strip://div[contains(@class,'otherContent')]
-
-next_page_link://p[@class='page']/a[contains(.,'下一页')]
-
-test_url: http://tech.sina.com.cn/mobile/n/2012-03-22/07476863046.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/techcrunch.com.txt b/data/GrabberConfig/techcrunch.com.txt
deleted file mode 100644
index 177b3f2c..00000000
--- a/data/GrabberConfig/techcrunch.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-body: //div[@class='article-entry text']
-
-author: //div[@class='byline']/a
-
-date: //div[@class="byline"]/time/@datetime
-
-title: //h1[@class="tweet-title"]
-strip_id_or_class: module-crunchbase
-strip_id_or_class: aside aside-related-articles
-
-# The following is for the mobile site
-body: //div[@id="singlentry"]
-author: substring-after(//span[@class="single-post-meta-top"],'rsaquo; ')
-date: substring-before(//div[@class="single-post-meta-top"],' @')
-title: //a[@class="sh2"]
-
-prune: no
-
-test_url: http://techcrunch.com/2016/02/02/spotcap/?ncid=rss&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+francaistechcrunch+%28TechCrunch+en+Francais%29
diff --git a/data/GrabberConfig/techdirt.com.txt b/data/GrabberConfig/techdirt.com.txt
deleted file mode 100644
index 7db2f95b..00000000
--- a/data/GrabberConfig/techdirt.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body: //div[@class='story']
-title: //div[@class='story']/h1
-strip: //div[@class='story']/h1
-
-author: //div[@class='details']/p[contains(., 'by ')]/a
-date: //p[@class='storydate']
-
-strip: //p[a[contains(., 'Leave a Comment')]]
-strip_id_or_class: share
-strip_id_or_class: maincolumn_head
-strip_id_or_class: maincolmod
-test_url: http://www.techdirt.com/articles/20120112/17455117394/sega-gets-it-right-about-sopa-its-time-hard-reset-copyright-law-congress.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/techhive.com.txt b/data/GrabberConfig/techhive.com.txt
deleted file mode 100644
index 48ecf300..00000000
--- a/data/GrabberConfig/techhive.com.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-title: //div[@class='articleHead']//h1
-author: //div[@class="author-name"]/a[1]
-body: //div[@class="main"]
-
-# remove 'From the Lab' and 'Recent posts' text
-strip: //div[@class='blogLabel']
-
-# remove byline and meta info
-strip: //div[@class="article-meta"]
-strip: //div[@class="author-info"]
-
-#strip tags and categories
-strip: //div[@class="department"]
-
-#strip product cap links
-strip: //div[@class="cap-main"]
-strip: //div[@id="compare-lede"]
-test_url: http://www.techhive.com/article/3023383/streaming-media/vlc-for-apple-tv-review-goodbye-format-woes.html
diff --git a/data/GrabberConfig/techmeme.com.txt b/data/GrabberConfig/techmeme.com.txt
deleted file mode 100644
index 26eb37b0..00000000
--- a/data/GrabberConfig/techmeme.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-single_page_link_in_feed: //b/a
-
-test_url: http://www.techmeme.com/feed.xml
diff --git a/data/GrabberConfig/techno-science.net.txt b/data/GrabberConfig/techno-science.net.txt
deleted file mode 100644
index 31dd7f4e..00000000
--- a/data/GrabberConfig/techno-science.net.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title://div[@class="news"]/div[@class="titre"]
-body://div[@class="news"]/div[@class="texte"]
-test_url: http://www.techno-science.net/?onglet=news&news=14808
diff --git a/data/GrabberConfig/technologizer.com.txt b/data/GrabberConfig/technologizer.com.txt
deleted file mode 100644
index 179bf5a6..00000000
--- a/data/GrabberConfig/technologizer.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-next_page_link: //a[contains(., 'NEXT PAGE')]
-# following::node() selects text nodes too whereas following::* selects only elements.
-strip: //span[@class='pageo']/following::node()
-strip: //span[@class='pageo']
-test_url: http://technologizer.com/2010/03/08/the-secret-origin-of-windows/ \ No newline at end of file
diff --git a/data/GrabberConfig/technologyreview.com.txt b/data/GrabberConfig/technologyreview.com.txt
deleted file mode 100644
index 9871f0ef..00000000
--- a/data/GrabberConfig/technologyreview.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //header[@class='article-topper__title']
-
-body: //section[contains(@class, 'body')]
-
-# Author & Date for News and Featured Stories
-author: //ul[@class='byline']/li/a
-author: substring-before(substring-after(//ul[@class='byline']/li, 'By '), ' on')
-date: substring-after(//ul[@class='byline']/li, 'on ')
-
-# Author & Date for "Views"
-author: //div[@class='view-byline']/div[@class='meta']/h2[1]
-date: //div[@class='view-byline']/div[@class='meta']/h2[2]
-
-strip_id_or_class: l-article-list
-
-next_page_link: //section[@class='pagination']/a[contains(@class, 'continue')]
-test_url: http://www.technologyreview.com/news/427567/facebooks-telescope-on-human-behavior/
diff --git a/data/GrabberConfig/techpinions.com.txt b/data/GrabberConfig/techpinions.com.txt
deleted file mode 100644
index 8e1aa96c..00000000
--- a/data/GrabberConfig/techpinions.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[@class="post"]
-
-strip: //div[@class="post-meta"]
-strip: //div[@id="socialicons"]
-strip: //div[@id="authorbox"]
-
-test_url: http://techpinions.com/why-google-and-microsoft-hate-siri/3572 \ No newline at end of file
diff --git a/data/GrabberConfig/techradar.com.txt b/data/GrabberConfig/techradar.com.txt
deleted file mode 100644
index 0a0ca619..00000000
--- a/data/GrabberConfig/techradar.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# Title without news/reviews etc. appended
-title: //div[@id='subColumn1Pad']/div[1][@class='article']/div[1][@class='articleHead']/h1
-
-# Remove home link
-strip: //div[@id='page_logo']/a
-
-# Remove utilities
-strip: //*[(@id = "utilities")]
-
-# Remove comments link
-strip: //div[@id='subColumn1Pad']/div[1][@class='article']/div[1][@class='articleHead']/p[@class='tiny']
-test_url: http://www.techradar.com/news/television/sky-to-rebrand-living-as-sky-living-903105 \ No newline at end of file
diff --git a/data/GrabberConfig/telegraaf.nl.txt b/data/GrabberConfig/telegraaf.nl.txt
deleted file mode 100644
index 91b5baf9..00000000
--- a/data/GrabberConfig/telegraaf.nl.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id='artikelKolom']
-strip: //div[@class='broodMediaBox']/div[@class='docbox' or @class='artBannerWrapper']
-strip: //div[@id='artikeltoolbar']
-strip: //div[@class='reactiebalk artspacer' or @class='bannercenter clearfix artspacer']
-strip: //div[@id='artikelKolomRechts' or @id='TMGTweetWidget']
-tidy: no
-prune: no
-
-test_url: http://www.telegraaf.nl/binnenland/10275097/__Identiteit_man_in_sloot_onbekend__.html?cid=rss \ No newline at end of file
diff --git a/data/GrabberConfig/telegraph.co.uk.txt b/data/GrabberConfig/telegraph.co.uk.txt
deleted file mode 100644
index 8dcdb42b..00000000
--- a/data/GrabberConfig/telegraph.co.uk.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[@class='byline' or @id='storyEmbSlide' or @id='mainBodyArea']
-strip: //p[@class='comments']
-strip: //div[@id='storyEmbSlide']//div[contains(@class, "hide")]
-strip: //div[@id='tmg-related-links' or @id='outbrain-related-links' or @id='onespot-related-links']
-strip: //p[@class='bbpTweet']/span[@class='timestamp']
-strip: //p[@class='bbpTweet']/span[@class='metadata']//img
-tidy: no
-prune: no
-
-test_url: http://www.telegraph.co.uk/news/worldnews/europe/ireland/8663451/Is-Ireland-divorcing-from-the-Catholic-Church.html \ No newline at end of file
diff --git a/data/GrabberConfig/thanhnien.com.vn.txt b/data/GrabberConfig/thanhnien.com.vn.txt
deleted file mode 100644
index 596ecc90..00000000
--- a/data/GrabberConfig/thanhnien.com.vn.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body://div[@id="print-news"]
-strip://a
-strip://span[@class="date-line"]
-test_url: http://www.thanhnien.com.vn/pages/20121006/hon-90-trieu-usd-nang-cap-do-thi-can-tho.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/the-magazine.org.txt b/data/GrabberConfig/the-magazine.org.txt
deleted file mode 100644
index 08864657..00000000
--- a/data/GrabberConfig/the-magazine.org.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-tidy: no
-
-test_url: http://the-magazine.org/1/alone-together-again \ No newline at end of file
diff --git a/data/GrabberConfig/theage.com.au.txt b/data/GrabberConfig/theage.com.au.txt
deleted file mode 100644
index ea27c314..00000000
--- a/data/GrabberConfig/theage.com.au.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //h3[@class='authorName']
-date: //time
-body: //div[@class='articleBody']
-strip_id_or_class: adspot
-test_url: http://www.theage.com.au/victoria/top-cops-warns-outlaw-bikies-we-have-a-gang-too-20130331-2h1l8.html \ No newline at end of file
diff --git a/data/GrabberConfig/theamericanscholar.org.txt b/data/GrabberConfig/theamericanscholar.org.txt
deleted file mode 100644
index 38b96672..00000000
--- a/data/GrabberConfig/theamericanscholar.org.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Article Metadata
-title: //meta[@property="og:title"]/@content
-author: substring-after(//h3, 'By ')
-date: //h4/a[2]
-
-# Content Pruning
-strip: //h4
-strip: //a[@id="print_button"]
-strip: //p[@class="excerpt"]
-strip: //h3
-strip: //div[@class="caption"]
-strip: //center/a/img
-test_url: http://theamericanscholar.org/too-big-to-fail-and-too-risky-to-exist/ \ No newline at end of file
diff --git a/data/GrabberConfig/theatlantic.com.txt b/data/GrabberConfig/theatlantic.com.txt
deleted file mode 100644
index 0c6e7c14..00000000
--- a/data/GrabberConfig/theatlantic.com.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-title: //div[contains(@class, 'articleHead')]//h1
-
-single_page_link: //link[contains(@href, '/amp/article/')]
-
-body: //div[@itemprop='articleBody']
-body: //div[@class='articleText']
-body: //div[@class='articleContent']
-body: //div[@id='article']
-date: //*[contains(@class, 'date')]
-author: //div[@id='profile']//*[@class='authors']//a[1]
-author: //*[@class='author']/span
-prune: no
-
-strip: //div[@class='moreOnBoxWithImages']
-strip: //p[contains(., 'This article available online at:')]
-strip: //p[contains(., 'This article available online at:')]/following::*
-strip: //div[@class='earthbox']
-
-single_page_link: //div[contains(@class, 'article-tools')]//a[contains(@class, 'print')]
-
-native_ad_clue: //meta[@property="og:url" and contains(@content, '/sponsored/')]
-
-#multi-page article
-test_url: http://www.theatlantic.com/magazine/archive/2014/12/the-real-roots-of-midlife-crisis/382235/
-test_contains: The curve tends to evince itself
-
-test_url: http://www.theatlantic.com/technology/archive/2011/04/want-to-see-how-crazy-a-bot-run-market-can-be/237773/
-test_url: http://www.theatlantic.com/magazine/archive/2007/11/the-autumn-of-the-multitaskers/6342/
-test_url: http://www.theatlantic.com/entertainment/archive/2012/04/30-rock-live-a-funny-reminder-of-why-sitcoms-arent-shot-live-anymore/256447/
-test_url: http://www.theatlantic.com/technology/archive/2013/06/fix-things-never-force-it-lessons-from-grandpa/276873/
diff --git a/data/GrabberConfig/theatlanticcities.com.txt b/data/GrabberConfig/theatlanticcities.com.txt
deleted file mode 100644
index 880f207d..00000000
--- a/data/GrabberConfig/theatlanticcities.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-# To administrator:
-# Please replace the hostname with "*.theatlanticcities.com"
-
-# This filter is tested on:
-# http://m.theatlanticcities.com/arts-and-lifestyle/2012/04/invisible-borders-define-american-culture/1839/
-# http://www.theatlanticcities.com/housing/2012/11/chinas-holdouts/3981/
-# http://www.theatlanticcities.com/arts-and-lifestyle/2012/12/christmas-time-here/4133/
-
-title://h1
-author: //ul[@class='meta']/li/a
-date: //ul[@class='meta']/li/following-sibling::li
-body://article[@class='post']
-
-strip://h1
-strip://ul[@class='meta']
-strip://div[@class='newsletter-slug']
-test_url: http://www.theatlanticcities.com/arts-and-lifestyle/2012/12/christmas-time-here/4133/ \ No newline at end of file
diff --git a/data/GrabberConfig/theaustralian.com.au.txt b/data/GrabberConfig/theaustralian.com.au.txt
deleted file mode 100644
index 1245efca..00000000
--- a/data/GrabberConfig/theaustralian.com.au.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[contains(@class, 'story-body')]
-author: //cite[contains(@class, 'author')]
-date: //span[@class='datestamp']
-
-strip: //div[@class='story-info']
-
diff --git a/data/GrabberConfig/thebostonchannel.com.txt b/data/GrabberConfig/thebostonchannel.com.txt
deleted file mode 100644
index 808876da..00000000
--- a/data/GrabberConfig/thebostonchannel.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //meta[@name='og:title']/@content
-date: //meta[@name='created']/@content
-body: //div[contains(@class, "article-body")]
-
-replace_string(<p></p>): <br /><br />
-
-test_url: http://www.wcvb.com/news/2-teens-arrested-in-fatal-dorchester-shooting-of-16yearold-boy/33564886
diff --git a/data/GrabberConfig/thedailybeast.com.txt b/data/GrabberConfig/thedailybeast.com.txt
deleted file mode 100644
index f5e938ae..00000000
--- a/data/GrabberConfig/thedailybeast.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1
-body: //article/div[contains(@class, 'article-body')]
-#strip: //header/hgroup/h1
-strip: //footer[@class='storyFooter']
-single_page_link: //li[@class='print']/a
-prune: no
-test_url: http://www.thedailybeast.com/articles/2010/04/06/how-mastercard-predicts-divorce.html \ No newline at end of file
diff --git a/data/GrabberConfig/thedailymash.co.uk.txt b/data/GrabberConfig/thedailymash.co.uk.txt
deleted file mode 100644
index a83a6cf6..00000000
--- a/data/GrabberConfig/thedailymash.co.uk.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Remove duplicated title
-strip: //div[@id='content']/div[1][@class='full_intro']/h2
-
-# Remove links, ads etc.
-strip: //*[(@class= "aside")]
-
-# Remove the date and add it to the date published field in Instapaper
-strip: //div[@class="date"]
-date: //div[@class="date"]
-
-# There is no byline on The Daily Mash.
-
-convert_double_br_tags: yes
-test_url: http://www.thedailymash.co.uk/index.php?option=com_content&task=view&id=4994&Itemid=81&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+thedailymash+%28The+Daily+Mash.+It%27s+news+to+us.%29 \ No newline at end of file
diff --git a/data/GrabberConfig/thedisneyblog.com.txt b/data/GrabberConfig/thedisneyblog.com.txt
deleted file mode 100644
index 57b3254a..00000000
--- a/data/GrabberConfig/thedisneyblog.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[contains(@class, 'entry-title')]
-author: //span[contains(@class, 'author vcard')]
-date: //span[@class = 'entry-date']
-body: //div[@class='entry-content']
-strip_id_or_class: bottomcontainerBox
-strip_id_or_class: lightsocial_container
-test_url: http://thedisneyblog.com/2012/11/17/videopolis-one-woman-disney-musical-beauty-and-the-beast/ \ No newline at end of file
diff --git a/data/GrabberConfig/thefilmexperience.net.txt b/data/GrabberConfig/thefilmexperience.net.txt
deleted file mode 100644
index e6b5115a..00000000
--- a/data/GrabberConfig/thefilmexperience.net.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='body']
-test_url: http://thefilmexperience.net/blog/2011/12/30/distant-relatives-2001-a-space-odyssey-and-the-tree-of-life.html \ No newline at end of file
diff --git a/data/GrabberConfig/thegamedesignforum.com.txt b/data/GrabberConfig/thegamedesignforum.com.txt
deleted file mode 100644
index 849ede77..00000000
--- a/data/GrabberConfig/thegamedesignforum.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-## ERROR: Removes all images. Please fix, have no idea why (bad HTML?)
-
-title: //h1[@class='featuretitle']
-body: //div[@id='nobordercontentarea']
-
-# remove Twitter badge
-strip: //img[@alt='Follow tgdfweb on Twitter']
-
-# fix for headers not showing for some reason
-wrap_in(h2): //h2[@class='sectionheader']
-dissolve: //h2[@class='sectionheader']
-
-tidy: yes
-test_url: http://thegamedesignforum.com/features/acceleration_flow_1.html \ No newline at end of file
diff --git a/data/GrabberConfig/thegap.at.txt b/data/GrabberConfig/thegap.at.txt
deleted file mode 100644
index 5bf8ce50..00000000
--- a/data/GrabberConfig/thegap.at.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-prune: no
-tidy: no
-
-title: //h1
-strip: //h1
-
-date: //span[contains(concat(' ', normalize-space(@class), ' '), ' date ')]
-strip: //span[contains(concat(' ', normalize-space(@class), ' '), ' date ')]
-
-# Article
-
-author: normalize-space(substring-after(//div[@class='artikel']/p[1], 'von '))
-strip: //div[@class='artikel']/p[1]
-
-next_page_link: //a[@class='but weiter']/@href
-strip: //div[@class='browsetext']
-
-body: //div[@class='artikel']
-strip: //h5
-strip: //div[@class='copyrights']
-strip: //div[@class='textbox']
-strip: (//div[@class='artikel']//br)[1]
-strip: //div[@class='clear']
-strip: //p[starts-with(., 'Weiter zu:')]
-strip: //a[@name='minislide']
-strip: //div[@class='kommentare']
-
-# Slideshows
-
-author: normalize-space(substring-after(//div[@id='normal']/p[1], 'von '))
-strip: //div[@id='normal']/p[1]
-
-body: //div[@id='normal']
-next_page_link: //a[@class='next']/@href
-strip: //a[@class='next']
-strip: //a[@class='prev']
-strip: (//div[@id='normal']//br)[1]
-
-test_url: http://www.thegap.at/rubriken/stories/artikel/lecko-mio/
-test_url: http://www.thegap.at/rubriken/stories/artikel/die-frauen-im-arkadenhof/
-test_url: http://www.thegap.at/rubriken/stories/artikel/nothilfe-im-wandel/
diff --git a/data/GrabberConfig/theglobalmail.org.txt b/data/GrabberConfig/theglobalmail.org.txt
deleted file mode 100644
index da1c84f9..00000000
--- a/data/GrabberConfig/theglobalmail.org.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-title: //h1[@id="headline"]
-author: //div[contains(@class, "editorial-byline-author")]/a
-date: substring-after(//div[contains(@class, "editorial-byline-meta")], " | ")
-
-# The article body contains a mix or article and non-article elements, so lot of manual tweaks are needed
-body: //div[@id="template"]
-strip_id_or_class: editorial-byline-pic
-strip_id_or_class: editorial-byline
-strip_id_or_class: headline
-
-# Include the leadin paragraph in the body text, but remove quotes because they're out of context
-dissolve: //div[contains(@id, "leadin")]
-strip_id_or_class: pullquote
-
-# Image captions removed because they're confusing in body text
-strip_id_or_class: image-caption-content
-
-# Remove header and footer
-strip_id_or_class: header
-strip_id_or_class: footer
-
-# Remove the hidden logo that seems to be used to cause Facebook to show the logo instead of a random article image
-strip: /html/body/span[contains(@style, "display: none")]
-
-# Remove search box
-strip_id_or_class: searchContainer
-strip: //div[contains(@class, "searchInstruction")]
-strip: //div[contains(@class, "searchResults")]/h4
-
-# Remove the 'Letters to the Editor' section
-strip_id_or_class: letter-text
-strip_id_or_class: letter-from
-strip_id_or_class: letter-date
-
-# Remove Like/Tweet links
-strip_id_or_class: social-tab
-
-# Remove 'divider' which causes an inexplicable slash to appear in the article body
-strip_id_or_class: divider
-
-test_url: http://www.theglobalmail.org/feature/tiramisu-time-in-pyongyang/88/ \ No newline at end of file
diff --git a/data/GrabberConfig/theglobeandmail.com.txt b/data/GrabberConfig/theglobeandmail.com.txt
deleted file mode 100644
index 2473cad2..00000000
--- a/data/GrabberConfig/theglobeandmail.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[contains(@class, 'entry-content')]//div[contains(@class, 'column-2')]
-single_page_link: //div[contains(@class, 'pagination')]//a[contains(@title, 'ingle page')]
-strip_id_or_class: entry-related
-strip_id_or_class: entry-sidebar
-strip_id_or_class: entry-pagination
-tidy: no
-prune: no
-
-test_url: http://www.theglobeandmail.com/report-on-business/rob-magazine/how-a-novice-miner-survived-a-summer-in-the-klondike/article2345350/
-test_url: http://www.theglobeandmail.com/report-on-business/industry-news/energy-and-resources/cliffs-natural-resources-looking-to-exit-ontarios-ring-of-fire/article20651617/ \ No newline at end of file
diff --git a/data/GrabberConfig/thegreatdiscontent.com.txt b/data/GrabberConfig/thegreatdiscontent.com.txt
deleted file mode 100644
index 12442b40..00000000
--- a/data/GrabberConfig/thegreatdiscontent.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@id='headline']
-author: substring-after(//section[@class="credits"]/ul/li[1],"Interview by ")
-date: //time[@pubdate]
-body: //article[@class='interview']
-strip: //article[@class='interview']/footer
-test_url: http://thegreatdiscontent.com/jeffrey-zeldman \ No newline at end of file
diff --git a/data/GrabberConfig/theguardian.com.txt b/data/GrabberConfig/theguardian.com.txt
deleted file mode 100644
index 31577dbe..00000000
--- a/data/GrabberConfig/theguardian.com.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-title: //h1[@itemprop='headline']
-
-body: //article
-body: //div[contains(concat(' ',normalize-space(@class),' '),' content__main ')]//div[contains(concat(' ',normalize-space(@class),' '),' gs-container ')]
-strip: //article/header/div[contains(@class, 'content__header')]
-strip: //article/header/div[contains(@class, 'content__logo-container')]
-strip: //article//div[contains(@class, 'content__secondary-column')]
-strip: //article//aside
-strip: //article//div[contains(@class, 'block-share')]
-strip: //article//div[@class='submeta']
-strip: //article//span[contains(@class, 'inline-expand-image')]
-strip: //article//div[@class='kindleWidget']
-strip: //article//div[@class='email-subscription']
-strip: //article//script
-strip: //article//figure[contains(@class, 'element-audio')]
-strip: //article//a[contains(@style, 'display: none')]
-strip: //article/div[@class='paidfor-band']
-
-author: //article//p[@class='byline']
-date: //article//time/@datetime
-strip: //article//div[contains(@class, 'content__meta-container')]
-
-native_ad_clue: //meta[@property='article:tag' and contains(@content, 'partner zone')]
-native_ad_clue: //meta[@property='video:tag' and contains(@content, 'partner zone')]
-
-prune: no
-tidy: no
-
-test_url: http://www.theguardian.com/world/2013/oct/04/nsa-gchq-attack-tor-network-encryption
-test_contains: The National Security Agency has made repeated attempts to develop
-test_contains: The agency did not directly address those questions, instead providing a statement.
-
-test_url: http://www.theguardian.com/world/2013/oct/03/edward-snowden-files-john-lanchester
-test_contains: In August, the editor of the Guardian rang me up and asked if I would spend a week in New York
-test_contains: As the second most senior judge in the country, Lord Hoffmann, said in 2004 about a previous version of our anti-terrorism laws
-
-test_url: http://www.theguardian.com/commentisfree/2014/jun/15/britishness-search-identity-my-part-in-camerons-odyssey
-test_url: http://www.theguardian.com/world/2016/feb/17/ankara-explosion-turkey-injures-large-number-of-people-reports-say
-test_url: http://www.theguardian.com/uk-news/2016/feb/11/trident-the-british-question
-test_url: https://www.theguardian.com/books/live/2016/oct/13/nobel-prize-in-literature-2016-liveblog
-
-# Native ad
-test_url: http://www.theguardian.com/sustainable-business/fairtrade-partner-zone/chocolate-cocoa-production-risk
diff --git a/data/GrabberConfig/theindychannel.com.txt b/data/GrabberConfig/theindychannel.com.txt
deleted file mode 100644
index 2cd865bb..00000000
--- a/data/GrabberConfig/theindychannel.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //h1[@class="Headline"]
-date: substring-after(//div[@class="posted"], 'EDT ')
-body: //div[@class="storyBody"]
-
-strip: //td[@class="AssocContentTD"]
-strip: //div[@id="pageTitle"]
-strip: //div[@class="posted"]
-strip: //div[@class="updated"]
-strip: //div[@class="js-kit-disclaimer"]
-strip: //table[@class="row3table"]
-strip: //div[@class="container2"]
-strip: //div[@id="delta"]
-test_url: http://www.theindychannel.com/news/31050840/detail.html \ No newline at end of file
diff --git a/data/GrabberConfig/theintercept.com.txt b/data/GrabberConfig/theintercept.com.txt
deleted file mode 100644
index 51f87d43..00000000
--- a/data/GrabberConfig/theintercept.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h1[@class="Headline"]
-body: //div[@class="PostContent"]
-
-test_url: https://theintercept.com/2014/10/30/inside-story-matt-taibbis-departure-first-look-media/
diff --git a/data/GrabberConfig/themarker.com.txt b/data/GrabberConfig/themarker.com.txt
deleted file mode 100644
index 141b1a3b..00000000
--- a/data/GrabberConfig/themarker.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[contains(@class, 'mainTitle')]
-author: //ul[@class='author']//a[@rel='author']
-body: //div[@id='article-box']
-prune: no
-tidy: no
-strip_id_or_class: head
-strip_id_or_class: social-nav
-strip_id_or_class: rate
-strip_id_or_class: video
-
-test_url: http://www.themarker.com/markerweek/1.2093167 \ No newline at end of file
diff --git a/data/GrabberConfig/themillions.com.txt b/data/GrabberConfig/themillions.com.txt
deleted file mode 100644
index 4d46daee..00000000
--- a/data/GrabberConfig/themillions.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: /html/body/div/div[2]/div/div/div/h3
-
-body: /html/body/div/div[2]/div/div/div/div[2]
-
-strip: /html/body/div/div[2]/div/div/div/div[6]/div[3]/div/div/div
-
-tidy: no
-
-# any way to get rid of this word character garbage?
-test_url: http://www.themillions.com/2010/07/at-the-movies-with-david-mitchell-the-thousand-autumns-of-jacob-de-zoet.html \ No newline at end of file
diff --git a/data/GrabberConfig/thenation.com.txt b/data/GrabberConfig/thenation.com.txt
deleted file mode 100644
index dab17f0b..00000000
--- a/data/GrabberConfig/thenation.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //h2[@property='dc:title']
-#body: //div[@class='print-content']
-body: //div[@id='wysiwyg']
-author: //a[contains(@href, '/authors')]
-author: substring-before(//div[@class='print-created'], '|')
-date: //span[@class='article-date']
-date: substring-after(//div[@class='print-created'], '|')
-prune: no
-
-#single_page_link: //ul[contains(@class, 'article-actions-bar')]//a[contains(@href, '/print/article/')]
-single_page_link: //ul[contains(@class, 'article-actions-bar')]//a[contains(@href, '?page=full')]
-
-test_url: http://www.thenation.com/article/162331/hard-against-time-roy-fisher \ No newline at end of file
diff --git a/data/GrabberConfig/thenetworkgarden.blogs.com.txt b/data/GrabberConfig/thenetworkgarden.blogs.com.txt
deleted file mode 100644
index b7f5f0f0..00000000
--- a/data/GrabberConfig/thenetworkgarden.blogs.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@id="beta-inner"]
-title: //h3[@class="entry-header"]
-
-test_url: http://thenetworkgarden.blogs.com/weblog/2011/09/microsoft-metro-and-the-next-wave-in-computing.html \ No newline at end of file
diff --git a/data/GrabberConfig/thenews.coop.txt b/data/GrabberConfig/thenews.coop.txt
deleted file mode 100644
index 7d593805..00000000
--- a/data/GrabberConfig/thenews.coop.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class='entry-content']
-
-test_url: http://www.thenews.coop/98221/news/co-operatives/jeremy-corbyn-needs-co-op-movement/
diff --git a/data/GrabberConfig/thenextgeneration.org.txt b/data/GrabberConfig/thenextgeneration.org.txt
deleted file mode 100644
index dedd989f..00000000
--- a/data/GrabberConfig/thenextgeneration.org.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1[@class='interior-page-title']
-author: //span[@class='author']/a
-date: //div[@class='byline']/time
-body: //div[@class='rich-text-body']
-
-strip: //div[@class='byline']
-strip: //div[@class='offscreen-menu']
-test_url: http://thenextgeneration.org/blog/post/rebrand-announce/ \ No newline at end of file
diff --git a/data/GrabberConfig/thenextweb.com.txt b/data/GrabberConfig/thenextweb.com.txt
deleted file mode 100644
index 583b725b..00000000
--- a/data/GrabberConfig/thenextweb.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //h1[@class='title']
-body: //div[@class='l-postSingle-content-main-video'] | //div[contains(concat(' ',normalize-space(@class),' '),' l-postSingle-content-main-content ')]
-author: //a[@class='author']
-date: //div[@class='meta']/time/@datetime
-
-strip: //div[contains(concat(' ',normalize-space(@class),' '),' l-postSingle-content-bottom-share ')]
-strip_id_or_class: articleShare-buttons
-strip_id_or_class: ica-wrapper
-strip_id_or_class: post-author-bio
-strip_id_or_class: post-author-trivia
-replace_string(data-original=): src=
-
-tidy: no
-
-test_url: http://thenextweb.com/apple/2011/10/12/tnw-review-a-complete-guide-to-apples-ios-5-with-icloud-an-os-14-years-in-the-making/
-test_url: http://thenextweb.com/insider/2015/12/06/pornhubs-christmas-ad-wants-you-to-give-premium-subscriptions-to-your-grandparents/
diff --git a/data/GrabberConfig/theoaklandpress.com.txt b/data/GrabberConfig/theoaklandpress.com.txt
deleted file mode 100644
index c9abda71..00000000
--- a/data/GrabberConfig/theoaklandpress.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='fullstory']
-strip: //div[@id='page_leftbar']
-test_url: http://theoaklandpress.com/articles/2011/04/25/news/doc4db5330e0bce9220005852.txt \ No newline at end of file
diff --git a/data/GrabberConfig/theonion.com.txt b/data/GrabberConfig/theonion.com.txt
deleted file mode 100644
index 90e8d658..00000000
--- a/data/GrabberConfig/theonion.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h2[@class='title']
-date: substring-before(//p[@class='meta'], '|')
-body: //div[@class='story']
-#body: //div[@class='article_body']
-
-strip: //h2[@class='title']
-strip: //p[@class='meta']
-strip: //div[@class='ga_section']
-strip: //div[@id='recent_slider']
-
-test_url: http://www.theonion.com/articles/pathetic-bobcats-owner-again-regaling-players-with,27572/ \ No newline at end of file
diff --git a/data/GrabberConfig/thepioneerwoman.com.txt b/data/GrabberConfig/thepioneerwoman.com.txt
deleted file mode 100644
index 75583cd3..00000000
--- a/data/GrabberConfig/thepioneerwoman.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //h1[@class='post-title']
-body: //div[@class='post']
-author: //p[@class='posted-by']
-date: //div[@class='sprite post-date']
-
-# The body of the post doesn't have it's own div so we have to strip out the metadata
-strip: //div[@class='author_avatar']
-strip: //div[@class='sprite post-date']
-strip: //h1[@class='post-title']
-strip: //p[@class='posted-by']
-test_url: http://thepioneerwoman.com/cooking/2011/08/pie-fats-a-comparison/ \ No newline at end of file
diff --git a/data/GrabberConfig/thepointmag.com.txt b/data/GrabberConfig/thepointmag.com.txt
deleted file mode 100644
index 2a822cde..00000000
--- a/data/GrabberConfig/thepointmag.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-body: //div[@class='article']
-strip_id_or_class: z-max
-strip_id_or_class: readLaterMenu
-
-test_url: https://thepointmag.com/2016/examined-life/can-liberal-education-save-the-sciences
diff --git a/data/GrabberConfig/theregister.co.uk.txt b/data/GrabberConfig/theregister.co.uk.txt
deleted file mode 100644
index 70d3d437..00000000
--- a/data/GrabberConfig/theregister.co.uk.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-single_page_link: //link[contains(@href, 'm.theregister')]
-if_page_contains: //div[@id='nextpage']
-strip: //div[@class='wptl btm']
-body: //div[contains(@class,'article_head')]//h2 | //div[@id='body']
-
-#multipage
-test_url: http://www.theregister.co.uk/2015/07/06/geeks_guide_spaceguard_center/
-#singlepage
-test_url: http://www.theregister.co.uk/2015/07/06/us_japan_massive_robots_in_the_ring/
diff --git a/data/GrabberConfig/theroot.com.txt b/data/GrabberConfig/theroot.com.txt
deleted file mode 100644
index 1f56316d..00000000
--- a/data/GrabberConfig/theroot.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='node-content']
-strip_id_or_class: pager
-test_url: http://www.theroot.com/views/why-i-am-male-feminist \ No newline at end of file
diff --git a/data/GrabberConfig/therumpus.net.txt b/data/GrabberConfig/therumpus.net.txt
deleted file mode 100644
index 84d0e783..00000000
--- a/data/GrabberConfig/therumpus.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: /html/body/div/div[2]/div/div/h1
-
-body: /html/body/div/div[2]/div/div/div[2]
-test_url: http://therumpus.net/2010/07/the-rumpus-interview-with-david-means/?full=yes \ No newline at end of file
diff --git a/data/GrabberConfig/thesimpledollar.com.txt b/data/GrabberConfig/thesimpledollar.com.txt
deleted file mode 100644
index dcdf2572..00000000
--- a/data/GrabberConfig/thesimpledollar.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h3[@class='post-title']/a[@class='post-title-link']
-body: //div[@class='post-content']
-author: //div[@class='post-meta-under-title']/a
-test_url: http://www.thesimpledollar.com/2011/09/13/determining-the-size-of-your-emergency-fund/ \ No newline at end of file
diff --git a/data/GrabberConfig/thespoiler.co.uk.txt b/data/GrabberConfig/thespoiler.co.uk.txt
deleted file mode 100644
index ca983281..00000000
--- a/data/GrabberConfig/thespoiler.co.uk.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-strip: //*[(@id = "content")]/h2
-strip: //*[(@class = "wp-notable-line")]
-test_url: http://www.thespoiler.co.uk/index.php/2010/10/21/wayne-rooney-tells-man-utd-its-not-me-its-you \ No newline at end of file
diff --git a/data/GrabberConfig/thespoof.com.txt b/data/GrabberConfig/thespoof.com.txt
deleted file mode 100644
index f71cfb6b..00000000
--- a/data/GrabberConfig/thespoof.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1[contains(@class, 'cTitle')]
-body: //div[contains(@class, 'KonaBody') or @id='articleimageright']
-author: //meta[@name='Author']/@content
-date: //meta[@name='OriginalPublicationDate']/@content
-
-prune: no
-tidy: no
-
-test_url: http://www.thespoof.com/news/spoof.cfm?headline=s8i108389 \ No newline at end of file
diff --git a/data/GrabberConfig/thestranger.com.txt b/data/GrabberConfig/thestranger.com.txt
deleted file mode 100644
index 6fcf4fdf..00000000
--- a/data/GrabberConfig/thestranger.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# savage* filtering is for Savage Love, such as: http://www.thestranger.com/seattle/SavageLove?oid=5135029
-
-#other filtering are plain articles, such as: http://www.thestranger.com/seattle/the-stranger-election-control-board/Content?oid=5142885
-
-title: //div[@id='savageColumn_head']/h1
-title: //h1[@class="headlineLarge"]
-
-strip: //div[@id='savage_right'] | //div[@id='savageColumn_head'] | //div[@id='savageArticleRight'] | //div[@id='articleRight'] | //div[@class='savAppBanner']
-
-body: //div[@id='savageColumn']
-body: //div[@id='story_text']
-test_url: http://www.thestranger.com/seattle/SavageLove?oid=5135029 \ No newline at end of file
diff --git a/data/GrabberConfig/thestreet.com.txt b/data/GrabberConfig/thestreet.com.txt
deleted file mode 100644
index 58eabf00..00000000
--- a/data/GrabberConfig/thestreet.com.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-title: //div[@id='storyHdr']/h1
-title: //div[@id='print']//h2
-body: //div[@class="virtualpage"]
-body: //div[@id='print']//div[@id='bd']
-author: //meta[@name="AUTHOR"]/@content
-author: (//div[@id='print']//div[@id='bd']/h4)[1]
-date: //meta[@name="DATE"]/@content
-date: //div[@id='print']//div[@id='dte']
-
-strip_id_or_class: articleFooter
-strip_id_or_class: sidebar
-strip_id_or_class: ie6PrintSubhead
-strip_id_or_class: subHdr
-
-
-replace_string(<P/>): </p><p>
-
-prune: no
-
-#TODO: redirects back - perhaps needs referer to work
-single_page_link: //div[@id='storyDetail']//a[contains(@href, '/print/')]
-
-test_url: http://www.thestreet.com/story/11386556/1/which-of-these-10-dividend-stocks-is-worth-the-risk.html
-# multi page
-test_url: http://www.thestreet.com/story/11387090/1/7-ubs-stock-picks-for-2012.html \ No newline at end of file
diff --git a/data/GrabberConfig/thethaovanhoa.vn.txt b/data/GrabberConfig/thethaovanhoa.vn.txt
deleted file mode 100644
index 6b3277eb..00000000
--- a/data/GrabberConfig/thethaovanhoa.vn.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip:/html/body/form/div[2]/div[3]/div/div/div/div/div/div/div/div/div/div[2]/div[3]/div[2]/div/p[2]
-test_url: http://thethaovanhoa.vn/151N20110519085606745T129/levante-quyet-giu-caicedo.htm \ No newline at end of file
diff --git a/data/GrabberConfig/theverge.com.txt b/data/GrabberConfig/theverge.com.txt
deleted file mode 100644
index be1e2234..00000000
--- a/data/GrabberConfig/theverge.com.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-author: //p[contains(@class, "byline")]/a[contains(@class, "author")]
-title: //section[contains(concat(' ',normalize-space(@class),' '),' lede ')]//h1
-date: //span[contains(@class, "publish-date")]/time[@pubdate]/@datetime
-
-body: //div[contains(@class, 'm-article__entry-section')]
-# for vergecasts, e.g. http://www.theverge.com/2013/8/22/4648566/the-vergecast-090-august-22th-2013-video
-body: //article
-body: //div[contains(concat(' ',normalize-space(@class),' '),' l-col__main ')]
-
-prune: no
-#tidy: no
-
-strip: //h3
-strip: //article/header
-strip: //*[@id='sticky-menu']
-strip: //aside
-strip: //nav
-strip: //img[contains(@class, 'vox-lazy-load')]
-# deal with bad parsing
-strip: //div[contains(@class, 'story-image')]//div[contains(., 'function(')]
-strip: //div[contains(@class, 'm-linkset')]
-strip: //div[contains(@class, 'm-entry__sidebar')]
-strip: //ul[contains(@class, 'm-article__sources')]
-strip: //div[contains(@class, 'chorus-emc__content')]
-
-
-strip_id_or_class: gallery
-strip_id_or_class: article-meta
-strip_id_or_class: story-navigation
-strip_id_or_class: slegend
-strip_id_or_class: related-product-meta
-strip_id_or_class: comments
-strip_id_or_class: ui-jump-list
-strip_id_or_class: pullquote
-strip_id_or_class: m-ad
-strip_id_or_class: social-sharing
-strip_id_or_class: m-video-entry__excerpt
-strip_id_or_class: hidden
-strip_id_or_class: m-article__follow-bar
-strip_id_or_class: m-article__share-buttons
-strip_id_or_class: l-col__sidebar
-strip_id_or_class: c-river
-strip_id_or_class: chorus-ad-placement
-strip_id_or_class: c-related-list
-
-replace_string(<noscript>): <div>
-replace_string(</noscript>): </div>
-
-find_string: <script
-replace_string: <div style="display:none"
-find_string: </script>
-replace_string: </div>
-
-strip: //q
-
-strip: //a[contains(@class, 'entry-section-title')]
-
-test_url: http://www.theverge.com/2012/2/29/2821763/lytro-review
-test_url: http://www.theverge.com/2011/11/3/2534861/nokia-lumia-800-review
-test_url: http://www.theverge.com/2013/2/24/4026114/barnes-noble-shifting-focus-away-from-nook-hardware
-test_url: http://www.theverge.com/2014/6/19/5824072/top-shelf-living-the-dream
-test_url: http://www.theverge.com/rss/frontpage
diff --git a/data/GrabberConfig/theweek.com.txt b/data/GrabberConfig/theweek.com.txt
deleted file mode 100644
index 4bc95323..00000000
--- a/data/GrabberConfig/theweek.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@class="article-body underline"]
-
-strip_id_or_class: appendedAds
-strip_id_or_class: right-ad-container
-strip_id_or_class: ad_wrap
-
-test_url: http://theweek.com/article/index/215763/insider-trading-on-capitol-hill
-test_url: https://theweek.com/articles/642979/why-poor-whites-flock-donald-trump
diff --git a/data/GrabberConfig/thinkprogress.org.txt b/data/GrabberConfig/thinkprogress.org.txt
deleted file mode 100644
index 1eec4e3c..00000000
--- a/data/GrabberConfig/thinkprogress.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //p[@class="byline"]/a
-body: //div[@class="post"]
-
-test_url: http://thinkprogress.org/special/2011/11/12/367040/harvard-law-professor-criticizes-homeland-security-feel-of-overreaction-to-occupy-harvard/ \ No newline at end of file
diff --git a/data/GrabberConfig/thisdaylive.com.txt b/data/GrabberConfig/thisdaylive.com.txt
deleted file mode 100644
index 73b3c9ed..00000000
--- a/data/GrabberConfig/thisdaylive.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class='main-content-panel']/div[@class='img'] | //div[@id='page_content_Content9_oModuleContent_2_div_Body']
-test_url: http://www.thisdaylive.com/articles/australia-pm-talks-human-rights-with-chinas-wen/90394/ \ No newline at end of file
diff --git a/data/GrabberConfig/thisiscolossal.com.txt b/data/GrabberConfig/thisiscolossal.com.txt
deleted file mode 100644
index ab16ce18..00000000
--- a/data/GrabberConfig/thisiscolossal.com.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-# Author: zinnober
-
-tidy: no
-prune: no
-
-# Set author
-author: //a[contains(@rel, 'author')]
-
-# Content is here
-body: //article
-
-# Tidy up before article
-strip: //header
-
-# Get rid of doubled images
-strip: //img[contains(@class, '-hidden')]
-
-# Tidy up after article
-strip_id_or_class: social-list
-strip_id_or_class: meta-info
-strip: //footer
-
-# Try it yourself
-test_url: http://www.thisiscolossal.com/2014/09/chicago-in-the-fog-by-michael-salisbury/
-test_url: http://www.thisiscolossal.com/2014/09/bird-portraits-ruffling-with-personality-by-leila-jeffreys/
diff --git a/data/GrabberConfig/tidbits.com.txt b/data/GrabberConfig/tidbits.com.txt
deleted file mode 100644
index 1950e58e..00000000
--- a/data/GrabberConfig/tidbits.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-author: //span[@class='fn']
-date: substring-before(substring-after(//*[@id='center_ajax_sub']/div/div[3],'|'),'|')
-test_url: http://tidbits.com/article/12651 \ No newline at end of file
diff --git a/data/GrabberConfig/time.com.txt b/data/GrabberConfig/time.com.txt
deleted file mode 100644
index f3f886bc..00000000
--- a/data/GrabberConfig/time.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h1[contains(@class, 'article-title')]
-author: //article//span[contains(@class, 'byline')]
-date: //time[@pubdate]/@datetime
-body: //section[contains(@class, 'article-body')]
-prune: no
-tidy: no
-
-strip: //figcaption
-strip: //p[contains(., 'MORE:') and ./a]
-strip: //aside
-
-test_url: http://time.com/14478/emotions-may-not-be-so-universal-after-all/ \ No newline at end of file
diff --git a/data/GrabberConfig/timeshighereducation.co.uk.txt b/data/GrabberConfig/timeshighereducation.co.uk.txt
deleted file mode 100644
index af1c23ce..00000000
--- a/data/GrabberConfig/timeshighereducation.co.uk.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1
-body: //div[@class="storytext"]
-strip: //div[@id="thelogin"]
-strip: //*[@class="hide"]
-strip: //div[@id="anchored"]
-test_url: http://www.timeshighereducation.co.uk/story.asp?sectioncode=26&storycode=416124&c=1 \ No newline at end of file
diff --git a/data/GrabberConfig/timeshighereducation.com.txt b/data/GrabberConfig/timeshighereducation.com.txt
deleted file mode 100644
index ba52788d..00000000
--- a/data/GrabberConfig/timeshighereducation.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@class="col-md-12 radix-layouts-contentheader panel-panel"]
-strip: //div[@class="htmlContent subscribe_box"]
-test_url: https://www.timeshighereducation.com/blog/jeremy-corbyn-serious-about-free-higher-education
diff --git a/data/GrabberConfig/tipb.com.txt b/data/GrabberConfig/tipb.com.txt
deleted file mode 100644
index b8474d97..00000000
--- a/data/GrabberConfig/tipb.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id='content']
-
-strip_id_or_class: featured-box
-strip_id_or_class: postmeta
-strip_id_or_class: respond
-
-author: //a[contains(@href, '/author/') and contains(@title, 'Posts by')]
-date: substring-before(//a[contains(@href, '/author/') and contains(@title, 'Posts by')]/.., ' by ')
-test_url: http://www.tipb.com/2011/10/17/iphone-4s-review/ \ No newline at end of file
diff --git a/data/GrabberConfig/titanic-magazin.de.txt b/data/GrabberConfig/titanic-magazin.de.txt
deleted file mode 100644
index 70108e36..00000000
--- a/data/GrabberConfig/titanic-magazin.de.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[contains(@class, 'tt_news-bodytext')]
-
-# cut html short
-find_string: <!--TYPO3SEARCH_end-->
-replace_string: </div></body></html>
-
-test_url: http://www.titanic-magazin.de/ich.war.bei.der.waffen.rss
-test_url: http://www.titanic-magazin.de/news/wenig-bekannte-fakten-ueber-2014-6986/ \ No newline at end of file
diff --git a/data/GrabberConfig/tnr.com.txt b/data/GrabberConfig/tnr.com.txt
deleted file mode 100644
index 199f5d13..00000000
--- a/data/GrabberConfig/tnr.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //div[contains(@class, 'article_detail')]/div[@class='entry_header']/h1
-title: //div[contains(@class, 'article_detail')]//h1
-title: //h1
-
-body: //div[contains(@class, 'article_detail')]
-
-author: //div[@class='article_detail']/div[@class='entry_header']/li/div[@class='author']//h3
-author: div[@class='author']//h3
-strip: //div[contains(@class, 'field-field-book-cover')]
-
-date: translate(//*[@class='post_date' and contains(., ' 20')], '|', '')
-
-prune: no
-
-single_page_link: //a[@class='print-page']
-
-test_url: http://www.tnr.com/blog/jonathan-chait/92991/did-obama-get-rolled \ No newline at end of file
diff --git a/data/GrabberConfig/tofugu.com.txt b/data/GrabberConfig/tofugu.com.txt
deleted file mode 100644
index 5ac9d6a0..00000000
--- a/data/GrabberConfig/tofugu.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body://div[@class='entry-content']
-
-test_url: http://www.tofugu.com/2015/07/20/interview-with-toriena-japanese-chiptune/
diff --git a/data/GrabberConfig/tomdispatch.com.txt b/data/GrabberConfig/tomdispatch.com.txt
deleted file mode 100644
index 701a2122..00000000
--- a/data/GrabberConfig/tomdispatch.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //div[@id='maincontent']//div[@class='title']
-body: //div[@id='maincontent']//div[@class='byline'] | //div[@id='maincontent']//div[@class='meat']
-
-tidy: no
-
-test_url: http://www.tomdispatch.com/post/175436/tomgram:_noam_chomsky%2C_the_imperial_mentality_and_9_11/ \ No newline at end of file
diff --git a/data/GrabberConfig/tomshardware.com.txt b/data/GrabberConfig/tomshardware.com.txt
deleted file mode 100644
index 5f8cbdd0..00000000
--- a/data/GrabberConfig/tomshardware.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-tidy: no
-title: //title
-author: //a[@itemprop = 'author']
-date: //time[@itemprop = 'datePublished']
-body: //div[@id = 'intelliTXT']
-
-next_page_link: //link[@rel='next']/@href
-test_url: http://www.tomshardware.com/reviews/gaming-graphics-card-review,3107.html \ No newline at end of file
diff --git a/data/GrabberConfig/tomshardware.de.txt b/data/GrabberConfig/tomshardware.de.txt
deleted file mode 100644
index eee57ccf..00000000
--- a/data/GrabberConfig/tomshardware.de.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-body://div[@id="news-content"]/div[@id="intelliTXT"][1]
-
-author://div[@id="header-news-infos"]/a[1]
-
-date: //div[@id="header-news-infos"]/span[1]
-
-title://h1[@id="header-news-title" and @class="hardwareTitle"][1]
-
-strip://div[@id="news-content"]/div[@id="intelliTXT"]/table
-
-footnotes: no
-test_url: http://www.tomshardware.de/DDR4-DDR3-ISSCC-Samsung-Hynix,news-247133.html \ No newline at end of file
diff --git a/data/GrabberConfig/toolinux.com.txt b/data/GrabberConfig/toolinux.com.txt
deleted file mode 100755
index 3f1a8405..00000000
--- a/data/GrabberConfig/toolinux.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //h2[contains(@class,'news')]
-body: //div[contains(@class,'articleContent')]
-date: substring-after(//div[@class = 'SupaDate']/text(), 'le')
-
-test_url: http://www.toolinux.com/Wi-Fi-Linksys-WRT-la-legende-de
diff --git a/data/GrabberConfig/toolsandtoys.net.txt b/data/GrabberConfig/toolsandtoys.net.txt
deleted file mode 100644
index bb45d890..00000000
--- a/data/GrabberConfig/toolsandtoys.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class='post']
-
-strip: //div[@class='social']
-strip: //span[@class='next']
-strip: //span[@class='previous']
-test_url: http://toolsandtoys.net/noble-tonic-02/ \ No newline at end of file
diff --git a/data/GrabberConfig/towerofthehand.com.txt b/data/GrabberConfig/towerofthehand.com.txt
deleted file mode 100644
index a4d87d12..00000000
--- a/data/GrabberConfig/towerofthehand.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //div[@id='headline']
-body: //div[@class='entry_text']
-author: //div[text() = 'Author:']/following-sibling::div/a
-date: //div[text() = 'Published:']/following-sibling::div
-single_page_link: //a[@href='noscript.html']
-prune: no
-
-test_url: http://towerofthehand.com/blog/2014/08/08-pitch-this-got-spinoff/index.html
-test_url: http://towerofthehand.com/blog/2014/07/31-definitions-and-embodiments/index.html
-test_url: http://towerofthehand.com/blog/2014/07/03-hero-with-thousand-faces/index.html
diff --git a/data/GrabberConfig/tracks.ranea.org.txt b/data/GrabberConfig/tracks.ranea.org.txt
deleted file mode 100644
index 5a386470..00000000
--- a/data/GrabberConfig/tracks.ranea.org.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Metadata
-title: substring-after(//title, 'Coyote Tracks - ')
-author: //meta[@name="author"]/@content
-date: //div[@class="post_header"]/a
-
-# Content Pruning
-strip: //div[@class="column left"]
-strip: //div[@class="pages"]
-strip: //a[@class="text_title"]
-strip: //ol[@class="notes"]
-
-dissolve: //div[@class='column right']/ul
-dissolve: //li[@class='post']
-test_url: http://tracks.ranea.org/post/31431060205/the-next-big-uh-slightly-taller-thing \ No newline at end of file
diff --git a/data/GrabberConfig/trailer.web-view.net.txt b/data/GrabberConfig/trailer.web-view.net.txt
deleted file mode 100644
index e7a9c82d..00000000
--- a/data/GrabberConfig/trailer.web-view.net.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: concat(substring-before(//title,':'),': ',//div[@class='Date2'])
-test_url: http://trailer.web-view.net/Show/0XC4EFE5D648B716BA2E134BC7CE61B9CC001E04F11E9434438186735DBD637488.htm \ No newline at end of file
diff --git a/data/GrabberConfig/trailers.apple.com.txt b/data/GrabberConfig/trailers.apple.com.txt
deleted file mode 100644
index 556d9522..00000000
--- a/data/GrabberConfig/trailers.apple.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# written by Jan Lukas Gernert
-
-title: //div[@id='hero']/h1
-author: //meta[@name='Author']/@content
-body: //section[@id='gallery-film-info-details']
-
-strip: //ul[@id='share']
-
-test_url: http://trailers.apple.com/trailers/independent/londonhasfallen/
diff --git a/data/GrabberConfig/trailerzone.de.txt b/data/GrabberConfig/trailerzone.de.txt
deleted file mode 100644
index 02151a63..00000000
--- a/data/GrabberConfig/trailerzone.de.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id='video' or @id='main']
-
-strip_id_or_class: socialshareprivacy2
-strip_id_or_class: wp_rp_first
-
-find_string: Genre</strong>
-replace_string: </strong></p><p><strong>Genre</strong>
-
-test_url: http://www.trailerzone.de/g-i-joe-2-die-abrechnung/ \ No newline at end of file
diff --git a/data/GrabberConfig/traningslara.se.txt b/data/GrabberConfig/traningslara.se.txt
deleted file mode 100644
index d6cfb6db..00000000
--- a/data/GrabberConfig/traningslara.se.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //div[@class="Post-body"]//span[@class="PostHeader"]
-author: //div[@class="PostHeaderIcons metadata"]/a[@title="Author"]
-date: substring-before(//div[@class="PostHeaderIcons metadata"], '|')
-body: //div[@class="Post-body"]
-strip_id_or_class: print1
-strip_id_or_class: metadata
-strip_id_or_class: authorbox
-test_url: http://traningslara.se/skoinlagg-och-skador-finns-det-nagot-samband/ \ No newline at end of file
diff --git a/data/GrabberConfig/triblive.com.txt b/data/GrabberConfig/triblive.com.txt
deleted file mode 100644
index 663cafe1..00000000
--- a/data/GrabberConfig/triblive.com.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-title: //title
-author: //span/a
-date: substring-after(//small,'Published:')
-
-strip: //h1[@class='vert_class']
-strip: //h1[@class='headline']
-strip: //img[contains(@src,'logo_triblive.gif')]
-
-#strip: //h6
-#strip_img_src: logo_triblive.gif
-
-single_page_link: //a[@class='stprint']
-test_url: http://triblive.com/sports/2819913-85/lemieux-deal-penguins-burkle-nhl-owners-team-mario-bettman-case \ No newline at end of file
diff --git a/data/GrabberConfig/truongtx.me.txt b/data/GrabberConfig/truongtx.me.txt
deleted file mode 100644
index 6b10adce..00000000
--- a/data/GrabberConfig/truongtx.me.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-prune: false
-tidy: false
-
-body: //div[@class='col-md-9']
-author: //meta[@name='author']
-date: //i[@class='fa fa-calendar']/../span
-title: //div[@class='page-header']/h1
-
-test_url: https://truongtx.me/2014/04/20/emacs-javascript-completion-and-refactoring/
diff --git a/data/GrabberConfig/truthdig.com.txt b/data/GrabberConfig/truthdig.com.txt
deleted file mode 100644
index 9e0663b0..00000000
--- a/data/GrabberConfig/truthdig.com.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //div[@class='printbody']/h1
-body: //div[@class='printbody']
-prune: no
-
-strip: //div[@class='printbody']/a[@href='http://www.truthdig.com/']
-strip: //table[@class='footer']
-strip: //h6[contains(., 'http://')]
-
-single_page_link: //a[contains(@href, '/print/')]
-
-test_url: http://www.truthdig.com/report/item/the_election_march_of_the_trolls_20110829/
-test_url: http://www.truthdig.com/dig/item/the_death_of_truth_20130505/ \ No newline at end of file
diff --git a/data/GrabberConfig/tthfanfic.org.txt b/data/GrabberConfig/tthfanfic.org.txt
deleted file mode 100644
index 63537c10..00000000
--- a/data/GrabberConfig/tthfanfic.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h2
-author: //a[starts-with(@href, '/AuthorStories')]
-body: //div[@id='storyinnerbody']
-test_url: http://www.tthfanfic.org/Story-6512/Kudra+Journeys.htm \ No newline at end of file
diff --git a/data/GrabberConfig/tuaw.com.txt b/data/GrabberConfig/tuaw.com.txt
deleted file mode 100644
index 2af00c27..00000000
--- a/data/GrabberConfig/tuaw.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class='posttitle']
-author: //span[@class='author']/a
-date: //span[@class='timestamp']
-body: //div[@class='body']
-
-test_url: http://www.tuaw.com/2011/10/19/apple-posts-fans-memories-of-steve-jobs/ \ No newline at end of file
diff --git a/data/GrabberConfig/tuhdo.github.io.txt b/data/GrabberConfig/tuhdo.github.io.txt
deleted file mode 100644
index beb551fd..00000000
--- a/data/GrabberConfig/tuhdo.github.io.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=https%3A%2F%2Ftuhdo.github.io%2Femacs-tutor.html
-
-body: //div[@id='content']
-strip_id_or_class: table-of-contents
-test_url: https://tuhdo.github.io/emacs-tutor.html
diff --git a/data/GrabberConfig/tvtropes.org.txt b/data/GrabberConfig/tvtropes.org.txt
deleted file mode 100644
index 3cc3a9cf..00000000
--- a/data/GrabberConfig/tvtropes.org.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# Google Custom Search
-strip_id_or_class: google_branding_style
-
-# Avoid double title
-strip_id_or_class: pagetitle
-
-# external links are labelled
-strip_image_src: http://static.mediatropes.info/pmwiki/pub/external_link.gif
-
-title: //div[@class="pagetitle"]
-body: //div[@id="wikitext"]
-
-# don't get clever.
-strip_comments: no
-prune: no
-
-# navigation in footer lives inside the wikitext div, annoyingly.
-strip_id_or_class: pathholder
-
-test_url: http://tvtropes.org/pmwiki/pmwiki.php/Main/WithinParameters \ No newline at end of file
diff --git a/data/GrabberConfig/tweakers.net.txt b/data/GrabberConfig/tweakers.net.txt
deleted file mode 100644
index 40d4a4aa..00000000
--- a/data/GrabberConfig/tweakers.net.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@itemprop='articleBody']
-single_page_link: //a[contains(., 'Singlepage-weergave')]
-
-strip: //q[@class='streamer']
-prune: no
-
-test_url: http://tweakers.net/feeds/mixed.xml
-test_url: https://tweakers.net/reviews/4110/tv-kijken-zonder-kabels-vodafone-tv-anywhere-en-kpn-play.html
-test_url: https://tweakers.net/reviews/4113/all/hp-spectre-13-x360-convertible-die-vrijwel-alles-goed-doet.html
diff --git a/data/GrabberConfig/twitter.com.txt b/data/GrabberConfig/twitter.com.txt
deleted file mode 100644
index 0a010a45..00000000
--- a/data/GrabberConfig/twitter.com.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-title: //title
-body: (//p[contains(@class, 'js-tweet-text')])[1]
-author: (//strong[contains(@class, 'fullname')])[1]
-date: //span[contains(@class, 'js-short-timestamp')]/@data-time
-
-# mobile site (automatic redirect - noscript meta refresh)
-author: (//div[contains(@class, 'fullname')])[1]
-body: (//div[contains(@class, 'TweetDetail-text')])[1]
-
-parser: html5php
-
-prune: no
-tidy: no
-
-test_url: https://twitter.com/medialens/status/216883678582804480
-test_contains: is all but alone in challenging the tsunami of UK
diff --git a/data/GrabberConfig/ubuntugeek.com.txt b/data/GrabberConfig/ubuntugeek.com.txt
deleted file mode 100644
index 9c159b25..00000000
--- a/data/GrabberConfig/ubuntugeek.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //header[@class='entry-header']/h1[@class='entry-title']/a
-author: //span[@class="heatmapthemead-post-details"]/span[@class='byline']/span[@class='author vcard']/a
-date: //span[@class="heatmapthemead-post-details"]/a/time/@datetime
-body: //div[@class="post-content description"]
-
-strip: //div[@id="essb_links essb_counters essb_displayed_bottom essb_share essb_template_fancy-retina essb_1179534949 essb_links_right print-no"]
-strip: //div[@class="tagcloud"]
-
-test_url: http://www.ubuntugeek.com/install-glpi-it-and-asset-managemet-software-on-ubuntu-16-04-server.html
diff --git a/data/GrabberConfig/uefa.com.txt b/data/GrabberConfig/uefa.com.txt
deleted file mode 100644
index 3469be03..00000000
--- a/data/GrabberConfig/uefa.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class='d3cmsCBody']//div[@class='pubText pubDate' or @class='newsComment' or contains(@class, 'newsPhoto') or @class='newsText']
-strip: //div[contains(@class, 'mpindex')]
-prune: no
-tidy: no
-
-test_url: http://www.uefa.com/uefaeuropaleague/news/newsid=1617320.html \ No newline at end of file
diff --git a/data/GrabberConfig/uk.xbox360.ign.com.txt b/data/GrabberConfig/uk.xbox360.ign.com.txt
deleted file mode 100644
index cd9c1361..00000000
--- a/data/GrabberConfig/uk.xbox360.ign.com.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# applies to uk.ds.ign.com, uk.wii.ign.com etc.
-# possibly to non-UK versions, but I can&rsquo;t test that
-
-title: //h1[@class="headline"]
-author: //div[@class="hdr-sub byline"]/a
-date: //h2[@class="publish-date"]/span
-body: //div[@id="main-article-content"]
-
-strip: //ul[@class="lnks-readmore"]
-
-strip: //div[@class="inlineImageCaption"]
-# can&rsquo;t make the images appear, so remove the captions
-
-strip: //div[@style="width:468px"]
-# video caption links
-
-convert_double_br_tags: yes
-
-strip_comments: no
-# otherwise the &lsquo;Closing Comments&rsquo; are removed
-
-# Ratings box could do with some rearranging, but it&rsquo;s tricky
-test_url: http://uk.xbox360.ign.com/articles/121/1210717p1.html \ No newline at end of file
diff --git a/data/GrabberConfig/uni-watch.com.txt b/data/GrabberConfig/uni-watch.com.txt
deleted file mode 100644
index 4a5ae344..00000000
--- a/data/GrabberConfig/uni-watch.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-author: substring-before(substring-after(//div[@class='post-byline'], 'By '), ', on')
-date: substring-after(//div[@class='post-byline'], ', on')
-
-# for some reason, the following is producing a "no text [48]" error
-#title: //div[@class='post-headline']
-
-# for some reason, the following doesn't appear to isolate just the body copy
-body: //div[@class='post-bodycopy']
-
-# we solve the above issue by stripping out everything else we don't want
-# these can probably all be removed if the body: command above worked
-strip_id_or_class: reply
-strip_id_or_class: left
-strip_id_or_class: post-headline
-strip_id_or_class: post-byline
-strip_id_or_class: footer
-test_url: http://www.uni-watch.com/2011/10/18/the-curious-case-of-steve-debergs-microphone-and-speaker/ \ No newline at end of file
diff --git a/data/GrabberConfig/unwinnable.com.txt b/data/GrabberConfig/unwinnable.com.txt
deleted file mode 100644
index 05ad86a5..00000000
--- a/data/GrabberConfig/unwinnable.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h1[@class='postTitle']
-author: //a[@rel='author']
-date: substring-before(//h4[@class='postAuthor'], '|')
-body: //div[@class='postContent']
-
-strip: //div[@class='simplePullQuote']
-
-wrap_in(figure): //img
-test_url: http://www.unwinnable.com/2013/04/23/gratifying-play/ \ No newline at end of file
diff --git a/data/GrabberConfig/uppsalafria.se.txt b/data/GrabberConfig/uppsalafria.se.txt
deleted file mode 100644
index 79c59ece..00000000
--- a/data/GrabberConfig/uppsalafria.se.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-body: //div[contains(@class, 'layout__inner')]//div[contains(@class, 'file-image') or contains(@class, 'node__content')]
-author: //article//div[contains(@class, 'field-byline')]
-strip_id_or_class: rekommenderade
-strip_id_or_class: disqus
-strip_id_or_class: annonser
-
-test_url: http://www.uppsalafria.se/artikel/97167 \ No newline at end of file
diff --git a/data/GrabberConfig/urbandictionary.com.txt b/data/GrabberConfig/urbandictionary.com.txt
deleted file mode 100644
index 385c95ca..00000000
--- a/data/GrabberConfig/urbandictionary.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //title
-body: //table[@id='entries']
-test_url: http://www.urbandictionary.com/define.php?term=Grown-Ass
diff --git a/data/GrabberConfig/usatoday.com.txt b/data/GrabberConfig/usatoday.com.txt
deleted file mode 100644
index 710a7b37..00000000
--- a/data/GrabberConfig/usatoday.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-date: //meta[@itemprop="datePublished"]/@content
-author: //div[@itemprop="author"]
-body: //div[@itemprop='articleBody']
-
-strip_id_or_class: share-tools
-
-test_url: http://www.usatoday.com/story/news/world/2014/03/18/malaysia-plane-search/6552429/
-test_url: http://rssfeeds.usatoday.com/usatoday-NewsTopStories \ No newline at end of file
diff --git a/data/GrabberConfig/usccb.org.txt b/data/GrabberConfig/usccb.org.txt
deleted file mode 100644
index 30c28823..00000000
--- a/data/GrabberConfig/usccb.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='CS_Element_maincontent']
-
-tidy: no
-prune: no
-
-test_url: http://www.usccb.org/bible/readings/072412.cfm \ No newline at end of file
diff --git a/data/GrabberConfig/useit.com.txt b/data/GrabberConfig/useit.com.txt
deleted file mode 100644
index b8511c7c..00000000
--- a/data/GrabberConfig/useit.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1
-
-date: substring-after(//p[@class='overline']/strong, ',')
-body: //div[@class="maintext"]
-strip: //p[@class='overline']
-strip: //h1
-tidy: no
-test_url: http://www.useit.com/alertbox/mobile-startup-screen.html \ No newline at end of file
diff --git a/data/GrabberConfig/usfirst.org.txt b/data/GrabberConfig/usfirst.org.txt
deleted file mode 100644
index f02b2d3e..00000000
--- a/data/GrabberConfig/usfirst.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //meta[@property='dc:title']/@content
-date: //div[@class='content']//span[@property='dc:date']/@content
-body: //div[@property='content:encoded']
-prune: no
-
-test_url: http://www.usfirst.org/roboticsprograms/frc/Photo-From-Kickoff-Filming \ No newline at end of file
diff --git a/data/GrabberConfig/utdailybeacon.com.txt b/data/GrabberConfig/utdailybeacon.com.txt
deleted file mode 100644
index c4593d55..00000000
--- a/data/GrabberConfig/utdailybeacon.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@id='blox-story-text']
-test_url: http://www.utdailybeacon.com/news/article_ccf6d024-0f15-11e5-ae29-9f63598deb81.html
diff --git a/data/GrabberConfig/ux.artu.tv.txt b/data/GrabberConfig/ux.artu.tv.txt
deleted file mode 100644
index c69f2df9..00000000
--- a/data/GrabberConfig/ux.artu.tv.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-author: ("Arturo Toledo")
-title: //div[@class="post"]/h2
-body: //div[@class="entry"]
-
-# Remove Twitter button
-strip: //div[@class="entry"]/p[2]/a/img
-test_url: http://ux.artu.tv/?p=192 \ No newline at end of file
diff --git a/data/GrabberConfig/vanityfair.com.txt b/data/GrabberConfig/vanityfair.com.txt
deleted file mode 100644
index e340ed30..00000000
--- a/data/GrabberConfig/vanityfair.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-body: //div[(contains(concat(' ',normalize-space(@class),' '),' article-content-body '))]
-
-// we can't load this (JS load) so may as well strip it to remove byline
-strip: //figure[contains(@class, 'main-image')]
-
-test_url: http://www.vanityfair.com/news/2016/02/george-w-bush-donald-trump-iraq
-test_contains: riding high off a fourth-place finish in New Hampshire
-
-test_url: http://www.vanityfair.com/politics/features/2008/08/hitchens200808
-test_url: http://www.vanityfair.com/style/2012/01/prisoners-of-style-201201
diff --git a/data/GrabberConfig/variety.com.txt b/data/GrabberConfig/variety.com.txt
deleted file mode 100644
index c7f4458f..00000000
--- a/data/GrabberConfig/variety.com.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-body: //div[class='article-body']
-
-strip_id_or_class: tags
-strip_id_or_class: ad-below-tags
-strip_id_or_class: comments-overview
-strip_id_or_class: widget
-strip_id_or_class: featured-jobs-template
-strip_id_or_class: article-river
-strip_id_or_class: article-comments
-
-test_url: http://variety.com/2016/film/news/jake-gyllenhaal-carey-mulligan-wildlife-1201869072/
diff --git a/data/GrabberConfig/varsity.co.uk.txt b/data/GrabberConfig/varsity.co.uk.txt
deleted file mode 100644
index dfbf69cf..00000000
--- a/data/GrabberConfig/varsity.co.uk.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# FB comments are inside an h2. Weird. Without this, the line 'Comments' is preserved by the text parser
-
-strip: //h2
-test_url: http://www.varsity.co.uk/reviews/2662 \ No newline at end of file
diff --git a/data/GrabberConfig/vea.gov.vn.txt b/data/GrabberConfig/vea.gov.vn.txt
deleted file mode 100644
index 9c8420ce..00000000
--- a/data/GrabberConfig/vea.gov.vn.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title://div[@class="detail-new-title"]
-body://div[@class="innerpad"]
-strip://div[@class="ArticleUtility"]
-strip://div[@class="commentPost"]
-strip://div[@class="comment-box"]
-strip://div[@id="TinLienQuan"]
-test_url: http://vea.gov.vn/vn/tintuc/tintuchangngay/Pages/T%C4%83ng-c%C6%B0%E1%BB%9Dng-b%E1%BA%A3o-t%E1%BB%93n-%C4%91%E1%BB%99ng-v%E1%BA%ADt-hoang-d%C3%A3-%E1%BB%9F-Vi%E1%BB%87t-Nam.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/vedomosti.ru.txt b/data/GrabberConfig/vedomosti.ru.txt
deleted file mode 100644
index 265f9fc7..00000000
--- a/data/GrabberConfig/vedomosti.ru.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //td[@class='second_content']/h1
-body: //td[@class='second_content']/div[@class='article_text']
-test_url: http://www.vedomosti.ru/newspaper/article/259377/rasprodazha_mailru \ No newline at end of file
diff --git a/data/GrabberConfig/veggbilder.no.txt b/data/GrabberConfig/veggbilder.no.txt
deleted file mode 100644
index 2a44c317..00000000
--- a/data/GrabberConfig/veggbilder.no.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-author: //div[@class="blogginnleggForfatter"]
-date: concat(//div[@class='blogginnleggDatoDag'],' ',//div[@class='blogginnleggDatoMnd'])
-strip: //div[contains(@id,"bloggDelingslenker")]
-strip: //div[contains(@id,"bloggDelingslenker")]
-test_url: http://veggbilder.no/blogginnlegg/fristelser \ No newline at end of file
diff --git a/data/GrabberConfig/venturebeat.com.txt b/data/GrabberConfig/venturebeat.com.txt
deleted file mode 100644
index d6321d79..00000000
--- a/data/GrabberConfig/venturebeat.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class="entry-title"]
-author: //div[@class="author-name"]
-date: //span[@class="the-time"]
-body: //div[@class="entry-content"]
-strip: //div[@class="vb-gallery"]
-test_url: http://venturebeat.com/2012/07/17/marissa-mayer-yahoo/#s:mayer-1 \ No newline at end of file
diff --git a/data/GrabberConfig/version2.dk.txt b/data/GrabberConfig/version2.dk.txt
deleted file mode 100644
index 418b83a1..00000000
--- a/data/GrabberConfig/version2.dk.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //article/header/h1
-
-author: //article/header/section[@class='byline']/span[contains(@class, 'author')]/a
-date: //article/header/section[@class='byline']/span[@class='published']/span
-
-body: //article/section[@class='body']
-
-convert_double_br_tags: yes
-
-# This is required, because Tidy chokes on the HTML5 tags...
-tidy: no
-test_url: http://www.version2.dk/artikel/17069-amerikansk-hit-investor-er-vild-med-danske-net-ivaerksaettere \ No newline at end of file
diff --git a/data/GrabberConfig/verybestbaking.com.txt b/data/GrabberConfig/verybestbaking.com.txt
deleted file mode 100644
index ad0fec66..00000000
--- a/data/GrabberConfig/verybestbaking.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //title
-body: //div[contains(@class, 'printRecipe')]
-strip: //div[@class='recipeHeader']
-prune: no
-tidy: no
-single_page_link: //ul[@class='printOptions']//a[contains(@href, 'detail.aspx?p=1&showphoto=true')]
-test_url: http://www.verybestbaking.com/recipes/143190/Penne-Pasta-with-Sun-dried-Tomato-Cream-Sauce/detail.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/vg.no.txt b/data/GrabberConfig/vg.no.txt
deleted file mode 100644
index bfadb4a7..00000000
--- a/data/GrabberConfig/vg.no.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[@id='artikkelspalte']
-strip_id_or_class: 'breadcrumb'
-test_url: http://www.vg.no/spill/artikkel.php?artid=10003628 \ No newline at end of file
diff --git a/data/GrabberConfig/video.forbes.com.txt b/data/GrabberConfig/video.forbes.com.txt
deleted file mode 100644
index 5db77463..00000000
--- a/data/GrabberConfig/video.forbes.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: concat("Video: ", //div[@id='currentVideoTitleDivId'])
-body: //div[@id='currentVideoDescriptionId']
-author: //meta[@name='author']/@content
-
-replace_string(<div id="currentVideoDescriptionId" style="display): <div id="currentVideoDescriptionId" style="displayitplease
-
-replace_string(<div id="currentVideoTitleDivId" style="display): <div id="currentVideoTitleDivId" style="displayitplease
-
-test_url: http://video.forbes.com/fvn/business/wells-fargo-inside-the-bank-that-works \ No newline at end of file
diff --git a/data/GrabberConfig/videogum.com.txt b/data/GrabberConfig/videogum.com.txt
deleted file mode 100644
index d93780ca..00000000
--- a/data/GrabberConfig/videogum.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2[@class='posttitle']
-date: substring-before(substring-after(//span[@class='postdate'], 'on '), ' by')
-date: //span[@class='postdate']
-author: //span[@class='postdate']/a
-body: //div[@class='entry line_top']
-test_url: http://videogum.com/395042/here-are-some-afternoon-links-92/list/ \ No newline at end of file
diff --git a/data/GrabberConfig/villagevoice.com.txt b/data/GrabberConfig/villagevoice.com.txt
deleted file mode 100644
index 36e4a2f5..00000000
--- a/data/GrabberConfig/villagevoice.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h2[@class='headline']
-
-body: //div[@class='ContentPrint']
-
-prune: no
-
-single_page_link: //a[contains(@href, '/printVersion/')]
-
-test_url: http://www.villagevoice.com/2010-03-16/news/new-york-s-ten-worst-landlords/ \ No newline at end of file
diff --git a/data/GrabberConfig/vimeo.com.txt b/data/GrabberConfig/vimeo.com.txt
deleted file mode 100644
index f36c9c57..00000000
--- a/data/GrabberConfig/vimeo.com.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-title: //title
-body: //iframe
-
-find_string: <html>&lt;iframe
-replace_string: <iframe id="video"
-
-find_string: &gt;&lt;/iframe&gt;</html>
-replace_string: ></iframe>
-
-replace_string(&quot;): "
-
-single_page_link: //link[@type='text/xml+oembed']
-
-prune: no
-tidy: no
-
-test_url: http://vimeo.com/35941909 \ No newline at end of file
diff --git a/data/GrabberConfig/viply.de.txt b/data/GrabberConfig/viply.de.txt
deleted file mode 100644
index e3599c9d..00000000
--- a/data/GrabberConfig/viply.de.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //div[@id='singletext']//h1
-body: //div[contains(@class, 'mypictureborder')] | //div[@id='singletext']
-prune: no
-
-strip_id_or_class: singletostart
-strip_id_or_class: navigation
-strip_id_or_class: social
-strip_id_or_class: single_topwrapper
-strip: //a[contains(., 'Nächster Artikel')]
-
-test_url: http://www.viply.de/?p=87973
-test_url: http://www.viply.de/?feed=rss2 \ No newline at end of file
diff --git a/data/GrabberConfig/visir.is.txt b/data/GrabberConfig/visir.is.txt
deleted file mode 100644
index 04e09102..00000000
--- a/data/GrabberConfig/visir.is.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# Author's name, when present, has 'skrifar:' ('writes:') appended to it.
-# In case of multiple authors, this would be 'skrifa:', hence only 7 characters
-# are stripped off.
-author: substring(//div[@class='paragraph']/div[@class='meta'], 0, string-length(//div[@class='paragraph']/div[@class='meta']) - 7)
-
-date: //span[@class='date']
-title: //h1
-body: //div[@class='paragraph']
-
-# Strip out author string when present
-strip: //div[@class='paragraph']/div[@class='meta']
-
-convert_double_br_tags: yes
-test_url: http://visir.is/esb,-ipa,-bhm-og-bsrb/article/2012701319997 \ No newline at end of file
diff --git a/data/GrabberConfig/vitispr.com.txt b/data/GrabberConfig/vitispr.com.txt
deleted file mode 100644
index f2d11c7c..00000000
--- a/data/GrabberConfig/vitispr.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-strip: //*[(@id = "ja-search")]
-body: //*[(@id = "ja-mainbody")]
-body: //*[(@id = "content-mass-bottom")]
-strip://h3[contains(span,'Related Posts')]
-strip://img
-test_url: http://vitispr.com/blog/coventry-is-a-technology-hotspot \ No newline at end of file
diff --git a/data/GrabberConfig/vivirmexico.com.txt b/data/GrabberConfig/vivirmexico.com.txt
deleted file mode 100644
index e6a72700..00000000
--- a/data/GrabberConfig/vivirmexico.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //*[(@class = "historia")]
-test_url: http://vivirmexico.com/2011/09/en-veracruz-arrojan-35-cuerpos-a-plena-luz-del-dia-esta-si-es-una-alarma-social \ No newline at end of file
diff --git a/data/GrabberConfig/vnexpress.net.txt b/data/GrabberConfig/vnexpress.net.txt
deleted file mode 100644
index e5ebc435..00000000
--- a/data/GrabberConfig/vnexpress.net.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@cpms_content]//h2[@class='Lead'] | //div[@cpms_content]//p[@class='Normal'] | //div[@cpms_content]//table
-strip://div[@class="box-item"]
-strip://div[@id="ARTICLE_BANNER"]
-strip://a
-strip://div[@class="tag-parent"]
-strip://div[@class="email-print txtr"]
-
-test_url: http://vnexpress.net/gl/xa-hoi/2011/04/tim-thay-nan-nhan-cuoi-cung-vu-sap-mo-da-o-len-co/ \ No newline at end of file
diff --git a/data/GrabberConfig/voices.washingtonpost.com.txt b/data/GrabberConfig/voices.washingtonpost.com.txt
deleted file mode 100644
index b754aeb8..00000000
--- a/data/GrabberConfig/voices.washingtonpost.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1
-body: //div[@class='entrytext']
-test_url: http://voices.washingtonpost.com/ezra-klein/2010/10/why_isnt_monetary_policy_discr.html \ No newline at end of file
diff --git a/data/GrabberConfig/volkskrant.nl.txt b/data/GrabberConfig/volkskrant.nl.txt
deleted file mode 100644
index f2f630f4..00000000
--- a/data/GrabberConfig/volkskrant.nl.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-#bypass cookie check
-single_page_link: //a[contains(@href, '/cookiewall/accept')]
-
-title: //h1[@itemprop="headline"]
-body: //figure[contains(@class, 'article__top-image')] | //div[@itemprop="articleBody"]
-
-strip_id_or_class: ad-space
-
-strip: //div[contains(@class, 'media-container') and contains(@class, 'pull-right')]
-
-tidy: no
-prune: no
-
-parser: html5php
-
-test_url: http://www.volkskrant.nl/sport/dossier-wereldvoetbalbond-fifa-wankelt~a4042695/
-test_contains: Het ging om de omstreden
-
-test_url: http://www.volkskrant.nl/nieuws/rss.xml
diff --git a/data/GrabberConfig/vox.com.txt b/data/GrabberConfig/vox.com.txt
deleted file mode 100644
index 2fe5df7d..00000000
--- a/data/GrabberConfig/vox.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-
-title: //h1[contains(concat(' ',normalize-space(@class),' '),' c-page-title ')]
-body: //div[contains(concat(' ',normalize-space(@class),' '),' c-entry-content ')]
-date: //time[contains(concat(' ',normalize-space(@class),' '),' c-byline__item ')]
-strip: //h3
-test-url: http://www.vox.com/policy-and-politics/2016/11/28/13728086/trump-literally-and-seriously
diff --git a/data/GrabberConfig/vr-zone.com.txt b/data/GrabberConfig/vr-zone.com.txt
deleted file mode 100644
index 3d773f41..00000000
--- a/data/GrabberConfig/vr-zone.com.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-tidy: no
-prune: no
-
-title: //title
-date: //time
-
-body: //div[@class='post-content entry-content']
-
-strip: //a[@id='dd_start']
-strip: //iframe
-strip: //div[@class='dd_outer']
-strip: //comments
-
-test_url: http://vr-zone.com/articles/amd-take-intel-8-core-fm3-socket-zen-desktop-cpus-next-year/91057.html
diff --git a/data/GrabberConfig/vworker.com.txt b/data/GrabberConfig/vworker.com.txt
deleted file mode 100644
index cfb9ea1c..00000000
--- a/data/GrabberConfig/vworker.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-body: //div[contains(@class, 'KonaBody')]
-
-test_url: http://www.vworker.com/RentACoder/misc/BidRequests/ShowBidRequest.asp?lngBidRequestId=1634186 \ No newline at end of file
diff --git a/data/GrabberConfig/waffle.wootest.net.txt b/data/GrabberConfig/waffle.wootest.net.txt
deleted file mode 100644
index e92757d7..00000000
--- a/data/GrabberConfig/waffle.wootest.net.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h2[@class="title"]
-body: //div[@class="post"]
-
-test_url: http://waffle.wootest.net/2011/06/22/on-reading-news/ \ No newline at end of file
diff --git a/data/GrabberConfig/warnerbros.fr.txt b/data/GrabberConfig/warnerbros.fr.txt
deleted file mode 100644
index 6215b727..00000000
--- a/data/GrabberConfig/warnerbros.fr.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@class="article-body"]
-test_url: https://www.warnerbros.fr/articles/magic-mike-xxl-adam-rodriguez-portrait
diff --git a/data/GrabberConfig/washingtoninstitute.org.txt b/data/GrabberConfig/washingtoninstitute.org.txt
deleted file mode 100644
index 17f45677..00000000
--- a/data/GrabberConfig/washingtoninstitute.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@class='main']//article
-
-prune: no
-
-test_url: http://www.washingtoninstitute.org/policy-analysis/view/striking-syria-lessons-from-the-israeli-experience?goback=.gde_3822158_member_273623672
-test_url: http://www.washingtoninstitute.org/rss/11/10 \ No newline at end of file
diff --git a/data/GrabberConfig/washingtonmonthly.com.txt b/data/GrabberConfig/washingtonmonthly.com.txt
deleted file mode 100644
index 8f8902a5..00000000
--- a/data/GrabberConfig/washingtonmonthly.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title://a[@class = 'headline-article']
-
-author: substring-after(//div[@class = 'article']/p[@class = 'author'], 'By ')
-date://div[@class = 'article']/span[@class = 'date']
-body://div[@class = 'article']
-single_page_link://a[@class = 'print']
-strip://p[@class = 'author']
-strip://a[@class = 'headline-article']
-strip://span[@class = 'date']
-test_url: http://www.washingtonmonthly.com/magazine/julyaugust_2011/features/the_trinity_sisters030380.php \ No newline at end of file
diff --git a/data/GrabberConfig/washingtonpost.com.txt b/data/GrabberConfig/washingtonpost.com.txt
deleted file mode 100644
index c29af00f..00000000
--- a/data/GrabberConfig/washingtonpost.com.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-# Seems to be redirecting to articles.washingtonpost.com for many users
-
-body: //div[contains(@class, "article_body")]
-# print view
-body: //div[@id='print_facet']//div[@id='body']
-
-author://meta[@name='DC.creator']/@content
-author://span[@class="pb-byline"]
-author://h3[@property='dc.creator']//a[@rel='author']
-title://meta[@name='title']/@content
-date://div[contains(@class,'byline')]//span[contains(@class,'published')]/@title
-date://meta[@name="DC.date.issued"]/@content
-date://span[contains(@class,"pb-timestamp")]
-date://meta[@name="eomportal-lastUpdate"]/@content
-
-strip://div[@class="relative primary-slot padding-top img-border gallery-container photo-wrapper"]
-strip://div[@id="wp-column six end"]
-strip://div[contains(@class,'hidden')]
-strip://div[@id='article-side-rail']
-strip://div[@class="module component todays-paper-module curved"]
-strip://div[@class="module component live-qa curved img-border"]
-strip://div[@class="module component newsletter-signup curved"]
-strip://div[@class="module featured-stories component curved img-border"]
-
-strip_id_or_class: carousel
-strip_id_or_class: toolbar
-strip_id_or_class: module
-
-# Change gJQAwdJG4U_story.html to gJQAwdJG4U_print.html
-single_page_link: concat(substring-before(//link[@rel="canonical"]/@href, "_story.html"), "_print.html")
-if_page_contains: //link[@rel="canonical" and contains(@href, '_story.html')]
-
-# [OLD] Change gJQAwdJG4U_story.html to gJQAwdJG4U_story_print.html
-#single_page_link: concat(substring-before(//link[@rel="canonical"]/@href, "_story.html"), "_story_print.html")
-
-test_url: http://www.washingtonpost.com/world/europe/in-europe-new-fears-of-german-might/2011/10/19/gIQA3baZ7L_story.html?hpid=z1
-test_url: http://www.washingtonpost.com/national/health-science/radical-theory-of-first-americans-places-stone-age-europeans-in-delmarva-20000-years-ago/2012/02/28/gIQA4mriiR_story.html
-test_url: http://www.washingtonpost.com/lifestyle/magazine/the-sorry-fate-of-a-tech-pioneer-halsey-minor-and-historic-virginia-estate-carters-grove/2012/05/30/gJQAwdJG4U_story.html \ No newline at end of file
diff --git a/data/GrabberConfig/watoday.com.au.txt b/data/GrabberConfig/watoday.com.au.txt
deleted file mode 100644
index 4302ac5e..00000000
--- a/data/GrabberConfig/watoday.com.au.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-author: //h3[@class="authorName"]
-date: //dd[@class='updated dtstamp']//time
-
-strip: //div[contains(@class, "adspot")]
-strip: //noscript
-strip: //p//small
-
diff --git a/data/GrabberConfig/web-libre.org.txt b/data/GrabberConfig/web-libre.org.txt
deleted file mode 100644
index 9ed43a25..00000000
--- a/data/GrabberConfig/web-libre.org.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-body: //div[@id='template_article']
-
-strip_id_or_class: article_more
-strip: //hr
-
-test_url: http://www.web-libre.org/dossiers/jacuzzi-gonflable,8493.html \ No newline at end of file
diff --git a/data/GrabberConfig/weblogs.asp.net.txt b/data/GrabberConfig/weblogs.asp.net.txt
deleted file mode 100644
index 7cfa49d2..00000000
--- a/data/GrabberConfig/weblogs.asp.net.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-title: //h2[@class="pageTitle"]
-strip: //div[@class="postfoot"]
-strip: //h2[@class="pageTitle"]
-strip: //h3[@class="pageTitle"]
-body: //div[@class="post"]
-author: substring-before(substring-after(//div[@class="postfoot"], 'by'), 'Filed')
-date: substring-before(substring-after(//div[@class="postfoot"], 'Published'), 'by')
-
-test_url: http://weblogs.asp.net/scottgu/archive/2011/08/31/html-editor-smart-tasks-and-event-handler-generation-asp-net-vnext-series.aspx \ No newline at end of file
diff --git a/data/GrabberConfig/webmasters.googleblog.com.txt b/data/GrabberConfig/webmasters.googleblog.com.txt
deleted file mode 100644
index ddc0462d..00000000
--- a/data/GrabberConfig/webmasters.googleblog.com.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body://div[@id='main']
-date://div[@class='publishdate']
-strip://div[@class='share']
-strip://div[@class='post-footer']
-strip://div[@class='cmt_iframe_holder']
-strip://div[@class='blog-pager']
-strip://div[@class='clear']
-replace_string(noscript>): div>
-test_url: https://webmasters.googleblog.com/2016/08/helping-users-easily-access-content-on.html
diff --git a/data/GrabberConfig/webupd8.org.txt b/data/GrabberConfig/webupd8.org.txt
deleted file mode 100644
index b5c165da..00000000
--- a/data/GrabberConfig/webupd8.org.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-tidy: no
-prune: no
-
-title: //h1[@class='post-title entry-title']/a
-date: //time
-author: //a[@rel='fn author']/span
-
-body: //div[@class='post-body']
-
-strip: //iframe
-
-test_url: http://www.webupd8.org/2015/04/organize-your-unity-launcher-based-on.html
diff --git a/data/GrabberConfig/webwereld.nl.txt b/data/GrabberConfig/webwereld.nl.txt
deleted file mode 100644
index 40a5aa36..00000000
--- a/data/GrabberConfig/webwereld.nl.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-strip: //*[@class="paginator"]
-body: //*[@id="articleText"]
-next_page_link: //a[@class="next"]
-
-# No author detection
-# No publishing date detection
-# No author and intro deduplication over multiple pages
-test_url: http://webwereld.nl/analyse/111452/de-code-van-dorifel-nader-bekeken.html \ No newline at end of file
diff --git a/data/GrabberConfig/weeklytimesnow.com.au.txt b/data/GrabberConfig/weeklytimesnow.com.au.txt
deleted file mode 100644
index a79871f3..00000000
--- a/data/GrabberConfig/weeklytimesnow.com.au.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-body: //div[@class='main-col' or @class='article-image-wide']
-title: //h1[@class='article-title']
-author: substring-before(//span[@class='author'], "|")
-date: //span[@class='date']
diff --git a/data/GrabberConfig/welt.de.txt b/data/GrabberConfig/welt.de.txt
deleted file mode 100644
index 42e65e97..00000000
--- a/data/GrabberConfig/welt.de.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# set body
-tidy: no
-body: //div[contains(@class, 'articleContent')]
-
-# remove clutter
-strip: //div[@class='advertising']
-strip: //div[@class='themenalarm']
-strip: //div[contains(@class, 'inTextTeaser')]
-
-# remove captions
-strip: //span[@class='copyRight']
-
-# remove photo galleries and extras
-strip: //div[contains(@class, 'textGallery')]
-strip: //div[contains(@class, 'videoGallery')]
-strip: //div[contains(@class, 'imageGallery')]
-strip: //div[contains(@class, 'openContent')]
-
-# remove comments
-strip: //div[@id = 'writeComment']
-
-test_url: http://www.welt.de/vermischtes/weltgeschehen/article11050589/27-Bergleute-in-neuseelaendischer-Mine-vermisst.html \ No newline at end of file
diff --git a/data/GrabberConfig/westernadvocate.com.au.txt b/data/GrabberConfig/westernadvocate.com.au.txt
deleted file mode 100644
index eb00f776..00000000
--- a/data/GrabberConfig/westernadvocate.com.au.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-title: //header[contains(@class, "news-article-title")]//h1
-date: //div[@class="news-article-byline"]//time
-author: //h2[@class="news-article-author"]//cite
-
-# Turns out that westernadvocate is doing funky things with the slide show images. :<
-# body: //ul[@class="slides"]//img | //div[contains(@class, "news-article-body")]
-body: //div[contains(@class, "news-article-body")]
-
-strip: //div[contains(@class, "flexslider")]
-
-test_url: http://www.westernadvocate.com.au/story/1532050/roos-accept-ziebell-ban-commentators-do-not/
diff --git a/data/GrabberConfig/what-if.xkcd.com.txt b/data/GrabberConfig/what-if.xkcd.com.txt
deleted file mode 100644
index a88a02c9..00000000
--- a/data/GrabberConfig/what-if.xkcd.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-autodetect_next_page: no
-test_url: http://what-if.xkcd.com/1/ \ No newline at end of file
diff --git a/data/GrabberConfig/whatever.scalzi.com.txt b/data/GrabberConfig/whatever.scalzi.com.txt
deleted file mode 100644
index 100a8c88..00000000
--- a/data/GrabberConfig/whatever.scalzi.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-strip: //div[@class="navigation"]
-strip: //div[@id="sidebar"]
-strip: //div[@id="post-extra-content"]
-strip: //div[@id="footer"]
-strip: //div[contains(@class, "sharing")]
-
-test_url: http://whatever.scalzi.com/2011/01/09/quick-giffords-follow-up/ \ No newline at end of file
diff --git a/data/GrabberConfig/wiki.guildwars.com.txt b/data/GrabberConfig/wiki.guildwars.com.txt
deleted file mode 100644
index b80fe5d1..00000000
--- a/data/GrabberConfig/wiki.guildwars.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1
-body: //div[@id='content']
-strip_id_or_class: editsection
-strip_id_or_class: toc
-strip: //div[@id='siteNotice']
-strip: //div[@id='content']//table[last()]
-prune: no
-test_url: http://wiki.guildwars.com/wiki/Monk \ No newline at end of file
diff --git a/data/GrabberConfig/wiki.guildwars2.com.txt b/data/GrabberConfig/wiki.guildwars2.com.txt
deleted file mode 100644
index e9233998..00000000
--- a/data/GrabberConfig/wiki.guildwars2.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-title: //h1
-body: //div[@id='content']
-strip_id_or_class: editsection
-strip_id_or_class: toc
-strip: //div[@id='siteNotice']
-strip: //div[@id='content']//table[last()]
-prune: no
-test_url: http://wiki.guildwars2.com/wiki/Guardian \ No newline at end of file
diff --git a/data/GrabberConfig/wikihow.com.txt b/data/GrabberConfig/wikihow.com.txt
deleted file mode 100644
index fe95d3f9..00000000
--- a/data/GrabberConfig/wikihow.com.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-# ...&printable=yes
-body: //div[@id='bodycontents']
-prune: no
-tidy: no
-strip_id_or_class: gatEditSection
-strip_id_or_class: relatedwikihows
-#strip: //div[contains(@class, 'step_num')]
-
-replace_string(<script ): <div style="display: none"
-replace_string(</script>): </div>
-
-single_page_link: //a[@id='gatPrintView']
-single_page_link: concat(//link[@rel='canonical']/@href, '?printable=yes')
-
-test_url: http://www.wikihow.com/Start-Your-Own-Country \ No newline at end of file
diff --git a/data/GrabberConfig/wikitravel.org.txt b/data/GrabberConfig/wikitravel.org.txt
deleted file mode 100644
index 1f32a372..00000000
--- a/data/GrabberConfig/wikitravel.org.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# copied from .wikipedia.org.txt
-title: //h1[@id='firstHeading' or @class='firstHeading']
-body: //div[@id = 'bodyContent']
-strip_id_or_class: editsection
-#strip_id_or_class: toc
-strip_id_or_class: vertical-navbox
-strip: //table[@id='toc'] | //div[@id='p-toc']
-strip: //div[@id='catlinks' or @id='contentSub']
-strip: //div[@id='jump-to-nav']
-strip: //div[@class='thumbcaption']//div[@class='magnify']
-strip: //table[@class='navbox']
-prune: no
-tidy: no
-test_url: http://wikitravel.org/wiki/en/index.php?title=Bangkok&printable=yes \ No newline at end of file
diff --git a/data/GrabberConfig/will-self.com.txt b/data/GrabberConfig/will-self.com.txt
deleted file mode 100644
index 394f9ca4..00000000
--- a/data/GrabberConfig/will-self.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-strip: //div[@class="widget-area"]
-title: //*[@class="entry-title"]
-date: //time[@class="entry-date"]
-test_url: http://will-self.com/2012/02/01/real-meals-dominos-pizza/ \ No newline at end of file
diff --git a/data/GrabberConfig/winfuture.de.txt b/data/GrabberConfig/winfuture.de.txt
deleted file mode 100644
index dddc6f9e..00000000
--- a/data/GrabberConfig/winfuture.de.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-title: //h1/span
-
-body: //div[@id="news_content"]
-
-author: //div[@class="bookmarks_btm"]/p[1]/a[1]/text()
-
-date: //span[@class='date']
-
-# Rubrikenbild entfernen
-strip: //div[@id="news_content"]/a[1]
-
-test_url: http://winfuture.de/news,69672.html \ No newline at end of file
diff --git a/data/GrabberConfig/winrumors.com.txt b/data/GrabberConfig/winrumors.com.txt
deleted file mode 100644
index f25f9c9e..00000000
--- a/data/GrabberConfig/winrumors.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h1[@class='page-heading']
-author: //small/strong/a
-#their date string is relative, so if you save the page 2 hours after it is posted it may say 'two hours ago, instead of providing a useful date/time'
-date: substring-before(substring-after(//small,'on'),'with')
-body: //div[@class='entry']
-test_url: http://www.winrumors.com/chinese-windows-phone-launch-still-on-track-for-early-2012/ \ No newline at end of file
diff --git a/data/GrabberConfig/wired.com.txt b/data/GrabberConfig/wired.com.txt
deleted file mode 100644
index 7a77964d..00000000
--- a/data/GrabberConfig/wired.com.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-title: //meta[@name='Title']/@content
-author: //meta[@name='Author']/@content
-date: //meta[@name='DisplayDate']/@content
-body: //div[@class='entry']
-strip: //p[contains(., 'Pages:') and contains(., 'View All')]
-strip: //p[@class='caption']
-strip: //div[@class='desc' or @class='slide' or @id='slide-info']
-
-strip_id_or_class: pullquote
-strip_id_or_class: left_rail
-strip_id_or_class: related-container
-strip_id_or_class: radvert-caption-wrap
-strip_id_or_class: related
-strip_id_or_class: article-tags
-strip_id_or_class: visually-hidden
-
-# Remove gallery?
-strip_id_or_class: wpgallery
-
-#strip: //text()[contains(., 'nextpage')]
-
-prune: no
-
-single_page_link: //a[.='View All' and contains(@href, '/all/')]
-
-test_url: http://www.wired.com/cloudline/2011/10/meet-arms-cortex-a15-the-future-of-the-ipad-and-possibly-the-macbook-air/
-test_url: http://www.wired.com/wiredenterprise/2013/09/docker/
-test_url: http://www.wired.com/threatlevel/2012/05/ff_counterfeiter/all/
-test_url: http://www.wired.com/2015/11/i-turned-off-javascript-for-a-whole-week-and-it-was-glorious/
diff --git a/data/GrabberConfig/wired.de.txt b/data/GrabberConfig/wired.de.txt
deleted file mode 100644
index 74293c06..00000000
--- a/data/GrabberConfig/wired.de.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //meta[@name='Title']/@content
-author: //meta[@name='Author']/@content
-date: //meta[@name='DisplayDate']/@content
-body: //div[@class='article-content']
-strip: //div[@class='article-sidebar']
-
-test_url: https://www.wired.de/collection/latest/der-vw-skandal-zeigt-ohne-vertrauen-ist-software-nicht-mehr-als-bose-magie
diff --git a/data/GrabberConfig/wmpoweruser.com.txt b/data/GrabberConfig/wmpoweruser.com.txt
deleted file mode 100644
index 70168fbe..00000000
--- a/data/GrabberConfig/wmpoweruser.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-date://*[@class="entry-date"]
-author://*[@class="author vcard"]
-strip://*[@style="position:relative;left:72px;top:2px;"]|//*[@id="authorbox"]
-test_url: http://wmpoweruser.com/breaking-nokia-announces-nfc-support-in-lumia-610-windows-phone-device/ \ No newline at end of file
diff --git a/data/GrabberConfig/wn.de.txt b/data/GrabberConfig/wn.de.txt
deleted file mode 100644
index ef18c8a5..00000000
--- a/data/GrabberConfig/wn.de.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-author: //div[@id='main']//div[@class='col right']//div[contains(@class, 'attribute-author')]
-body: //div[@id='main']//div[@class='col right']
-strip_id_or_class: boxes
-strip_id_or_class: lazy
-strip_id_or_class: comment_box
-strip_id_or_class: fb_comments
-
-find_string: <noscript>
-replace_string: <div>
-find_string: </noscript>
-replace_string: </div>
-
-prune: no
-tidy: no
-
-test_url: http://www.wn.de/Muenster/Kultur/1742956-Wilm-Weppelmann-verlaesst-die-Einsiedelei-Und-dann-ab-unter-die-Dusche
-# feed
-test_url: http://www.wn.de/rss/feed/wn_muenster \ No newline at end of file
diff --git a/data/GrabberConfig/wordyard.com.txt b/data/GrabberConfig/wordyard.com.txt
deleted file mode 100644
index d8c753da..00000000
--- a/data/GrabberConfig/wordyard.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.wordyard.com%2F2014%2F09%2F26%2Fremove-blindfold-before-embarking-to-utopia%2F
-
-body: //div[contains(concat(' ',normalize-space(@class),' '),' entry-content ')]
-strip_id_or_class: robots-nocontent
-strip_id_or_class: post-revisions
-test_url: http://www.wordyard.com/2014/09/26/remove-blindfold-before-embarking-to-utopia/ \ No newline at end of file
diff --git a/data/GrabberConfig/worldpoultry.net.txt b/data/GrabberConfig/worldpoultry.net.txt
deleted file mode 100644
index b88f9279..00000000
--- a/data/GrabberConfig/worldpoultry.net.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title: //div[@class="content article"]/h1
-date: substring-after(//*[@class='date'], '//')
-body: //*[@class='article-content']
-strip: //*[@id='nomodal']
-test_url: http://www.worldpoultry.net/news/kyrgyzstan-restricts-poultry-imports-from-russia-and-kazakhstan-9332.html \ No newline at end of file
diff --git a/data/GrabberConfig/worldwidewords.org.txt b/data/GrabberConfig/worldwidewords.org.txt
deleted file mode 100644
index 4682e0d3..00000000
--- a/data/GrabberConfig/worldwidewords.org.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //p[@id='content']
-
-body: //div[@class='contentblock']
-test_url: http://www.worldwidewords.org/weirdwords/ww-gro1.htm \ No newline at end of file
diff --git a/data/GrabberConfig/wow.joystiq.com.txt b/data/GrabberConfig/wow.joystiq.com.txt
deleted file mode 100644
index 44add9c9..00000000
--- a/data/GrabberConfig/wow.joystiq.com.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-title: //h2[@class="posttitle"]
-body: //div[@class="post"]
-strip: //h2[@class="posttitle"]
-strip: //p[@class="filed-under"]
-convert_double_br_tags: yes
-test_url: http://wow.joystiq.com/2011/06/20/the-overachiever-guide-to-midsummer-festival-2011-achievements/ \ No newline at end of file
diff --git a/data/GrabberConfig/wpmayor.com.txt b/data/GrabberConfig/wpmayor.com.txt
deleted file mode 100644
index bb4fffc7..00000000
--- a/data/GrabberConfig/wpmayor.com.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-body: //div[@id='nrelate_flyout_placeholder']
-
-strip_id_or_class: share
-
-prune: no
-
-test_url: http://www.wpmayor.com/themes/wordpress-portfolio-resume-themes/
-test_url: http://www.wpmayor.com/feed/ \ No newline at end of file
diff --git a/data/GrabberConfig/wsj.com.txt b/data/GrabberConfig/wsj.com.txt
deleted file mode 100644
index 4b63433e..00000000
--- a/data/GrabberConfig/wsj.com.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-title: //meta[@property="og:title"]/@content
-body: //div[@id='wsj-article-wrap']
-# is this still used?
-body: //div[@id='article_story_body']
-
-author: //h3[@class='byline']/a
-# for slide show content
-body: //ul[@id='imageSlide']//li[@class='firstSlide']//img | (//div[@class='txt_body']//p)[1]
-date: //li[@class='dateStamp']/small
-
-strip_id_or_class: insetFullBracket
-strip_id_or_class: insettipBox
-#strip_id_or_class: legacyInset
-strip_id_or_class: recipeACShopAndBuyText
-
-strip: //div[contains(@class, 'insetContent')]//cite
-strip: //*[contains(@style, 'visibility: hidden;')]
-strip: //div[contains(@class, 'insetContent') and not(contains(@class, 'image'))]
-strip: //div[contains(@class, 'carousel')]
-
-http_header(user-agent): Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
-
-prune: no
-tidy: no
-
-test_url: http://www.wsj.com/articles/airasia-flight-8501-tail-recovered-1420878809
-test_contains: Saturday evening that the black boxes
-test_url: http://www.wsj.com/news/articles/SB10001424052702304626304579509100018004342
-test_url: http://www.wsj.com/article/SB10001424052970203363504577185322849515102.html
-# slide show
-test_url: http://www.wsj.com/article/SB10001424052970204791104577110550376458164.html
diff --git a/data/GrabberConfig/wtatennis.com.txt b/data/GrabberConfig/wtatennis.com.txt
deleted file mode 100644
index 1000ab26..00000000
--- a/data/GrabberConfig/wtatennis.com.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-title: //h1[contains(@class, 'header-2')]
-body: //article//*[contains(@class, 'teaserText') or contains(@class, 'lastUpdated') or contains(@class, 'image') or contains(@class, 'body')]
-strip_id_or_class: articleIndex
-prune: no
-
-test_url: http://www.wtatennis.com/news/article/3190914
-test_url: http://www.wtatennis.com/news/article/3190244 \ No newline at end of file
diff --git a/data/GrabberConfig/www1.folha.uol.com.br.txt b/data/GrabberConfig/www1.folha.uol.com.br.txt
deleted file mode 100644
index 97a5c19d..00000000
--- a/data/GrabberConfig/www1.folha.uol.com.br.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-body://div[@id='articleNew']
-strip://div[@id='articleBy']
-strip://div[@id='articleDate']
-strip://td[@class='articleGraphicCredit']
-strip://h1
-strip://div[@id='articleEnd']
-strip://p[@class='tagline']
-strip://div[@class='openBox adslibraryArticle']
-strip_id_or_class:ad-180x150-1
-
-
-title: //div[@id="articleNew"]/h1
-author: //div[@id="articleBy"]/p/b
-date: substring-before(//div[@id="articleDate"], "-")
-test_url: http://www1.folha.uol.com.br/mundo/1115805-ex-ditador-argentino-videla-e-condenado-a-50-anos-de-prisao.shtml \ No newline at end of file
diff --git a/data/GrabberConfig/www3.imperial.ac.uk.txt b/data/GrabberConfig/www3.imperial.ac.uk.txt
deleted file mode 100644
index 71306af2..00000000
--- a/data/GrabberConfig/www3.imperial.ac.uk.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-strip_id_or_class: hidelabel
-test_url: http://www3.imperial.ac.uk/newsandeventspggrp/imperialcollege/newssummary/news_14-7-2010-15-53-18 \ No newline at end of file
diff --git a/data/GrabberConfig/wyborcza.pl.txt b/data/GrabberConfig/wyborcza.pl.txt
deleted file mode 100644
index 638583dc..00000000
--- a/data/GrabberConfig/wyborcza.pl.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //div[@id='article']
-strip: //div[@class='head']
-
-strip_id_or_class: txt_upl
-
-single_page_link: //div[@id='gazeta_article_tools']//a[contains(@class, 'print')]
-
-test_url: http://wyborcza.pl/1,123455,11536088,Gdy_peknie_fejs__obryzga_wszystko.html?as=1&startsz=x
-test_url: http://wyborcza.pl/1,75478,14880255,Biskup_Dydycz_o_pedofilii_i_tajemnicy_spowiedzi__Zamiast.html \ No newline at end of file
diff --git a/data/GrabberConfig/wz-newsline.de.txt b/data/GrabberConfig/wz-newsline.de.txt
deleted file mode 100644
index 5b2be744..00000000
--- a/data/GrabberConfig/wz-newsline.de.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title://h1
-
-date://p[@class='articleDate']
-body://div[@class='articleBody wzStandardArticle']
-test_url: http://www.wz-newsline.de/home/sport/tennis/federer-zum-vierten-mal-sieger-in-indian-wells-1.938050 \ No newline at end of file
diff --git a/data/GrabberConfig/xoeb.us.txt b/data/GrabberConfig/xoeb.us.txt
deleted file mode 100644
index c09fa4df..00000000
--- a/data/GrabberConfig/xoeb.us.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-title: //h1[@class="entry-title"]
-author: //span[@class="fn"]
-date: //p[@class="meta"]
-test_url: http://xoeb.us/blog/2012/03/16/my-mistakes-with-our-first-release/ \ No newline at end of file
diff --git a/data/GrabberConfig/yated.com.txt b/data/GrabberConfig/yated.com.txt
deleted file mode 100644
index 13a3ea64..00000000
--- a/data/GrabberConfig/yated.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-title: //div[@class='pagetitle']
-test_url: http://www.yated.com/content.asp?categoryid=7&contentid=582 \ No newline at end of file
diff --git a/data/GrabberConfig/ynet.co.il.txt b/data/GrabberConfig/ynet.co.il.txt
deleted file mode 100644
index aa86566a..00000000
--- a/data/GrabberConfig/ynet.co.il.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-body: //span[@id='article_content' or @class='text16g']
-
-# ads
-strip: //div[.//div[contains(@id, 'ads.')]]
-# related content heading
-strip: //p[contains(., 'עוד בערוץ החדשות של ynet:')]
-strip: //p[contains(., 'כותרות אחרונות מהעולם בחדשות ynet:')]
-strip: //div[contains(., 'אינציקלופדיית ynet:')]
-# related content links
-strip: //a[@class='bluelink']
-# strip image bullets
-strip_image_src: ynet_manual_bullet.png
-
-prune: no
-tidy: no
-
-# prevent JS issues
-find_string: <script type='text/javascript'>
-replace_string: <div style="display:none;">
-find_string: </script>
-replace_string: </div>
-
-test_url: http://www.ynet.co.il/articles/0,7340,L-4354266,00.html
-test_url: http://www.ynet.co.il/articles/0,7340,L-4354268,00.html
-#feed
-test_url: http://www.ynet.co.il/Integration/StoryRss2.xml \ No newline at end of file
diff --git a/data/GrabberConfig/yosko.net.txt b/data/GrabberConfig/yosko.net.txt
deleted file mode 100644
index 99e711e3..00000000
--- a/data/GrabberConfig/yosko.net.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generated by FiveFilters.org's web-based selection tool
-# Place this file inside your site_config/custom/ folder
-# Source: http://siteconfig.fivefilters.org/grab.php?url=http%3A%2F%2Fwww.yosko.net%2Farticle33%2Fsnippet-06-javascript-capturer-des-raccourcis-clavier-utilises-par-votre-navigateur
-
-body: //article//section
-test_url: http://www.yosko.net/article33/snippet-06-javascript-capturer-des-raccourcis-clavier-utilises-par-votre-navigateur
diff --git a/data/GrabberConfig/yostivanich.com.txt b/data/GrabberConfig/yostivanich.com.txt
deleted file mode 100644
index 2aeb7e05..00000000
--- a/data/GrabberConfig/yostivanich.com.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-title://div[@class='entry-title']
-body://div[@class='entry-content']
-strip_comments:yes
-convert_double_br_tags:yes
-test_url: http://www.yostivanich.com/2010/07/11/wired-com-with-world-watching-wikileaks-falls-into-disrepair/ \ No newline at end of file
diff --git a/data/GrabberConfig/yourerie.com.txt b/data/GrabberConfig/yourerie.com.txt
deleted file mode 100644
index 46ee5ba1..00000000
--- a/data/GrabberConfig/yourerie.com.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-body: //div[@itemprop="articleBody"]
-test_url: http://www.yourerie.com/news/news-article/d/story/cd-release-party-at-pi-downs/22898/G_gFL3mSQkWH_DW2wLuMOA
diff --git a/data/GrabberConfig/zdnet.com.txt b/data/GrabberConfig/zdnet.com.txt
deleted file mode 100644
index 939fb0e3..00000000
--- a/data/GrabberConfig/zdnet.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-title: //h1[@class="h s-1"]
-author: substring-before(substring-after(//p[@class="meta s-10"], 'By'), '|')
-author: substring-after(//div[@class="bio"]//h3, 'About ')
-date: substring-after(//p[@class="meta s-10"], '|')
-date: substring-after(//p[@class="meta"], '|')
-body: //div[@class="content-1 entry space-1 clear"]
-body: //div[@class="storyBody"]
-
-test_url: http://www.zdnet.com/blog/microsoft/the-bing-back-end-more-on-cosmos-tiger-and-scope/10920
-test_url: http://www.zdnet.com/researchers-find-web-tracking-up-privacy-down-7000000358/ \ No newline at end of file
diff --git a/data/GrabberConfig/ze.tt.txt b/data/GrabberConfig/ze.tt.txt
deleted file mode 100644
index 41b7064d..00000000
--- a/data/GrabberConfig/ze.tt.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-tidy: yes
-prune: yes
-autodetect_on_failure: no
-
-#Remove ads
-strip: //div[contains(@class, 'ph-ad')]
-strip: //p//a[@target='_blank']//em
-
-title: //h1[contains(@class, 'ph-article-title')]
-date: //time[contains(@class, 'ph-article-date')]
-author: //div[contains(@class, 'ph-article-authors-wrapper')]
-body: //div[contains(@class, 'ph-article-text-lead')] | //div[contains(@class, 'ph-article-text-body')] | //div[contains(@class, 'ph-article-image-wrapper')]
-
-test-url: http://ze.tt/fotograf-portraetiert-menschen-nach-12-und-3-glaesern-wein/
-test-url: http://ze.tt/fotoprojekt-menschen-in-mosambik-zeigen-selbst-wie-sie-der-duerre-trotzen/
-test-url: http://ze.tt/was-deine-tattoos-ueber-dich-aussagen/
diff --git a/data/GrabberConfig/zeit.de.txt b/data/GrabberConfig/zeit.de.txt
deleted file mode 100644
index 4c0116b7..00000000
--- a/data/GrabberConfig/zeit.de.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-tidy: no
-prune: no
-
-# Figures are wrapped in a noscript tag which is itself wrapped in a
-# conditional comment. Feed readers will fail to parse this correctly
-# so get rid of the noscript tag altogether.
-replace_string(<noscript): <foo
-
-title: //meta[@property='og:title']/@content
-date: //meta[@name='date']/@content
-
-strip: //span[@class='figure__copyright']
-
-# Self advertisements
-strip: //figure[@class='figure-stamp']
-strip: //a[contains(@title, 'Dieser Text ')]
-strip: //a[contains(@title, 'Dieser Artikel ')]
-strip: //span[@class='figure__text']/text()[contains(., 'Dieser Text ')]
-strip: //span[@class='figure__text']/text()[contains(., 'Dieser Artikel ')]
-
-#######################################
-# ZEIT:
-#######################################
-
-single_page_link: //a[@class='article-toc__onesie']
-
-author: //a[@class='byline__author']/span
-author: substring-after(//span[@class='metadata__source'], 'Quelle: ')
-
-body: //main/article/div[@itemprop='articleBody']
-
-strip: //a[@href='#']
-strip: //form[@id='newsletter-teaser-form']
-strip_id_or_class: 'article-pagination article__item'
-
-test_url: http://www.zeit.de/kultur/film/2012-12/Kurzfilmtag
-test_url: http://www.zeit.de/sport/2016-01/darts-wm-finale-anderson-lewis/komplettansicht
-test_url: http://www.zeit.de/kultur/2015-12/selbstverwirklichung-optimierung-essay
-test_url: http://www.zeit.de/2015/51/selbstdiagnose-gesundheit-zuhause-blut-urin-selbsttest
-test_url: http://www.zeit.de/campus/2015/s2/nebenjob-master-studium-finanzierung
-test_url: http://www.zeit.de/hamburg/politik-wirtschaft/2015-12/hamburg-wohnungsbau-fluechtlinge
-
-#######################################
-# ZEIT MAGAZIN:
-#######################################
-
-next_page_link: //meta[@rel='next']/@href
-
-author: //a[@class='article__head__meta__author']/span
-
-body: //main/article/div[@class='article__wrap']
-
-strip: //div[@class='article__head-wrap']//h1
-strip_id_or_class: article__socialbox
-strip_id_or_class: article__nextread nextread-base is-centered
-strip_id_or_class: js-comments
-strip_id_or_class: article__pagination is-constrained is-centered
-strip_id_or_class: article__head__meta
-
-test_url: http://www.zeit.de/zeit-magazin/2015/51/daisy-ridley-traum
-test_url: http://www.zeit.de/zeit-magazin/2015/52/cyberstalking-internet-stalker-familie-mierau
-test_url: http://www.zeit.de/zeit-magazin/leben/2015-12/rueckblick-2015-magnum-fs
diff --git a/data/GrabberConfig/zerodistraction.com.txt b/data/GrabberConfig/zerodistraction.com.txt
deleted file mode 100644
index 80ac6c17..00000000
--- a/data/GrabberConfig/zerodistraction.com.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-author: //span[@class='author']//a
-date: //span[@class='date']
-test_url: http://zerodistraction.com/blog/2012/3/11/retina-ipad-that-means-i-am-going-digital-only-for-comic-boo.html
-test_url: http://zerodistraction.com/notes/unreasonably-grumpy \ No newline at end of file
diff --git a/data/GrabberConfig/zerohedge.com.txt b/data/GrabberConfig/zerohedge.com.txt
deleted file mode 100644
index 7e76aee5..00000000
--- a/data/GrabberConfig/zerohedge.com.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-author: //span[@class='submitted']/a
-strip: //div[@class='clear-block clr']
-strip: //div[@class='picture']
-strip: //span[@class='submitted']
-strip: //div[@class='breadcrumb']
-strip: //div[@class='fivestar-static-form-item']
-strip: //div[@class='js-links']
-strip: //div[@class='links clear-block clear']
-strip: //div[@class='block block-block']
-test_url: http://www.zerohedge.com/news/bernankes-columbus-voyage-end-monetary-policy-world \ No newline at end of file
diff --git a/data/GrabberConfig/zerokspot.com.txt b/data/GrabberConfig/zerokspot.com.txt
deleted file mode 100644
index afa964db..00000000
--- a/data/GrabberConfig/zerokspot.com.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-title: //h1
-body: //div[@id="primarycontent"]
-test_url: http://zerokspot.com/weblog/2011/06/26/europython2011/ \ No newline at end of file
diff --git a/data/GrabberConfig/zhihu.com.txt b/data/GrabberConfig/zhihu.com.txt
deleted file mode 100644
index 3c9d8c1a..00000000
--- a/data/GrabberConfig/zhihu.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# This filter is tested on:
-# http://www.zhihu.com/question/19587406
-# http://www.zhihu.com/question/20649035
-# http://www.zhihu.com/question/20637942
-
-author: //h3[@class='zm-item-answer-author-wrap']
-title://h2[@class='zm-item-title']
-date://a[@class='answer-date-link meta-item']
-convert_double_br_tags: yes
-
-wrap_in(blockquote)://div[@class='zm-editable-content']
-wrap_in(blockquote)://sup/text()
-dissolve://sup
-
-strip://div[@class='zh-answers-title']
-strip:///div[@class='zm-item-vote-info ']
-strip://div[@class='zm-item-answer-author-info']
-strip://div[@class='zu-blue-info-board zg-r3px']
-test_url: http://www.zhihu.com/question/20637942 \ No newline at end of file
diff --git a/data/GrabberConfig/zive.cz.txt b/data/GrabberConfig/zive.cz.txt
deleted file mode 100644
index a65c34e8..00000000
--- a/data/GrabberConfig/zive.cz.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-body: //*[@class='ar-annotation'] | //div[contains(@class='ar-content')]
-strip_id_or_class: ar-link-to-another
-strip_id_or_class: ar-tags
-find_string: Mohlo by vás zajímat:
-replace_string: <!-- removed -->
-next_page_link: //a[@data-tracker='Navigace,NextChapter']
-
-test_url: http://www.zive.cz/clanky/tyden-zive-pocitac-ktery-pripomina-hamburger/sc-3-a-180652/default.aspx
-test_url: www.zive.cz/clanky/6-specialnich-pc-na-doma-k-praci-i-na-hrani-vanoce-2015/sc-3-a-180617/default.aspx
diff --git a/data/application-icons/meson.build b/data/application-icons/meson.build
new file mode 100644
index 00000000..cfb1cd89
--- /dev/null
+++ b/data/application-icons/meson.build
@@ -0,0 +1,4 @@
+icon_themes = ['hicolor']
+foreach theme : icon_themes
+ install_subdir(theme, install_dir: join_paths(SHARE_DIR, 'icons'))
+endforeach
diff --git a/data/gtk-css/basics.css b/data/gtk-css/basics.css
index d39dd5fe..34a7aae4 100644
--- a/data/gtk-css/basics.css
+++ b/data/gtk-css/basics.css
@@ -1,23 +1,23 @@
#fake-example *:selected *:visited {
- opacity: 1;
+ opacity: 1;
}
.feedlist-spinner {
- color: mix(@theme_bg_color, @theme_fg_color, 0.5);
+ color: mix(@theme_bg_color, @theme_fg_color, 0.5);
}
FeedReaderUpdateButton:disabled * {
- opacity: 1;
+ opacity: 1;
}
GtkEventBox {
- background: none;
+ background: none;
}
.addServiceButton,
row {
- outline: none;
- padding: 0px;
- border: none;
- border-radius: 0px;
- background-image: none;
- padding: 0;
+ outline: none;
+ padding: 0px;
+ border: none;
+ border-radius: 0px;
+ background-image: none;
+ padding: 0;
}
.article-list row {
border-bottom-width: 1px;
@@ -25,75 +25,75 @@ row {
border-bottom-color: rgba(128, 128, 128, 0.3);
}
.destructive-action spinner {
- color: white;
+ color: white;
}
.FeedListFooter button {
- box-shadow: none;
+ box-shadow: none;
}
.transparentBG {
- background: rgba(0, 0, 0, 0);
+ background: rgba(0, 0, 0, 0);
}
.servicebox {
- border: 1px solid alpha (#000, 0.30);
+ border: 1px solid alpha (#000, 0.30);
}
.fr-sidebar-row {
- text-shadow: none;
- -gtk-icon-shadow: none;
- background: none;
+ text-shadow: none;
+ -gtk-icon-shadow: none;
+ background: none;
}
.imageOverlay {
- border-radius: 0;
+ border-radius: 0;
}
/***************/
/* text styles */
/***************/
.bold {
- font-weight: bold
+ font-weight: bold
}
.h1 {
- font-weight: bold;
- font-size: xx-large;
+ font-weight: bold;
+ font-size: xx-large;
}
.h2 {
- font-size: x-large;
+ font-size: x-large;
}
.h3 {
- font-size: large;
+ font-size: large;
}
.h4 {
- font-weight: bold
+ font-weight: bold
}
.preview {
- font-size: small;
+ font-size: small;
}
.headline-read,
.headline-unread {
- font-style: normal;
- font-size: large;
+ font-style: normal;
+ font-size: large;
}
.headline-read {
- font-weight: normal;
+ font-weight: normal;
}
.headline-unread {
- font-weight: bold;
+ font-weight: bold;
}
/*******************/
/* split headerbar */
/*******************/
.headerbar_pane.pane-separator {
- border-radius: 0;
- border-width: 0 1px 1px 0;
+ border-radius: 0;
+ border-width: 0 1px 1px 0;
}
.titlebar .pane-separator {
- background-color: shade(@theme_bg_color, 0.4);
- background-image: none;
+ background-color: shade(@theme_bg_color, 0.4);
+ background-image: none;
}
.header_right {
- border-top-right-radius: 0;
+ border-top-right-radius: 0;
}
.header_left {
- border-top-left-radius: 0;
+ border-top-left-radius: 0;
}
diff --git a/data/gtk-css/dark.css b/data/gtk-css/dark.css
index 14513709..9b7c5011 100644
--- a/data/gtk-css/dark.css
+++ b/data/gtk-css/dark.css
@@ -6,56 +6,56 @@
.fr-sidebar,
.fr-sidebar .scrollbar {
- background-color: @feedlist-bg;
+ background-color: @feedlist-bg;
}
.fr-sidebar .slider {
- background: @feedlist-slider;
+ background: @feedlist-slider;
}
.fr-sidebar-row:selected,
.fr-sidebar-feed:selected {
- background: @feedlist-selected;
+ background: @feedlist-selected;
}
.fr-sidebar label {
- color: @feedlist-label;
- font-weight: bold;
- text-shadow: none;
+ color: @feedlist-label;
+ font-weight: bold;
+ text-shadow: none;
}
.fr-sidebar-row:hover {
- background: shade(@feedlist-bg, 1.1);
+ background: shade(@feedlist-bg, 1.1);
}
.fr-sidebar-row:selected:hover,
.fr-sidebar-feed:selected:hover {
- background: shade(@feedlist-selected, 1.1);
+ background: shade(@feedlist-selected, 1.1);
}
.fr-sidebar-feed {
- background: @feedrow-bg;
+ background: @feedrow-bg;
}
.fr-sidebar-feed:hover {
- background: shade(@feedrow-bg, 1.1);
+ background: shade(@feedrow-bg, 1.1);
}
.fr-sidebar-separator {
- color: shade(@feedlist-bg, 0.82);
- border: none;
+ color: shade(@feedlist-bg, 0.82);
+ border: none;
}
.fr-sidebar-symbolic {
- color: @feedlist-label;
+ color: @feedlist-label;
}
/******************/
/* sidebar footer */
/******************/
.footer {
- background: shade(@feedlist-bg, 0.9);
+ background: shade(@feedlist-bg, 0.9);
}
.footer button:hover,
.footer-popover {
- background: shade(@feedlist-bg, 1.1);
+ background: shade(@feedlist-bg, 1.1);
}
.footer button {
- border: 0;
- border-radius:0;
- -gtk-icon-shadow: none;
- box-shadow: none;
+ border: 0;
+ border-radius:0;
+ -gtk-icon-shadow: none;
+ box-shadow: none;
}
.footer button:disabled {
color:shade(@feedlist-label, 0.9);
diff --git a/data/gtk-css/elementary.css b/data/gtk-css/elementary.css
index aef0cb17..212a3f84 100644
--- a/data/gtk-css/elementary.css
+++ b/data/gtk-css/elementary.css
@@ -1,81 +1,81 @@
.fr-sidebar-separator {
- color: alpha(#333, 0.2);
+ color: alpha(#333, 0.2);
}
.fr-sidebar {
- background-color: shade (#DEDEDE, 0.92);
- color: mix (#DEDEDE, #333, 0.60);
+ background-color: shade (#DEDEDE, 0.92);
+ color: mix (#DEDEDE, #333, 0.60);
}
.fr-sidebar-row,
.fr-sidebar-feed {
- padding: 0 6px;
+ padding: 0 6px;
}
.fr-sidebar-row label,
.fr-sidebar-feed label {
- padding: 4px;
+ padding: 4px;
}
.fr-sidebar-row,
.fr-sidebar-feed {
- border-color: transparent;
- border-style: solid;
- border-width: 1px 0 1px 0;
- text-shadow: 0 1px alpha(#fff, 0.4);
+ border-color: transparent;
+ border-style: solid;
+ border-width: 1px 0 1px 0;
+ text-shadow: 0 1px alpha(#fff, 0.4);
}
.fr-sidebar-row:hover,
.fr-sidebar-feed:hover {
- background-color: shade (#DEDEDE, 1.00);
+ background-color: shade (#DEDEDE, 1.00);
}
.fr-sidebar-row:selected,
.fr-sidebar-feed:selected {
- color: mix (#DEDEDE, #333, 0.60);
- background-color: transparent;
- background-image: linear-gradient(to bottom,
- alpha (#000, 0.11),
- alpha (#000, 0.07)
- );
- border-image: linear-gradient(to bottom,
- alpha (#000, 0.25),
- alpha (#fff, 0.30)
- ) 1 1 1 1;
- box-shadow: inset 0 1px 0 0 alpha (#000, 0.03),
- inset 0 -1px 0 0 alpha (#000, 0.10);
+ color: mix (#DEDEDE, #333, 0.60);
+ background-color: transparent;
+ background-image: linear-gradient(to bottom,
+ alpha (#000, 0.11),
+ alpha (#000, 0.07)
+ );
+ border-image: linear-gradient(to bottom,
+ alpha (#000, 0.25),
+ alpha (#fff, 0.30)
+ ) 1 1 1 1;
+ box-shadow: inset 0 1px 0 0 alpha (#000, 0.03),
+ inset 0 -1px 0 0 alpha (#000, 0.10);
}
.fr-sidebar-row:backdrop,
.fr-sidebar-feed:backdrop {
- color: mix (#DEDEDE, #333, 0.40);
- -gtk-icon-effect: dim;
+ color: mix (#DEDEDE, #333, 0.40);
+ -gtk-icon-effect: dim;
}
.fr-sidebar-row:selected:backdrop,
.fr-sidebar-feed:selected:backdrop {
- color: mix (#DEDEDE, #333, 0.40);
- background-image: linear-gradient(to bottom,
- alpha (#000, 0.04),
- alpha (#000, 0.03)
- );
- border-image: linear-gradient(to bottom,
- alpha (#000, 0.15),
- alpha (#fff, 0.25)
- ) 1 1 1 1;
+ color: mix (#DEDEDE, #333, 0.40);
+ background-image: linear-gradient(to bottom,
+ alpha (#000, 0.04),
+ alpha (#000, 0.03)
+ );
+ border-image: linear-gradient(to bottom,
+ alpha (#000, 0.15),
+ alpha (#fff, 0.25)
+ ) 1 1 1 1;
}
.fr-sidebar.frame {
- border-width: 1px 0 1px 0;
+ border-width: 1px 0 1px 0;
}
.fr-sidebar .frame {
- border: none;
+ border: none;
}
.fr-sidebar-symbolic {
- color: alpha(#333, 0.8);
+ color: alpha(#333, 0.8);
}
/******************/
/* sidebar footer */
/******************/
.footer {
- background: shade (#DEDEDE, 0.85);
+ background: shade (#DEDEDE, 0.85);
}
.footer button:hover,
.footer-popover {
- background: shade (#DEDEDE, 0.96);
+ background: shade (#DEDEDE, 0.96);
}
.footer button {
- box-shadow: none;
+ box-shadow: none;
}
diff --git a/data/gtk-css/gtk.css b/data/gtk-css/gtk.css
index 67ee6c7f..a3fd283e 100644
--- a/data/gtk-css/gtk.css
+++ b/data/gtk-css/gtk.css
@@ -2,32 +2,32 @@
.fr-sidebar .scrollbar,
.fr-sidebar .slider,
.fr-sidebar .activatable {
- background: @theme_bg_color;
+ background: @theme_bg_color;
}
.fr-sidebar-feed {
- background: @theme_bg_color;
- color: @theme_fg_color;
+ background: @theme_bg_color;
+ color: @theme_fg_color;
}
.fr-sidebar-row {
- color: @theme_fg_color;
+ color: @theme_fg_color;
}
.fr-sidebar-row:selected,
.fr-sidebar-row:selected *,
.fr-sidebar-feed:selected,
.fr-sidebar-feed:selected * {
- background: @theme_selected_bg_color;
- color: @theme_selected_fg_color;
+ background: @theme_selected_bg_color;
+ color: @theme_selected_fg_color;
}
.fr-sidebar-row:hover,
.fr-sidebar-feed:hover {
- background: shade(@theme_bg_color, 0.9);
+ background: shade(@theme_bg_color, 0.9);
}
.fr-sidebar-row:selected:hover,
.fr-sidebar-feed:selected:hover,
.fr-sidebar-feed:selected:hover * {
- background: shade(@theme_selected_bg_color, 0.9);
- color: @theme_selected_fg_color;
+ background: shade(@theme_selected_bg_color, 0.9);
+ color: @theme_selected_fg_color;
}
/******************/
/* sidebar footer */
@@ -35,25 +35,25 @@
.footer label,
.footer button label {
- color: @theme_fg_color;
+ color: @theme_fg_color;
}
.footer button {
- background: @theme_bg_color;
- color: @theme_fg_color;
- border-width: 0;
- border-radius: 0;
+ background: @theme_bg_color;
+ color: @theme_fg_color;
+ border-width: 0;
+ border-radius: 0;
}
.footer button:disabled {
- color: mix(@theme_bg_color, @theme_fg_color, 0.5);
+ color: mix(@theme_bg_color, @theme_fg_color, 0.5);
}
.footer button:active {
- border-width: 0;
- border-radius: 0;
+ border-width: 0;
+ border-radius: 0;
}
.footer button:hover,
.footer-popover {
- background: shade(@theme_bg_color, 0.9);
- border-width: 0;
- border-radius: 0;
- color: @theme_fg_color;
+ background: shade(@theme_bg_color, 0.9);
+ border-width: 0;
+ border-radius: 0;
+ color: @theme_fg_color;
}
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 00000000..d26334f8
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,56 @@
+UI_RESOURCES = gnome.compile_resources(
+ 'feedreader_res',
+ 'org.gnome.FeedReader.gresource.xml',
+)
+
+i18n.merge_file(
+ input: 'org.gnome.FeedReader.desktop.in',
+ output: 'org.gnome.FeedReader.desktop',
+ po_dir: PO_DIR,
+ type: 'desktop',
+ install: true,
+ install_dir: join_paths(SHARE_DIR, 'applications')
+)
+
+i18n.merge_file(
+ input: 'org.gnome.FeedReader-autostart.desktop.in',
+ output: 'org.gnome.FeedReader-autostart.desktop',
+ po_dir: PO_DIR,
+ type: 'desktop',
+ install: true,
+ install_dir: DATA_DIR
+)
+
+i18n.merge_file(
+ input: 'org.gnome.FeedReader.appdata.xml.in',
+ output: 'org.gnome.FeedReader.appdata.xml',
+ po_dir: PO_DIR,
+ install: true,
+ install_dir: join_paths(SHARE_DIR, 'appdata')
+)
+
+
+desktop_file_validate = find_program('desktop-file-validate', required:false)
+
+if desktop_file_validate.found()
+ test (
+ 'Validate desktop file',
+ desktop_file_validate,
+ args: join_paths(meson.current_build_dir (), 'org.gnome.FeedReader-autostart.desktop')
+ )
+endif
+
+appstreamcli = find_program(['appstreamcli', 'appstream-util'], required:false)
+
+if appstreamcli.found()
+ test (
+ 'Validate appdata file',
+ appstreamcli,
+ args: ['validate', join_paths(meson.current_build_dir (), 'org.gnome.FeedReader.appdata.xml')]
+ )
+endif
+
+
+subdir('application-icons')
+
+install_subdir('GrabberConfig', install_dir : DATA_DIR)
diff --git a/data/org.gnome.FeedReader-autostart.desktop.in b/data/org.gnome.FeedReader-autostart.desktop.in
index 0f2fb335..d128d08f 100755
--- a/data/org.gnome.FeedReader-autostart.desktop.in
+++ b/data/org.gnome.FeedReader-autostart.desktop.in
@@ -3,7 +3,7 @@ Name=FeedReader Autostart
GenericName=RSS Client
Comment=
Categories=Network;Feed;
-Exec=feedreader-daemon
+Exec=feedreader --headless
Icon=org.gnome.FeedReader
Terminal=false
Type=Application
diff --git a/data/org.gnome.FeedReader.Daemon.service.in b/data/org.gnome.FeedReader.Daemon.service.in
deleted file mode 100644
index 9d19ede4..00000000
--- a/data/org.gnome.FeedReader.Daemon.service.in
+++ /dev/null
@@ -1,3 +0,0 @@
-[D-BUS Service]
-Name=org.gnome.FeedReader.Daemon
-Exec=@CMAKE_INSTALL_PREFIX@/bin/feedreader-daemon
diff --git a/data/org.gnome.FeedReader.appdata.xml.in b/data/org.gnome.FeedReader.appdata.xml.in
index af2ef87d..ed057c36 100644
--- a/data/org.gnome.FeedReader.appdata.xml.in
+++ b/data/org.gnome.FeedReader.appdata.xml.in
@@ -1,104 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
- <id>org.gnome.FeedReader.desktop</id>
- <metadata_license>CC0</metadata_license>
- <project_license>GPL-3.0+</project_license>
- <name>FeedReader</name>
- <summary>RSS client for various webservices</summary>
- <translation type="gettext">FeedReader</translation>
- <description>
- <p>
+ <id>org.gnome.FeedReader.desktop</id>
+ <metadata_license>CC0</metadata_license>
+ <project_license>GPL-3.0+</project_license>
+ <name>FeedReader</name>
+ <summary>RSS client for various webservices</summary>
+ <translation type="gettext">FeedReader</translation>
+ <description>
+ <p>
FeedReader is a program designed to complement an already existing web-based
RSS reader account.
</p>
- <p>Currently supported services:</p>
- <ul>
- <li>Tiny Tiny RSS</li>
- <li>feedly</li>
- <li>ownCloud</li>
- <li>Inoreader</li>
- </ul>
- <p>
+ <p>Currently supported services:</p>
+ <ul>
+ <li>Tiny Tiny RSS</li>
+ <li>feedly</li>
+ <li>ownCloud</li>
+ <li>Inoreader</li>
+ </ul>
+ <p>
It combines all the advantages of web based services like synchronisation across all your devices
with everything you expect from a modern desktop application: Desktop notifications, fast search
and filters, tagging, sharing to "read-it-later" services like pocket and instapaper, handy keyboard
shortcuts and a database that keeps all your old articles as long as you like.
- </p>
- </description>
- <screenshots>
- <screenshot type="default">
- <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot1.png</image>
- </screenshot>
- <screenshot>
- <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot2.png</image>
- </screenshot>
- <screenshot>
- <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot3.png</image>
- </screenshot>
- <screenshot>
- <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot4.png</image>
- </screenshot>
- <screenshot>
- <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot5.png</image>
- </screenshot>
- </screenshots>
- <url type="homepage">http://jangernert.github.io/FeedReader/</url>
- <project_group>GNOME</project_group>
- <provides>
- <binary>feedreader</binary>
- <binary>feedreader-daemon</binary>
- </provides>
- <releases>
- <release version="1.6" timestamp="1463182002">
- <description>
- <p>Inoreader support</p>
- <p>Offline Mode</p>
- <p>Imageviewer</p>
- <p>Manipulate feeds and categories</p>
- <p>Sidebar themes</p>
- <p>Support http-basic-auth</p>
- <p>Article List: time stamp</p>
- <p>Article List: double click to open in browser</p>
- <p>Article View: Show URL on mouseover</p>
- <p>Article View: Right click menu</p>
- <p>Article View: Configure font size</p>
- <p>Commit version in "--about"</p>
- <p>Support Gtk+ 3.20</p>
- <p>HiDPI support</p>
- <p>Full-screen-mode</p>
- <p>lots of bugfixes</p>
- </description>
- </release>
- <release version="1.4" timestamp="1441065600">
- <description>
- <p>ownCloud News support</p>
- <p>sync more responsive</p>
- <p>app fully operational during initial sync</p>
- <p>overlay to indicate new articles</p>
- <p>better Gnome integration</p>
- <p>proper fullscreen mode for videos</p>
- <p>support multiple share accounts of the same kind</p>
- <p>option to ignore unknown CA’s</p>
- <p>tons of fixes</p>
- </description>
- </release>
- <release version="1.2" timestamp="1441065600">
- <description>
- <p>improved article-view</p>
- <p>drag article with middle mouse click</p>
- <p>updated UI and animations</p>
- <p>global short-cuts</p>
- <p>tag articles</p>
- <p>share articles to readability/instapaper/pocket</p>
- <p>article grabber (grabs full articles without ads from website for known sites)</p>
- <p>basic full text search</p>
- <p>tons of fixes</p>
- </description>
- </release>
- <release version="1.0" timestamp="1365768000">
- <description>
- <p>First release</p>
- </description>
- </release>
- </releases>
+ </p>
+ </description>
+ <screenshots>
+ <screenshot type="default">
+ <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot1.png</image>
+ </screenshot>
+ <screenshot>
+ <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot2.png</image>
+ </screenshot>
+ <screenshot>
+ <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot3.png</image>
+ </screenshot>
+ <screenshot>
+ <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot4.png</image>
+ </screenshot>
+ <screenshot>
+ <image>http://jangernert.github.io/FeedReader/images/gallery/Screenshot5.png</image>
+ </screenshot>
+ </screenshots>
+ <url type="homepage">http://jangernert.github.io/FeedReader/</url>
+ <project_group>GNOME</project_group>
+ <provides>
+ <binary>feedreader</binary>
+ <binary>feedreader-daemon</binary>
+ </provides>
+ <releases>
+ <release version="1.6" timestamp="1463182002">
+ <description>
+ <p>Inoreader support</p>
+ <p>Offline Mode</p>
+ <p>Imageviewer</p>
+ <p>Manipulate feeds and categories</p>
+ <p>Sidebar themes</p>
+ <p>Support http-basic-auth</p>
+ <p>Article List: time stamp</p>
+ <p>Article List: double click to open in browser</p>
+ <p>Article View: Show URL on mouseover</p>
+ <p>Article View: Right click menu</p>
+ <p>Article View: Configure font size</p>
+ <p>Commit version in "--about"</p>
+ <p>Support Gtk+ 3.20</p>
+ <p>HiDPI support</p>
+ <p>Full-screen-mode</p>
+ <p>lots of bugfixes</p>
+ </description>
+ </release>
+ <release version="1.4" timestamp="1441065600">
+ <description>
+ <p>ownCloud News support</p>
+ <p>sync more responsive</p>
+ <p>app fully operational during initial sync</p>
+ <p>overlay to indicate new articles</p>
+ <p>better Gnome integration</p>
+ <p>proper fullscreen mode for videos</p>
+ <p>support multiple share accounts of the same kind</p>
+ <p>option to ignore unknown CA’s</p>
+ <p>tons of fixes</p>
+ </description>
+ </release>
+ <release version="1.2" timestamp="1441065600">
+ <description>
+ <p>improved article-view</p>
+ <p>drag article with middle mouse click</p>
+ <p>updated UI and animations</p>
+ <p>global short-cuts</p>
+ <p>tag articles</p>
+ <p>share articles to readability/instapaper/pocket</p>
+ <p>article grabber (grabs full articles without ads from website for known sites)</p>
+ <p>basic full text search</p>
+ <p>tons of fixes</p>
+ </description>
+ </release>
+ <release version="1.0" timestamp="1365768000">
+ <description>
+ <p>First release</p>
+ </description>
+ </release>
+ </releases>
</component>
diff --git a/data/org.gnome.FeedReader.desktop.in b/data/org.gnome.FeedReader.desktop.in
index 0ddf9bb9..363e05b8 100755
--- a/data/org.gnome.FeedReader.desktop.in
+++ b/data/org.gnome.FeedReader.desktop.in
@@ -10,8 +10,8 @@ Type=Application
X-GNOME-UsesNotifications=true
X-GNOME-Gettext-Domain=FeedReader
X-GNOME-Keywords=
-Actions=AboutDialog;
MimeType=x-scheme-handler/feedreader;
+Actions=AboutDialog;
[Desktop Action AboutDialog]
Exec=feedreader --about
diff --git a/data/org.gnome.FeedReader.gresource.xml b/data/org.gnome.FeedReader.gresource.xml
index c7ee996f..a04066d6 100644
--- a/data/org.gnome.FeedReader.gresource.xml
+++ b/data/org.gnome.FeedReader.gresource.xml
@@ -5,10 +5,10 @@
<file compressed="true">gtk-css/dark.css</file>
<file compressed="true">gtk-css/gtk.css</file>
<file compressed="true">gtk-css/elementary.css</file>
-
+
<file compressed="true">ArticleView/style.css</file>
<file compressed="true">ArticleView/article.html</file>
-
+
<file preprocess="xml-stripblanks">icons/16x16/actions/feed-add-symbolic.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/actions/feed-arrow-up-symbolic.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/actions/feed-refresh-symbolic.svg</file>
@@ -17,7 +17,7 @@
<file preprocess="xml-stripblanks">icons/16x16/actions/feed-sidebar-arrow-down-symbolic.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/actions/feed-sidebar-arrow-side-symbolic.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/actions/feed-tag-symbolic.svg</file>
-
+
<file preprocess="xml-stripblanks">icons/16x16/status/feed-article-read.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/status/feed-article-unread.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/status/feed-backend-info.svg</file>
@@ -27,9 +27,9 @@
<file preprocess="xml-stripblanks">icons/16x16/status/feed-starred.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/status/feed-unmarked-symbolic.svg</file>
<file preprocess="xml-stripblanks">icons/16x16/status/feed-unread-symbolic.svg</file>
-
+
<file preprocess="xml-stripblanks">icons/24x24/actions/feed-mark-read-symbolic.svg</file>
-
+
<file preprocess="xml-stripblanks">icons/24x24/status/feed-backend-info.svg</file>
<file preprocess="xml-stripblanks">icons/24x24/status/feed-cloud-symbolic.svg</file>
<file preprocess="xml-stripblanks">icons/24x24/status/feed-copyright-symbolic.svg</file>
@@ -43,3 +43,4 @@
<file preprocess="xml-stripblanks">icons/24x24/status/feed-website-symbolic.svg</file>
</gresource>
</gresources>
+
diff --git a/data/tt-rss-feedreader-plugin/api_feedreader/init.php b/data/tt-rss-feedreader-plugin/api_feedreader/init.php
index a0c86156..55f39b58 100644
--- a/data/tt-rss-feedreader-plugin/api_feedreader/init.php
+++ b/data/tt-rss-feedreader-plugin/api_feedreader/init.php
@@ -11,12 +11,12 @@ class Api_feedreader extends Plugin {
true
);
}
-
+
function api_version()
{
return 2;
}
-
+
function init($host)
{
$this->host = $host;
@@ -31,13 +31,13 @@ class Api_feedreader extends Plugin {
$this->host->add_api_method("renameFeed", $this);
$this->host->add_api_method("moveFeed", $this);
}
-
+
function removeLabel()
{
$label_id = (int)db_escape_string($_REQUEST["label_id"]);
if($label_id != "")
{
- label_remove(feed_to_label_id($label_id), $_SESSION["uid"]);
+ Labels::remove(Labels::feed_to_label_id($label_id), $_SESSION["uid"]);
return array(API::STATUS_OK);
}
else
@@ -45,27 +45,27 @@ class Api_feedreader extends Plugin {
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function addLabel()
{
$caption = db_escape_string($_REQUEST["caption"]);
if($caption != "")
{
- label_create($caption);
- $id = label_find_id($caption, $_SESSION["uid"]);
- return array(API::STATUS_OK, label_to_feed_id($id));
+ Labels::create($caption);
+ $id = Labels::find_id($caption, $_SESSION["uid"]);
+ return array(API::STATUS_OK, Labels::label_to_feed_id($id));
}
else
{
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function renameLabel()
{
$caption = db_escape_string($_REQUEST["caption"]);
- $label_id = feed_to_label_id((int)db_escape_string($_REQUEST["label_id"]));
-
+ $label_id = Labels::feed_to_label_id((int)db_escape_string($_REQUEST["label_id"]));
+
if($label_id != "" && $caption != "")
{
$this->dbh->query("UPDATE ttrss_labels2 SET caption = '$caption' WHERE id = '$label_id' AND owner_uid = " . $_SESSION["uid"]);
@@ -76,7 +76,7 @@ class Api_feedreader extends Plugin {
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function removeCategory()
{
$category_id = (int)db_escape_string($_REQUEST["category_id"]);
@@ -91,12 +91,12 @@ class Api_feedreader extends Plugin {
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function moveCategory()
{
$category_id = (int)db_escape_string($_REQUEST["category_id"]);
$parent_id = (int)db_escape_string($_REQUEST["parent_id"]);
-
+
if($category_id != "")
{
if($parent_id == "")
@@ -114,7 +114,7 @@ class Api_feedreader extends Plugin {
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function addCategory()
{
$caption = db_escape_string($_REQUEST["caption"]);
@@ -124,20 +124,23 @@ class Api_feedreader extends Plugin {
if($parent_id != "")
{
add_feed_category($caption, $parent_id);
+ $parent_qpart = "parent_cat = '$parent_id'";
}
else
{
add_feed_category($caption);
+ $parent_qpart = "parent_cat IS NULL";
}
-
- return array(API::STATUS_OK, get_feed_category($caption));
+ $result = $this->dbh->query("SELECT id FROM ttrss_feed_categories WHERE $parent_qpart AND title = '$caption' AND owner_uid = ".$_SESSION["uid"]);
+ $id = $this->dbh->fetch_result($result, 0, "id");
+ return array(API::STATUS_OK, $id);
}
else
{
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function renameCategory() {
$cat_id = (int)db_escape_string($_REQUEST["category_id"]);
$caption = db_escape_string($_REQUEST["caption"]);
@@ -152,7 +155,7 @@ class Api_feedreader extends Plugin {
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function renameFeed() {
$feed_id = (int)db_escape_string($_REQUEST["feed_id"]);
$caption = db_escape_string($_REQUEST["caption"]);
@@ -167,7 +170,7 @@ class Api_feedreader extends Plugin {
return array(API::STATUS_ERR, array("error" => 'INCORRECT_USAGE'));
}
}
-
+
function moveFeed() {
$feed_id = (int)db_escape_string($_REQUEST["feed_id"]);
$cat_id = (int)db_escape_string($_REQUEST["category_id"]);
diff --git a/debian/control b/debian/control
new file mode 100644
index 00000000..37add10f
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,29 @@
+Source: feedreader
+Section: x11
+Priority: extra
+Maintainer: Jan Lukas Gernert <jangernert@gmail.com>
+Build-Depends: cmake (>= 2.8),
+ debhelper (>= 8.0.0),
+ valac-0.30 | valac (>= 0.30),
+ libgirepository1.0-dev,
+ libgtk-3-dev (>= 3.22),
+ libsoup2.4-dev,
+ libjson-glib-dev,
+ libwebkit2gtk-4.0-dev,
+ libsqlite3-dev,
+ libsecret-1-dev,
+ libnotify-dev,
+ libunity-dev,
+ libgee-0.8-dev,
+ librest-dev,
+ libgstreamer1.0-dev,
+ libgstreamer-plugins-base1.0-dev,
+ libgoa-1.0-dev,
+ libcurl-dev,
+ libpeas-dev
+Standards-Version: 3.9.3
+
+Package: feedreader
+Architecture: any
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Description: A simple client for online RSS services like tt-rss and others.
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 00000000..ff54bdb5
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,52 @@
+FROM docker.io/fedora:27
+
+RUN dnf -y install \
+ gcc \
+ gettext \
+ git \
+ gnome-online-accounts-devel \
+ gstreamer1-devel \
+ gstreamer1-plugins-base-devel \
+ gtk3-devel \
+ json-glib-devel \
+ libcurl-devel \
+ libgee-devel \
+ libnotify-devel \
+ libpeas-devel \
+ libsecret-devel \
+ libsoup-devel \
+ libxml2-devel \
+ meson \
+ rest-devel \
+ sqlite-devel \
+ vala \
+ webkitgtk4-devel
+
+# Install Feedbin
+# Note: Some dependencies are duplicates of above, but it's easier to maintain if
+# we use the exact list here: https://github.com/feedbin/feedbin/blob/master/doc/INSTALL-fedora.md
+# TODO: Run Feedbin in its own container
+RUN dnf -y install \
+ gcc \
+ gcc-c++ \
+ git \
+ libcurl-devel \
+ libidn-devel \
+ libxml2-devel \
+ libxslt-devel \
+ nodejs \
+ postgresql \
+ postgresql-devel \
+ redhat-rpm-config \
+ rubygems \
+ ruby-devel \
+ rubygem-bundler \
+ ImageMagick-devel \
+ opencv-devel \
+ which
+# Install the latest stable version of meson
+RUN pip3 install --user --upgrade meson
+
+RUN gem install bundler
+RUN git clone https://github.com/feedbin/feedbin.git
+RUN cd feedbin && bundle
diff --git a/docker/update_image.sh b/docker/update_image.sh
new file mode 100755
index 00000000..6567465f
--- /dev/null
+++ b/docker/update_image.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -e
+NAME=docker.io/feedreader/fedora-feedreader-devel
+
+sudo docker build . -t "$NAME"
+sudo docker push "$NAME"
diff --git a/flatpak/Makefile b/flatpak/Makefile
deleted file mode 100644
index 47f7c649..00000000
--- a/flatpak/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-include Makefile.config
-
-all: test
-
-test: repo ${JSON}
- flatpak-builder --force-clean --repo=repo --ccache --require-changes ${PACKAGE} ${JSON}
- flatpak build-update-repo repo
-
-release: release-repo ${JSON} feedreader.flatpakref feedreader.flatpakrepo
- if [ "x${RELEASE_GPG_KEY}" == "x" ]; then echo Must set RELEASE_GPG_KEY in Makefile.config, try \'make gpg-key\'; exit 1; fi
- flatpak-builder --force-clean --repo=release-repo --ccache --gpg-homedir=gpg --gpg-sign=${RELEASE_GPG_KEY} ${PACKAGE} ${JSON}
- flatpak build-update-repo --generate-static-deltas --gpg-homedir=gpg --gpg-sign=${RELEASE_GPG_KEY} release-repo
-
-rsync-release:
- cp feedreader.flatpakrepo release-repo/
- cp feedreader.flatpakref release-repo/
- rsync -rvh --update release-repo/ ${SSH_USER}:${RSYNC_PATH}
-
-repo:
- ostree init --mode=archive-z2 --repo=repo
-
-release-repo:
- ostree init --mode=archive-z2 --repo=release-repo
-
-gpg-key:
- if [ "x${KEY_USER}" == "x" ]; then echo Must set KEY_USER in Makefile.config; exit 1; fi
- mkdir -p gpg
- gpg2 --homedir gpg --quick-gen-key ${KEY_USER}
- echo Enter the above gpg key id as RELEASE_GPG_KEY in Makefile.config
-
-${JSON}: ${JSON}.in
- sed -e 's|@BRANCH@|${BRANCH}|g' -e 's|@RUNTIME_VERSION@|${RUNTIME_VERSION}|g' -e 's|@GIT@|${GIT}|' $< > $@
-
-feedreader.flatpakref: feedreader.flatpakref.in
- sed -e 's|@URL@|${URL}|g' -e 's|@BRANCH@|${BRANCH}|g' -e 's|@GPG@|$(shell gpg2 --homedir=gpg --export ${RELEASE_GPG_KEY} | base64 | tr -d '\n')|' $< > $@
-
-feedreader.flatpakrepo: feedreader.flatpakrepo.in
- sed -e 's|@URL@|${URL}|g' -e 's|@GPG@|$(shell gpg2 --homedir=gpg --export ${RELEASE_GPG_KEY} | base64 | tr -d '\n')|' $< > $@
-
-bundle: test
- flatpak build-bundle repo/ ${BUNDLE}.flatpak org.gnome.${PACKAGE} ${BRANCH}
-
-
-
diff --git a/flatpak/Makefile.config b/flatpak/Makefile.config
deleted file mode 100644
index f63e325a..00000000
--- a/flatpak/Makefile.config
+++ /dev/null
@@ -1,19 +0,0 @@
-PACKAGE=FeedReader
-VERSION=2.0.1
-JSON=org.gnome.FeedReader.json
-ARCH=x86_64
-BRANCH=stable
-GIT=stable
-RUNTIME_VERSION=3.22
-BUILD=$(GIT)-` date +"%Y%m%d" `
-BUNDLE=$(PACKAGE)-$(VERSION)-$(BUILD).$(ARCH)
-RELEASE_GPG_KEY=09624E3452B19227EE2CD0107E74B9AF91B7D5D5
-KEY_USER=scurtu@mail.de
-# user + host : user@ip
-SSH_USER=jscurtu@192.168.10.10
-# Path to repo
-RSYNC_PATH=/volume1/Shares/S3/feedreader/
-# The url of your public repository which is embedded in the generated
-# .flatpakref file
-URL=http://feedreader.xarbit.net/feedreader-repo
-
diff --git a/flatpak/feedreader.flatpakref.in b/flatpak/feedreader.flatpakref.in
deleted file mode 100644
index b9220e19..00000000
--- a/flatpak/feedreader.flatpakref.in
+++ /dev/null
@@ -1,12 +0,0 @@
-[Flatpak Ref]
-Title=FeedReader
-Name=org.gnome.FeedReader
-Homepage=https://jangernert.github.io/FeedReader/
-Branch=@BRANCH@
-Url=@URL@
-IsRuntime=False
-GPGKey=@GPG@
-RuntimeRepo=https://sdk.gnome.org/gnome.flatpakrepo
-Comment=FeedReader
-Description=FeedReader is a modern desktop application designed to complement existing web-based RSS accounts.
-Icon=https://raw.githubusercontent.com/jangernert/FeedReader/master/data/application-icons/hicolor/64x64/apps/org.gnome.FeedReader.svg
diff --git a/flatpak/feedreader.flatpakrepo.in b/flatpak/feedreader.flatpakrepo.in
deleted file mode 100644
index 931dc7d3..00000000
--- a/flatpak/feedreader.flatpakrepo.in
+++ /dev/null
@@ -1,6 +0,0 @@
-[Flatpak Repo]
-Title=FeedReader Repo
-Description=FeedReader is a modern desktop application designed to complement existing web-based RSS accounts.
-Url=@URL@
-GPGKey=@GPG@
-Homepage=https://jangernert.github.io/FeedReader/
diff --git a/flatpak/org.gnome.FeedReader.json.in b/flatpak/org.gnome.FeedReader.json.in
deleted file mode 100644
index 34ebe5cf..00000000
--- a/flatpak/org.gnome.FeedReader.json.in
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "app-id": "org.gnome.FeedReader",
- "branch": "@BRANCH@",
- "runtime": "org.gnome.Platform",
- "runtime-version": "@RUNTIME_VERSION@",
- "sdk": "org.gnome.Sdk",
- "command": "feedreader",
- "copy-icon": true,
- "finish-args": [
- /* Play sounds */
- "--socket=pulseaudio",
- /* Access to X11 and XShm (video playback) */
- "--socket=x11",
- "--share=ipc",
- /* Access to Wayland */
- "--socket=wayland",
- /* Access to OpenGL */
- "--device=dri",
- /* Access to Network */
- "--share=network",
- /* Needed for dconf to work */
- "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro",
- "--talk-name=ca.desrt.dconf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf",
- "--talk-name=org.gnome.OnlineAccounts",
- "--own-name=org.gnome.FeedReader.Daemon",
- "--own-name=org.gnome.FeedReader.ArticleView",
- "--talk-name=org.freedesktop.Notifications",
- "--talk-name=org.freedesktop.secrets"
- ],
- "build-options": {
- "cflags": "-O2 -g -w",
- "cxxflags": "-O2 -g"
- },
- "modules": [{
- "name": "libgee",
- "cleanup": ["/include", "*.la", "/lib/pkgconfig", "/share"],
- "build-options": {
- "env": {
- "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_GIRDIR": "/app/share/gir-1.0",
- "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_TYPELIBDIR": "/app/lib/girepository-1.0"
- }
- },
- "sources": [{
- "type": "archive",
- "url": "https://download.gnome.org/sources/libgee/0.18/libgee-0.18.1.tar.xz",
- "sha256": "99686bbe5a9c89ba9502c25f61314ee8efa0dd2a1159c9a639afc1458c2839a2"
- }]
- }, {
- "name": "rest",
- "config-opts": ["--disable-introspection", "--disable-gtk-doc", "--disable-gtk-doc-html"],
- "cleanup": ["/include", "*.la", "/lib/pkgconfig", "/share"],
- "build-options": {
- "env": {
- "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_GIRDIR": "/app/share/gir-1.0",
- "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_TYPELIBDIR": "/app/lib/girepository-1.0"
- }
- },
- "sources": [{
- "type": "archive",
- "url": "https://download.gnome.org/sources/rest/0.8/rest-0.8.0.tar.xz",
- "sha256": "e7b89b200c1417073aef739e8a27ff2ab578056c27796ec74f5886a5e0dff647"
- }]
- }, {
- "name": "libpeas",
- "config-opts": ["--disable-gtk-doc", "--disable-gtk-doc-html", "--disable-gtk"],
- "cleanup": ["/include", "*.la", "/lib/pkgconfig"],
- "build-options": {
- "env": {
- "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_GIRDIR": "/app/share/gir-1.0",
- "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_TYPELIBDIR": "/app/lib/girepository-1.0"
- }
- },
- "sources": [{
- "type": "archive",
- "url": "https://download.gnome.org/sources/libpeas/1.20/libpeas-1.20.0.tar.xz",
- "sha256": "f392fffe2dc00072a51bb2a1b274224a06bdc5f9c3b3c0ac4816909e9933d354"
- }]
- },
- {
- "name": "gnome-online-accounts",
- "config-opts": ["--disable-telepathy", "--disable-documentation", "--disable-backend"],
- "sources": [{
- "type": "archive",
- "url": "https://download.gnome.org/sources/gnome-online-accounts/3.22/gnome-online-accounts-3.22.3.tar.xz",
- "sha256": "0bef86988f38e4b1a46c778ad160c4470c2197d75a4267966d5a5938a0b39b8f"
- }]
- },
- {
- "name": "feedreader",
- "cmake": true,
- "config-opts": ["-DCMAKE_INSTALL_PREFIX=/app"],
- "sources": [{
- "type": "git",
- "url": "https://github.com/jangernert/FeedReader.git",
- "branch": "@GIT@"
- }
- ]
- }
- ]
-}
diff --git a/gtester-to-junit-4.xsl b/gtester-to-junit-4.xsl
new file mode 100644
index 00000000..379e8c7f
--- /dev/null
+++ b/gtester-to-junit-4.xsl
@@ -0,0 +1,120 @@
+<?xml version="1.0"?>
+<!-- created by R. Tyler Croy and improved by André Klitzing -->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output indent="yes" method="xml" omit-xml-declaration="no" cdata-section-elements="system-out" />
+
+ <xsl:template name="strreplace">
+ <!-- Based on this code: http://geekswithblogs.net/Erik/archive/2008/04/01/120915.aspx -->
+ <xsl:param name="string" />
+ <xsl:param name="token" />
+ <xsl:param name="newtoken" />
+ <xsl:choose>
+ <xsl:when test="contains($string, $token)">
+ <xsl:value-of select="substring-before($string, $token)" />
+ <xsl:value-of select="$newtoken" />
+ <xsl:call-template name="strreplace">
+ <xsl:with-param name="string" select="substring-after($string, $token)" />
+ <xsl:with-param name="token" select="$token" />
+ <xsl:with-param name="newtoken" select="$newtoken" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="remove-lf-left">
+ <!-- Based on this code: http://dpawson.co.uk/xsl/sect2/N8321.html#d11325e833 -->
+ <xsl:param name="astr" />
+ <xsl:choose>
+ <xsl:when test="starts-with($astr,'&#xA;') or starts-with($astr,'&#xD;')">
+ <xsl:call-template name="remove-lf-left">
+ <xsl:with-param name="astr" select="substring($astr, 2)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$astr" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="sysout">
+ random-seed: <xsl:value-of select="random-seed" />
+ <xsl:for-each select="testcase">
+ <xsl:variable name="classname">
+ <xsl:call-template name="strreplace">
+ <xsl:with-param name="string" select="substring-after(@path, '/')" />
+ <xsl:with-param name="token" select="'/'" />
+ <xsl:with-param name="newtoken" select="'.'" />
+ </xsl:call-template>
+ </xsl:variable>
+ Start test '<xsl:value-of select="$classname" />':
+ ---------------------------------------------------------------------
+ <xsl:for-each select="message">
+ <xsl:call-template name="remove-lf-left">
+ <xsl:with-param name="astr" select="." />
+ </xsl:call-template>
+ </xsl:for-each>
+ ---------------------------------------------------------------------
+ End test '<xsl:value-of select="$classname" />'
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template match="/">
+ <testsuites>
+ <xsl:for-each select="gtester">
+
+ <xsl:for-each select="testbinary">
+ <testsuite>
+ <xsl:attribute name="name">
+ <xsl:value-of select="@path" />
+ </xsl:attribute>
+ <xsl:attribute name="tests">
+ <xsl:value-of select="count(testcase)" />
+ </xsl:attribute>
+ <xsl:attribute name="time">
+ <xsl:value-of select="sum(testcase/duration)" />
+ </xsl:attribute>
+ <xsl:attribute name="failures">
+ <xsl:value-of select="count(testcase/status[@result='failed'])" />
+ </xsl:attribute>
+
+ <xsl:for-each select="testcase">
+ <testcase>
+ <xsl:variable name="classname">
+ <xsl:call-template name="strreplace">
+ <xsl:with-param name="string" select="substring-after(@path, '/')" />
+ <xsl:with-param name="token" select="'/'" />
+ <xsl:with-param name="newtoken" select="'.'" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:attribute name="classname">
+ <xsl:value-of select="$classname" />
+ </xsl:attribute>
+ <xsl:attribute name="name">
+ <xsl:value-of select="$classname" />
+ </xsl:attribute>
+ <xsl:attribute name="time">
+ <xsl:value-of select="duration" />
+ </xsl:attribute>
+ <xsl:if test="status[@result = 'failed']">
+ <failure>
+ <xsl:value-of select="error" />
+ </failure>
+ </xsl:if>
+ </testcase>
+ </xsl:for-each>
+
+ <system-out>
+ <xsl:call-template name="sysout" />
+ </system-out>
+ <system-err></system-err>
+ </testsuite>
+ </xsl:for-each>
+
+ </xsl:for-each>
+ </testsuites>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/libVilistextum/CMakeLists.txt b/libVilistextum/CMakeLists.txt
deleted file mode 100644
index aa6faca4..00000000
--- a/libVilistextum/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-add_library(vilistextum STATIC
- charset.h
- charset.c
- fileio.h
- fileio.c
- html.h
- html.c
- html_tag.h
- html_tag.c
- latin1.h
- latin1.c
- lists.h
- lists.c
- microsoft.h
- microsoft.c
- multibyte.h
- text.h
- text.c
- unicode_entities.h
- unicode_entities.c
- util.h
- util.c
- vilistextum.h
- vilistextum.c)
diff --git a/libgd/CMakeLists.txt b/libgd/CMakeLists.txt
deleted file mode 100644
index b00286d7..00000000
--- a/libgd/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-add_library(gd STATIC
- gd.h
- gd-notification.h
- gd-notification.c
- gd-types-catalog.h
- gd-types-catalog.c)
diff --git a/libgtkimageview/CMakeLists.txt b/libgtkimageview/CMakeLists.txt
deleted file mode 100644
index 662316d4..00000000
--- a/libgtkimageview/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-add_library(gtkimageview STATIC
- gtkimageview.h
- gtkimageview.c)
diff --git a/libraries/WebExtension/meson.build b/libraries/WebExtension/meson.build
new file mode 100644
index 00000000..6e059734
--- /dev/null
+++ b/libraries/WebExtension/meson.build
@@ -0,0 +1,18 @@
+webkit2gtk_vapi = vala_compiler.find_library('webkit2gtk-web-extension-4.0',
+ dirs: VAPI_DIR)
+
+webextension_lib = shared_library(
+ 'webextension',
+ [
+ 'webextension.vala'
+ ],
+ dependencies: [
+ gtk,
+ libsoup,
+ webkitextension
+ ]
+)
+
+lib_webextension = declare_dependency(
+ link_with: webextension_lib,
+)
diff --git a/libraries/WebExtension/webextension.vala b/libraries/WebExtension/webextension.vala
new file mode 100644
index 00000000..5b64914c
--- /dev/null
+++ b/libraries/WebExtension/webextension.vala
@@ -0,0 +1,188 @@
+[DBus (name = "org.gnome.FeedReader.ArticleView")]
+public class FeedReaderWebExtension : Object {
+
+ private WebKit.DOM.Document m_doc;
+ public signal void onClick(string path, int width, int height, string url);
+ public signal void message(string message);
+
+ [DBus (visible = false)]
+ public void on_bus_aquired(DBusConnection connection)
+ {
+ try
+ {
+ connection.register_object("/org/gnome/FeedReader/ArticleView", this);
+ }
+ catch(GLib.IOError e)
+ {
+ warning("Could not register object");
+ }
+ }
+
+ [DBus (visible = false)]
+ public void on_page_created(WebKit.WebExtension extension, WebKit.WebPage page)
+ {
+ page.document_loaded.connect(() => {
+ onDocLoaded(page);
+ });
+ message("on_page_created");
+ }
+
+ private void onDocLoaded(WebKit.WebPage page)
+ {
+ m_doc = page.get_dom_document();
+ message("onDocLoaded");
+ }
+
+ public void recalculate()
+ {
+ message("recalculate");
+ var images = m_doc.get_images();
+ ulong count = images.get_length();
+
+ for(ulong i = 0; i < count; i++)
+ {
+ var image = (WebKit.DOM.HTMLImageElement)images.item(i);
+
+ // don't offer imageviewer if image isn't local
+ if(image.src.has_prefix("http"))
+ continue;
+
+ // if image was so huge it had to be replaced with a downscaled version
+ if(image.has_attribute("FR_huge"))
+ {
+ addListener(image, image.get_attribute("FR_huge"));
+ continue;
+ }
+ else if(image.has_attribute("FR_parent"))
+ {
+ addListener(image, image.get_attribute("FR_parent"));
+ continue;
+ }
+
+ long nHeight = image.get_natural_height();
+ long nWidth = image.get_natural_width();
+ long height = image.get_height();
+ long width = image.get_width();
+
+ if(nHeight > 250 || nWidth > 250)
+ {
+ double hRatio = (double)height / (double)nHeight;
+ double wRatio = (double)width / (double)nWidth;
+ double threshold = 0.8;
+
+ if(hRatio <= threshold
+ || wRatio <= threshold)
+ addListener(image, image.src);
+ else
+ removeListener(image);
+ }
+ }
+ }
+
+ [DBus (visible = false)]
+ private void addListener(WebKit.DOM.HTMLImageElement image, string url)
+ {
+ // check if url exists
+ if(GLib.FileUtils.test(url, GLib.FileTest.EXISTS))
+ {
+ ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("mouseover", on_enter, false);
+ ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("mousemove", on_enter, false);
+ ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("mouseout", on_leave, false);
+ ((WebKit.DOM.EventTarget) image).add_event_listener_with_closure("click", on_click, false);
+ }
+ }
+
+ [DBus (visible = false)]
+ private void removeListener(WebKit.DOM.HTMLImageElement image)
+ {
+ ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("mouseover", on_enter, false);
+ ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("mousemove", on_enter, false);
+ ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("mouseout", on_leave, false);
+ ((WebKit.DOM.EventTarget) image).remove_event_listener_with_closure("click", on_click, false);
+
+ try
+ {
+ image.set_attribute("class", "");
+ }
+ catch(GLib.Error e)
+ {
+ stderr.printf("WebExtension.recalculate: %s", e.message);
+ }
+ }
+
+ [DBus (visible = false)]
+ private void on_enter(WebKit.DOM.EventTarget target, WebKit.DOM.Event event)
+ {
+ try
+ {
+ var image = (WebKit.DOM.HTMLImageElement)target;
+ image.set_attribute("class", "clickable-img-hover");
+ }
+ catch(GLib.Error e)
+ {
+
+ }
+ }
+
+ [DBus (visible = false)]
+ private void on_leave(WebKit.DOM.EventTarget target, WebKit.DOM.Event event)
+ {
+ try
+ {
+ var image = (WebKit.DOM.HTMLImageElement)target;
+ image.set_attribute("class", "");
+ }
+ catch(GLib.Error e)
+ {
+
+ }
+ }
+
+ [DBus (visible = false)]
+ public void on_click(WebKit.DOM.EventTarget target, WebKit.DOM.Event event)
+ {
+ event.prevent_default();
+ var image = (WebKit.DOM.HTMLImageElement)target;
+
+ string url = "";
+ var parent = image.get_parent_element();
+ if(parent.tag_name == "A")
+ url = parent.get_attribute("href");
+
+
+ int height = (int)image.natural_height;
+ int width = (int)image.natural_width;
+ string src = image.src;
+ string pref = "file://";
+ if(src.has_prefix(pref))
+ src = src.substring(pref.length);
+
+ if(image.has_attribute("FR_huge"))
+ {
+ src = image.get_attribute("FR_huge");
+ Gdk.Pixbuf.get_file_info(src, out width, out height);
+ }
+ else if(image.has_attribute("FR_parent"))
+ {
+ src = image.get_attribute("FR_parent");
+ Gdk.Pixbuf.get_file_info(src, out width, out height);
+ }
+
+ onClick(src, width, height, url);
+ }
+}
+
+[DBus (name = "org.gnome.FeedReader.ArticleView")]
+public errordomain FeedReaderWebExtensionError
+{
+ ERROR
+}
+
+[CCode (cname = "G_MODULE_EXPORT webkit_web_extension_initialize", instance_pos = -1)]
+public void webkit_web_extension_initialize(WebKit.WebExtension extension)
+{
+ var server = new FeedReaderWebExtension();
+ extension.page_created.connect(server.on_page_created);
+ Bus.own_name(BusType.SESSION, "org.gnome.FeedReader.ArticleView", BusNameOwnerFlags.NONE,
+ server.on_bus_aquired, null, () => { warning("Could not aquire name"); });
+}
diff --git a/libraries/libIvy/Extractor.vala b/libraries/libIvy/Extractor.vala
new file mode 100644
index 00000000..cb939567
--- /dev/null
+++ b/libraries/libIvy/Extractor.vala
@@ -0,0 +1,422 @@
+/*
+ * Copyright (C) 2014 PerfectCarl - https://github.com/PerfectCarl/vala-stacktrace
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Ivy {
+
+ /**
+ * Extracts frames and builds a {@link Stacktrace}
+ *
+ */
+ public class Extractor {
+
+ private bool show_debug_frames = false;
+
+ private string func = "";
+ private string file_path = "";
+ private string short_file_path = "";
+ private string l = "";
+ private string file_line = "";
+ private string func_line = "";
+ private string lib_address ="";
+
+ private static Gee.List<string> libraries_with_no_info = new Gee.ArrayList<string>();
+
+ private string get_module_name () {
+ var path = new char[1024];
+ Posix.readlink ("/proc/self/exe", path);
+ string result = (string) path;
+ return result;
+ }
+
+ // TODO CARL convert this piece of code to vala conventions
+ private static string get_relative_path (string p_fullDestinationPath, string p_startPath) {
+
+ string[] l_startPathParts = p_startPath.split ("/");
+ string[] l_destinationPathParts = p_fullDestinationPath.split ("/");
+
+ int l_sameCounter = 0;
+ while ((l_sameCounter < l_startPathParts.length) &&
+ (l_sameCounter < l_destinationPathParts.length) &&
+ l_startPathParts[l_sameCounter] == l_destinationPathParts[l_sameCounter]) {
+ l_sameCounter++;
+ }
+
+ if (l_sameCounter == 0) {
+ return p_fullDestinationPath; // There is no relative link.
+ }
+
+ StringBuilder l_builder = new StringBuilder ();
+ for (int i = l_sameCounter ; i < l_startPathParts.length ; i++) {
+ l_builder.append ("../");
+ }
+
+ for (int i = l_sameCounter ; i < l_destinationPathParts.length ; i++) {
+ l_builder.append (l_destinationPathParts[i] + "/");
+ }
+
+ // CARL l_builder.Length--;
+ // Remove the last /
+ var result = l_builder.str;
+ result = result.substring (0, result.length - 1);
+ return result;
+ }
+
+ private string extract_short_file_path (string file_path) {
+ var path = Environment.get_current_dir ();
+ /*var i = file_path.index_of ( path );
+ if( i>=0 )
+ return file_path.substring ( path.length, file_path.length - path.length );
+ return file_path; */
+ var result = get_relative_path (file_path, path);
+ return result;
+ }
+
+ // input : '/home/cran/Documents/Projects/elementary/noise/instant-beta/build/core/libnoise-core.so.0(noise_job_repository_create_job+0x309) [0x7ff60a021e69]'
+ // ouput: 0x309
+ private int extract_base_address (string line) {
+ int result = 0;
+ var start = line.last_index_of ("+");
+ if (start >= 0) {
+ var end = line.last_index_of (")");
+ if( end > start ) {
+ var text = line.substring (start+3,end-start-3);
+ text.scanf("%x", &result);
+ }
+ }
+ return result;
+ }
+
+ private void process_info_for_file (string full_line, string str ) {
+ func = "";
+ file_path = "";
+ short_file_path = "";
+ l = "";
+ file_line = "";
+ func_line = "";
+ if (full_line == "")
+ return;
+
+ var lines = full_line.split ("\n");
+
+ if (lines.length > 0)
+ func_line = lines[0];
+
+ if (lines.length > 1)
+ file_line = lines[1];
+ if (file_line == "??:0" || file_line == "??:?")
+ file_line = "";
+ func = extract_function_name (str);
+
+ file_path = "";
+ short_file_path = "";
+ l = "";
+ if (file_line != "") {
+ if (func == "")
+ func = extract_function_name_from_line (func_line);
+ file_path = extract_file_path (file_line);
+ short_file_path = extract_short_file_path (file_path);
+ l = extract_line (file_line);
+ }
+ }
+
+ private void process_info_from_lib (string file_path, string str) {
+ //stdout.printf( "process_info_from_lib('%s', '%s') func: '%s'\n", file_path, str, func);
+ var has_info = true;
+ var addr1_s = "";
+ var lib_addr = "";
+ var cmd2 = "";
+ lib_address ="";
+ lock( libraries_with_no_info)
+ {
+ if( libraries_with_no_info.index_of (file_path) == -1 ){
+ // The library is not on the black list
+ cmd2 = "nm %s".printf(file_path);
+
+ addr1_s = execute_command_sync_get_output (cmd2);
+ if( addr1_s == null || addr1_s == "" )
+ {
+ // stdout.printf( "ADDED TO NO INFO: '%s'\n", file_path);
+ libraries_with_no_info.add (file_path);
+ has_info = false;
+
+ }
+ }
+ else
+ has_info = false;
+ }
+ if( has_info && func != "" )
+ {
+ MatchInfo info;
+ var expression = "\\n[^ ]* T "+func;
+ try {
+
+ Regex regex = new Regex (expression);
+ int count = 0;
+ string matches = "";
+ if( regex.match (addr1_s, 0, out info) )
+ {
+ while( info.matches() ){
+ var lll = info.fetch(0);
+ // stdout.printf ( "lll '%s'\n", lll );
+ lib_addr = lll.substring(0, lll.index_of(" "));
+ matches += lib_addr + "\n";
+ info.next();
+ count++;
+ }
+ if( count >1 )
+ {
+ stdout.printf (" XX %d matches for '%s'. Command: '%s'. Matches: '%s'\n", count, func, cmd2, matches);
+ }
+ // stdout.printf (" YY %d matches for '%s'. Command: '%s'. Matches: '%s'\n", count, func, cmd2, matches);
+ }
+
+ } catch (RegexError e)
+ {
+ critical( "Error while processing regex '%s. Err: '%s", expression, e.message );
+ }
+ //stdout.printf ("addr1_s %s\n", addr1_s);
+ int addr1 = 0;
+ lib_addr.scanf("%x", &addr1);
+ if( addr1 != 0 ) {
+ int addr2 = extract_base_address (str);
+ string addr3 = "%#08x".printf (addr1+addr2);
+ lib_address = addr3;
+ // stdout.printf ("lib_address : %s\n", lib_address);
+ var new_full_line = process_line (file_path, addr3);
+ //stdout.printf ("STR : %s\n", str);
+ // stdout.printf ("AD1 : %s\n", addr1_s);
+ //stdout.printf ("AD2 : %#08x\n", addr2);
+ //stdout.printf ("AD3 : %s\n", addr3);
+ //stdout.printf ("LIB : %s\n", file_path);
+ //stdout.printf ("RES : %s\n", new_full_line);
+
+ process_info_for_file (new_full_line, str );
+ }
+ else
+ stdout.printf ("NULL\n");
+ }
+
+ }
+
+ private string extract_function_name (string line) {
+ if (line == "")
+ return "";
+ var start = line.index_of ("(");
+ if (start >= 0) {
+ var end = line.index_of ("+", start);
+ if (end >= 0) {
+ var result = line.substring (start + 1, end - start - 1);
+ return result.strip ();
+ }
+ }
+ return "";
+ }
+
+ private string extract_function_name_from_line (string line) {
+ return line.strip ();
+ }
+
+ private string extract_file_path_from (string str) {
+ if (str == "")
+ return "";
+ /*if( str.index_of("??") >= 0)
+ //result = result.substring (4, line.length - 4 );
+ stdout.printf ("ERR2?? : %s\n", str ) ; */
+ var start = str.index_of ("(");
+ if (start >= 0) {
+ return str.substring (0, start).strip ();
+ }
+ return str.strip ();
+ }
+
+ private string extract_file_path (string line) {
+ var result = line;
+ if (result == "")
+ return "";
+ if (result == "??:0??:0")
+ return "";
+ // For some reason, the file name can starts with ??:0
+ if (result.has_prefix ("??:0"))
+ result = result.substring (4, line.length - 4);
+ // stdout.printf ("ERR1?? : %s\n", line );
+ var start = result.index_of (":");
+ if (start >= 0) {
+ result = result.substring (0, start);
+ return result.strip ();
+ }
+ return "";
+ }
+
+ private static string extract_line (string line) {
+ var result = line;
+ if (result == "")
+ return "";
+ if (result.has_prefix ("??:0"))
+ result = result.substring (4, line.length - 4);
+ var start = result.index_of (":");
+ if (start >= 0) {
+ result = result.substring (start + 1, line.length - start - 1);
+ var end = result.index_of ("(");
+ if (end >= 0) {
+ result = result.substring (0, end);
+ }
+ return result.strip ();
+ }
+ return "";
+ }
+
+ private string extract_address (string line) {
+ if (line == "")
+ return "";
+ var start = line.index_of ("[");
+ if (start >= 0) {
+ var end = line.index_of ("]", start);
+ if (end >= 0) {
+ var result = line.substring (start + 1, end - start - 1);
+ return result.strip ();
+ }
+ }
+ return "";
+ }
+
+ private string execute_command_sync_get_output (string cmd) {
+ try {
+ int exitCode;
+ string std_out;
+ string std_err;
+ Process.spawn_command_line_sync (cmd, out std_out, out std_err, out exitCode);
+ if( exitCode == 0)
+ return std_out;
+ else
+ print ("Error while executing '%s'. Exit code '%d'\n".printf(cmd, exitCode));
+
+ }
+ catch (Error e) {
+ print ("Error while executing '%s': %s\n".printf(cmd,e.message));
+ }
+ return "";
+ }
+
+ // Poor's man demangler. libunwind is another dep
+ // TODO : Optimize this
+ // module : app
+ // address : 0x007f80
+ // output : /home/cran/Projects/noise/noise-perf-instant-search/tests/errors.vala:87
+ private string process_line (string module, string address) {
+ var cmd = "addr2line -f -e %s %s".printf (module, address);
+ var result = execute_command_sync_get_output (cmd);
+ //stdout.printf( "CMD %s\n", cmd);
+ return result;
+ }
+
+ /**
+ * Populates the stacktrace with frames
+ *
+ * The frames are extracted from ``Linux.Backtrace`` and enriched
+ * via calls to unix tools ``nm`` and ``addr2line``.
+ *
+ * ''Warning:'' because this methods calls synchronously other applications (nm and addr2line), it
+ * can have a significant impact on performance.
+ *
+ * @param trace the stacktrace
+ */
+ public void create_stacktrace (Stacktrace trace) {
+ int frame_count = 100;
+ int skipped_frames_count = 5;
+ // Stacktrace not due to a crash
+ if (trace.is_custom)
+ skipped_frames_count = 3;
+
+ void *[] array = new void *[frame_count];
+
+ trace.frames.clear ();
+ trace.first_vala = null;
+ trace.max_file_name_length = 0;
+ trace.is_all_function_name_blank = true;
+ trace.is_all_file_name_blank = true;
+
+ // TODO fix that > 0.26
+ #if VALA_0_26 || VALA_0_28
+ var size = Linux.Backtrace.@get (array);
+ var strings = Linux.Backtrace.symbols (array);
+ #else
+ int size = Linux.backtrace (array, frame_count);
+ unowned string[] strings = Linux.backtrace_symbols (array, size);
+ // Needed because of some weird bug
+ strings.length = size;
+ #endif
+
+ int[] addresses = (int[])array;
+ string module = get_module_name ();
+ // First ones are the handler
+ for (int i = skipped_frames_count ; i < size ; i++) {
+ int address = addresses[i];
+ string str = strings[i];
+ var addr = extract_address (str);
+ lib_address ="";
+ //stdout.printf ("9 '%s'. Addr: '%s' \n", func, addr);
+ var full_line = process_line (module, addr);
+ //stdout.printf ("10 '%s'\n", func);
+ if( full_line == "" ) {
+ // Happens when the process memory is going up and up
+ // Likely a memory leak
+ // Like in the test suite for echo
+ // ** (/home/cran/Documents/Projects/i-hate-farms/ide/echo/build/test:2859):
+ // CRITICAL **: vala_data_type_copy: assertion 'self != NULL' failed
+ // Error while executing 'addr2line -f -e /home/cran/Documents/Projects/i-
+ // hate-farms/ide/echo/build/test 0x2afe3b5beb32': Failed to fork (Cannot allocate memory)
+
+ print ("Something went very wrong. Your stacktrace cannot be displayed\n");
+ break;
+ }
+ process_info_for_file( full_line, str);
+ //stdout.printf ("11 '%s'\n", func);
+ if (file_line == "") {
+ file_path = extract_file_path_from (str);
+
+ }
+ //stdout.printf ("12 '%s'\n", func);
+ // The file name may ends with .so or .so.0 ...
+ if( ".so" in file_path ) {
+ process_info_from_lib (file_path, str);
+ }
+ //stdout.printf ("14 '%s'\n", func);
+ if( show_debug_frames )
+ {
+ stdout.printf ("\nFrame %d \n--------\n . addr: [%s]\n . full_line: '%s'\n . file_line: '%s'\n . func_line: '%s'\n . str : '%s'\n . func: '%s'\n . file: '%s'\n . line: '%s'\n . address: '%#08x'\n . lib_address: '%s'\n",
+ i, addr, full_line, file_line, func_line, str, func, file_path, l, address, lib_address);
+ }
+ if (func != "" && file_path.has_suffix (".vala") && trace.is_all_function_name_blank)
+ trace.is_all_function_name_blank = false;
+
+ if (short_file_path != "" && trace.is_all_file_name_blank)
+ trace.is_all_file_name_blank = false;
+
+ var line_number = extract_line (file_line);
+ var frame = new Frame (addr, file_line, func, file_path, short_file_path, line_number);
+
+ if (trace.first_vala == null && file_path.has_suffix (".vala"))
+ trace.first_vala = frame;
+
+ if (short_file_path.length > trace.max_file_name_length)
+ trace.max_file_name_length = short_file_path.length;
+ if (l.length > trace.max_line_number_length)
+ trace.max_line_number_length = l.length;
+ trace.frames.add (frame);
+ }
+ }
+ }
+}
diff --git a/libraries/libIvy/Frame.vala b/libraries/libIvy/Frame.vala
new file mode 100644
index 00000000..383576b1
--- /dev/null
+++ b/libraries/libIvy/Frame.vala
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2014 PerfectCarl - https://github.com/PerfectCarl/vala-stacktrace
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Ivy {
+
+ /**
+ * A part of a stacktrace
+ *
+ * This class represent on instance of a frame, ie a particular location
+ * in a binary (application or library) on the system called by the application
+ *
+ * ''Note:'' frames from system libraries without code information available are
+ * not displayed by default. See {@link Stacktrace.hide_installed_libraries} for how to
+ * display them.
+ **/
+ public class Frame {
+
+ /**
+ * Address of the stack in hexadecimal
+ *
+ * Ex: ``0x309``
+ **/
+ public string address { get;private set;default = "";}
+
+ /**
+ * Line of code of the frame
+ *
+ * Can point to C code, Vala code or be blank if
+ * no symbol is available (or if -rdynamic has not been set during the
+ * compilation of the binary)
+ *
+ * Ex:
+ **/
+ public string line { get;private set;default = "";}
+
+ /**
+ * Line number in the code file.
+ *
+ * May be blank if no code information is available
+ *
+ * Ex: ``25``
+ **/
+ public string line_number { get;private set;default = "";}
+
+ /**
+ * Full path to the code file as it was stored on the building machine
+ *
+ * Returns the path to the installed binary if no code information is available
+ *
+ * Ex: ``/home/cran/Documents/Projects/i-hate-farms/stacktrace/samples/error_sigsegv.vala``
+ *
+ * Ex: ``/lib/x86_64-linux-gnu/libc.so.6`` if no code information is available
+ **/
+ public string file_path { get;private set;default = "";}
+
+ /**
+ * Path the code file relative to the current path
+ *
+ * Returns the path to the installed binary if no code information is available
+ *
+ * Ex: ``/stuff/to/stuff/``
+ **/
+ public string file_short_path { get;private set;default = "";}
+
+ /**
+ * C function name
+ *
+ * Because only the C function name is avaialable,
+ * the name mixes the vala class and vala method name (by default separated by ``_``).
+ *
+ * For more information about getting full vala names see [[https://bugzilla.gnome.org/show_bug.cgi?id=738784|vala bug #738784]]
+ *
+ * Ex: ``namespace_someclass_method``
+ **/
+ public string function { get;private set;default = "";}
+
+ public Frame (string address, string line, string function, string file_path, string file_short_path, string line_number) {
+ this._address = address;
+ this._line = line;
+
+ this._file_path = file_path;
+ this._file_short_path = file_short_path;
+ this._function = function;
+ this.line_number = line_number;
+ }
+
+ }
+
+}
diff --git a/libraries/libIvy/Printer.vala b/libraries/libIvy/Printer.vala
new file mode 100644
index 00000000..84d7812b
--- /dev/null
+++ b/libraries/libIvy/Printer.vala
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2014 PerfectCarl - https://github.com/PerfectCarl/vala-stacktrace
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Ivy {
+
+ /**
+ * Prints the stacktrace to ``stdout`` in colors
+ *
+ */
+ public class Printer {
+
+ private Color background_color = Color.BLACK;
+ private int title_length = 0;
+
+ private Stacktrace stacktrace;
+
+ private string get_reset_code () {
+ // return get_color_code (Style.RESET, Colors.WHITE, Colors.BLACK);
+ return "\x1b[0m";
+ }
+
+ private string get_reset_style () {
+ return get_color_code (Style.DIM, stacktrace.highlight_color, background_color);
+ }
+
+ private string get_color_code (Style attr, Color fg, Color bg = background_color) {
+ /* Command is the control command to the terminal */
+ if (bg == Color.BLACK)
+ return "%c[%d;%dm".printf (0x1B, (int) attr, (int) fg + 30);
+ else
+ return "%c[%d;%d;%dm".printf (0x1B, (int) attr, (int) fg + 30, (int) bg + 40);
+ }
+
+ private string get_signal_name () {
+ return stacktrace.sig.to_string ();
+ }
+
+ private string get_highlight_code () {
+ return get_color_code (Style.BRIGHT, stacktrace.highlight_color);
+ }
+
+ private string get_printable_function (Frame frame, int padding = 0) {
+ var result = "";
+ var is_unknown = false;
+ if (frame.function == "") {
+ result = "<unknown> " + frame.address;
+ is_unknown = true;
+ } else {
+ var s = "";
+ int count = padding - get_signal_name ().length;
+ if (padding != 0 && count > 0)
+ s = string.nfill (count, ' ');
+ result = "'" + frame.function + "'" + s;
+ }
+ if (is_unknown)
+ return result + get_reset_code ();
+ else
+ return get_highlight_code () + result + get_reset_code ();
+ }
+
+ private string get_printable_line_number (Frame frame, bool pad = true) {
+ var path = frame.line_number;
+ var max_line_number_length = stacktrace.max_line_number_length;
+ var result = "";
+ var color = get_highlight_code ();
+ if (path.length >= max_line_number_length || !pad)
+ result = color + path + get_reset_style ();
+ else {
+ result = color + path + get_reset_style ();
+ result = string.nfill (max_line_number_length - path.length, ' ') + result;
+ }
+ return result;
+ }
+
+ private string get_printable_file_short_path (Frame frame, bool pad = true) {
+ var path = frame.file_short_path;
+ var max_file_name_length = stacktrace.max_file_name_length;
+ var result = "";
+ var color = get_highlight_code ();
+ if (path.length >= max_file_name_length || !pad)
+ result = color + path + get_reset_style ();
+ else {
+ result = color + path + get_reset_style ();
+ result = result + string.nfill (max_file_name_length - path.length, ' ');
+ }
+ return result;
+ }
+
+ private string get_printable_title () {
+ var c = get_color_code (Style.DIM, stacktrace.highlight_color, background_color);
+ var color = get_highlight_code ();
+
+ var result = "";
+
+ if( stacktrace.is_custom)
+ result = "%sA function was called in %s".printf (
+ c,
+ get_reset_style ());
+ else
+ result = "%sAn error occured %s(%s)%s".printf (
+ c,
+ color,
+ get_signal_name (),
+ get_reset_style ());
+
+ title_length = get_signal_name ().length;
+ return result;
+ }
+
+ private string get_reason () {
+ // var c = get_reset_code();
+ var sig = stacktrace.sig;
+
+ var color = get_highlight_code ();
+ if (sig == ProcessSignal.TRAP) {
+ return "The reason is likely %san uncaught error%s".printf (
+ color, get_reset_code ());
+ }
+ if (sig == ProcessSignal.ABRT) {
+ return "The reason is likely %sa failed assertion (assert...)%s".printf (
+ color, get_reset_code ());
+ }
+ if (sig == ProcessSignal.SEGV) {
+ return "The reason is likely %sa null reference being used%s".printf (
+ color, get_reset_code ());
+ }
+ return "Unknown reason";
+ }
+
+ /**
+ * Print the stacktrace to ``stdout``
+ *
+ * @param trace the stacktrace
+ *
+ */
+ public virtual void print (Stacktrace trace) {
+ this.stacktrace = trace;
+ background_color = stacktrace.error_background;
+ var header = "%s%s\n".printf (get_printable_title (),
+ get_reset_code ());
+ var first_vala = trace.first_vala;
+
+ if (trace.first_vala != null) {
+ header = "%s in %s, line %s in %s\n".printf (
+ get_printable_title (),
+ get_printable_file_short_path (first_vala, false),
+ get_printable_line_number (first_vala, false),
+ get_printable_function (first_vala) + get_reset_code ());
+ title_length += first_vala.line_number.length +
+ first_vala.function.length +
+ first_vala.file_short_path.length;
+ }
+ stdout.printf (header);
+ background_color = Color.BLACK;
+ if( !stacktrace.is_custom) {
+ var reason = get_reason ();
+ stdout.printf (" %s.\n", reason);
+ }
+ var is_all_file_name_blank = stacktrace.is_all_file_name_blank;
+
+ // Has the user forgot to compile with -g -X -rdynamic flag ?
+ if (is_all_file_name_blank) {
+ var advice = " %sNote%s: no file path and line numbers can be retrieved. Are you sure %syou added -g -X -rdynamic%s to valac command line?\n";
+ var color = get_highlight_code ();
+ stdout.printf (advice, color, get_reset_code (), color, get_reset_code ());
+ }
+
+ // Has the user forgot to compile with rdynamic flag ?
+ if (stacktrace.is_all_function_name_blank && !is_all_file_name_blank) {
+ var advice = " %sNote%s: no vala function name can be retrieved. Are you sure %syou added -X -rdynamic%s to valac command line?\n";
+ var color = get_highlight_code ();
+ stdout.printf (advice, color, get_reset_code (), color, get_reset_code ());
+ }
+
+ stdout.printf ("\n");
+ int i = 1;
+ bool has_displayed_first_vala = false;
+ foreach (var frame in trace.frames) {
+ var show_frame = frame.function != "" || frame.file_path.has_suffix (".vala") || frame.file_path.has_suffix (".c");
+ if (Stacktrace.hide_installed_libraries && has_displayed_first_vala)
+ show_frame = show_frame && frame.file_short_path != "";
+
+ // Ignore glib tracing code if displayed before the first vala frame
+ if ((frame.function == "g_logv" || frame.function == "g_log") && !has_displayed_first_vala)
+ show_frame = false;
+ if (show_frame) {
+ // #2 ./OtherModule.c line 80 in 'other_module_do_it'
+ // at /home/cran/Projects/noise/noise-perf-instant-search/tests/errors/module/OtherModule.vala:10
+ var str = " %s #%d %s line %s in %s\n";
+ background_color = Color.BLACK;
+ var lead = " ";
+ var function_padding = 0;
+ if (frame == first_vala) {
+ has_displayed_first_vala = true;
+ lead = "*";
+ background_color = stacktrace.error_background;
+ function_padding = 22;
+ }
+ var l_number = "";
+ if (frame.line_number == "") {
+ str = " %s #%d <unknown> %s in %s\n";
+ var func_name = get_printable_function (frame);
+ var fill_len = int.max (stacktrace.max_file_name_length + stacktrace.max_line_number_length - 1, 0);
+ str = str.printf (
+ lead,
+ i,
+ string.nfill (fill_len, ' '),
+ func_name);
+ } else {
+ str = str.printf (
+ lead,
+ i,
+ get_printable_file_short_path (frame),
+ get_printable_line_number (frame),
+ get_printable_function (frame, function_padding));
+ l_number = ":" + frame.line_number;
+ }
+ stdout.printf (str);
+ str = " at %s%s\n".printf (
+ frame.file_path, l_number);
+ stdout.printf (str);
+
+ i++;
+ }
+ }
+ }
+
+ }
+}
diff --git a/libraries/libIvy/Stacktrace.vala b/libraries/libIvy/Stacktrace.vala
new file mode 100644
index 00000000..1bd78ff1
--- /dev/null
+++ b/libraries/libIvy/Stacktrace.vala
@@ -0,0 +1,401 @@
+/*
+ * Copyright (C) 2014 PerfectCarl - https://github.com/PerfectCarl/vala-stacktrace
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /**
+ * Provides services to display vala stacktraces
+ */
+namespace Ivy {
+
+ internal enum Style {
+ RESET = 0,
+ BRIGHT = 1,
+ DIM = 2,
+ UNDERLINE = 3,
+ BLINK = 4,
+ REVERSE = 7,
+ HIDDEN = 8
+ }
+
+ /**
+ * Defines how Unix signals are processed
+ */
+ public enum CriticalHandler {
+ /**
+ * Unix signals are ignored
+ */
+ IGNORE,
+ /**
+ * When a signal is intercepted, a stacktrace is displayed
+ * to ``stdout`` and the execution of the application is
+ * resumed
+ */
+ PRINT_STACKTRACE,
+ /**
+ * When a signal is intercepted, a stacktrace is displayed
+ * to ``stdout`` and the application is stopped
+ */
+ CRASH
+ }
+
+ /**
+ * Colors used for displaying stacktraces
+ */
+ public enum Color {
+ BLACK = 0,
+ RED = 1,
+ GREEN = 2,
+ YELLOW = 3,
+ BLUE = 4,
+ MAGENTA = 5,
+ CYAN = 6,
+ WHITE = 7
+ }
+
+ /**
+ * A complete execution stacktrace
+ *
+ * Holds a collection of {@link Frame} and the basic methods to intercept Unix signals
+ * and prints the complete stacktrace to ``stdout`` in colors.
+ *
+ * For more information, refer to the [[https://github.com/I-hate-farms/stacktrace|official website]].
+ *
+ * Here's a sample of a printed stacktrace:
+ * {{{
+ * An error occured (SIGSEGV) in samples/vala_file.vala, line 21 in 'this_will_crash_harder'
+ * The reason is likely a null reference being used.
+ *
+ * #1 <unknown> in 'strlen'
+ * at /lib/x86_64-linux-gnu/libc.so.6
+ * * #2 samples/vala_file.vala line 21 in 'this_will_crash_harder'
+ * at /home/cran/Documents/Projects/i-hate-farms/stacktrace/samples/vala_file.vala:21
+ * #3 samples/module/OtherModule.vala line 11 in 'other_module_do_it'
+ * at /home/cran/Documents/Projects/i-hate-farms/stacktrace/samples/module/OtherModule.vala:11
+ * #4 samples/error_sigsegv.vala line 19 in 'namespace_someclass_exec'
+ * at /home/cran/Documents/Projects/i-hate-farms/stacktrace/samples/error_sigsegv.vala:19
+ * #5 samples/error_sigsegv.vala line 29 in 'this_will_crash'
+ * at /home/cran/Documents/Projects/i-hate-farms/stacktrace/samples/error_sigsegv.vala:29
+ * #6 samples/error_sigsegv.vala line 39 in '_vala_main'
+ * at /home/cran/Documents/Projects/i-hate-farms/stacktrace/samples/error_sigsegv.vala:39
+ * #7 error_sigsegv.vala.c line 421 in 'main'
+ * at /home/cran/Documents/Projects/i-hate-farms/stacktrace/error_sigsegv.vala.c:421
+ * #8 <unknown> in '__libc_start_main'
+ * at /lib/x86_64-linux-gnu/libc.so.6
+ * }}}
+ */
+ public class Stacktrace {
+
+ internal Frame first_vala = null;
+
+ internal int max_file_name_length = 0;
+
+ internal int max_line_number_length = 0;
+
+ internal bool is_all_function_name_blank = true;
+
+ internal bool is_all_file_name_blank = true;
+
+ private Gee.List<Frame> _frames = new Gee.ArrayList<Frame>();
+
+ /**
+ * Unix signal being intercepted
+ *
+ */
+ public ProcessSignal sig;
+
+ /**
+ * Enables the Unix signals interception
+ *
+ * Setting it to false and preventing signals interception and the collection
+ * of the complete stacktrace (that might a significant effect on performance)
+ * is useful when the application uses a library that emits a ``SIGTRAP``
+ * signal for unknown reasons.
+ *
+ * Such a case would cripple the application performance and clutter the
+ * ``stdout`` ouput for no benefit.
+ *
+ * Default is ``true``
+ */
+ public static bool enabled { get;set;default = true;}
+
+ /**
+ * Hides frames located in external system libraries (like ``libgc``) without
+ * code information
+ *
+ * * Default is ``true``
+ *
+ * Before
+ * {{{
+ * An error occured (SIGTRAP) in ../src/Database/Core/QueryResult.vala, line 26 in 'app_center_core_query_result_finalize'
+ * The reason is likely an uncaught error.
+ *
+ * #1 <unknown> in 'g_signal_handlers_disconnect_matched'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * * #2 ../src/Database/Core/QueryResult.vala line 26 in 'app_center_core_query_result_finalize'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Database/Core/QueryResult.vala:26
+ * #3 <unknown> in 'g_object_unref'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #4 ../src/Database/Core/Dao.vala line 88 in 'app_center_core_dao_insert'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Database/Core/Dao.vala:88
+ * #5 ../src/Database/PackageKitSource.vala line 18 in 'app_center_core_package_kit_source_fetch'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Database/PackageKitSource.vala:18
+ * #6 ../src/MainPanel.vala line 68 in '__lambda19_'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/MainPanel.vala:68
+ * #7 src/MainPanel.c line 297 in '___lambda19__app_center_views_browse_view_show_app_info'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/MainPanel.c:297
+ * #8 <unknown> in 'g_cclosure_marshal_VOID__STRINGv'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #9 <unknown> in 'g_signal_emit_valist'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #10 <unknown> in 'g_signal_emit_by_name'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #11 src/BrowseView.c line 871 in '__lambda16_'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/BrowseView.c:871
+ * #12 src/BrowseView.c line 878 in '___lambda16__gtk_button_clicked'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/BrowseView.c:878
+ * #13 <unknown> in 'g_signal_emit_valist'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #14 <unknown> in 'g_signal_emit'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #15 <unknown> in 'g_closure_invoke'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #16 <unknown> in 'g_signal_emit_valist'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #17 <unknown> in 'g_signal_emit'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #18 <unknown> in 'ffi_call_unix64'
+ * at /usr/lib/x86_64-linux-gnu/libffi.so.6
+ * #19 <unknown> in 'ffi_call'
+ * at /usr/lib/x86_64-linux-gnu/libffi.so.6
+ * #20 <unknown> in 'g_cclosure_marshal_generic_va'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #21 <unknown> in 'g_signal_emit_valist'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #22 <unknown> in 'g_signal_emit'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #23 <unknown> in 'g_cclosure_marshal_VOID__BOXEDv'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #24 <unknown> in 'g_signal_emit_valist'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #25 <unknown> in 'g_signal_emit'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #26 <unknown> in 'gtk_event_controller_handle_event'
+ * at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
+ * #27 <unknown> in 'g_signal_emit_valist'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #28 <unknown> in 'g_signal_emit'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * #29 <unknown> in 'gtk_main_do_event'
+ * at /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
+ * #30 <unknown> in 'g_main_context_dispatch'
+ * at /lib/x86_64-linux-gnu/libglib-2.0.so.0
+ * #31 <unknown> in 'g_main_context_iteration'
+ * at /lib/x86_64-linux-gnu/libglib-2.0.so.0
+ * #32 <unknown> in 'g_application_run'
+ * at /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
+ * #33 <unknown> in 'granite_application_run'
+ * at /usr/lib/x86_64-linux-gnu/libgranite.so.2
+ * #34 ../src/Application.vala line 54 in 'app_center_main'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Application.vala:54
+ * #35 src/Application.c line 296 in 'main'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/Application.c:296
+ * #36 <unknown> in '__libc_start_main'
+ * at /lib/x86_64-linux-gnu/libc.so.6
+ *
+ * }}}
+ *
+ * After :
+ * {{{
+ * An error occured (SIGTRAP) in ../src/Database/Core/QueryResult.vala, line 26 in 'app_center_core_query_result_finalize'
+ * The reason is likely an uncaught error.
+ *
+ * #1 <unknown> in 'g_signal_handlers_disconnect_matched'
+ * at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
+ * * #2 ../src/Database/Core/QueryResult.vala line 26 in 'app_center_core_query_result_finalize'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Database/Core/QueryResult.vala:26
+ * #3 ../src/Database/Core/Dao.vala line 88 in 'app_center_core_dao_insert'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Database/Core/Dao.vala:88
+ * #4 ../src/Database/PackageKitSource.vala line 18 in 'app_center_core_package_kit_source_fetch'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Database/PackageKitSource.vala:18
+ * #5 ../src/MainPanel.vala line 68 in '__lambda19_'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/MainPanel.vala:68
+ * #6 src/MainPanel.c line 297 in '___lambda19__app_center_views_browse_view_show_app_info'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/MainPanel.c:297
+ * #7 src/BrowseView.c line 871 in '__lambda16_'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/BrowseView.c:871
+ * #8 src/BrowseView.c line 878 in '___lambda16__gtk_button_clicked'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/BrowseView.c:878
+ * #9 ../src/Application.vala line 55 in 'app_center_main'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/src/Application.vala:55
+ * #10 src/Application.c line 304 in 'main'
+ * at /home/cran/Documents/Projects/i-hate-farms/app/exocron/build/src/Application.c:304
+ * }}}
+ */
+ public static bool hide_installed_libraries { get;set;default = true;}
+
+ /**
+ * Sets the default higlighted text color for stacktrace that are created
+ * via Unix signals interception
+ *
+ * Default is ``Color.WHITE``
+ */
+ public static Color default_highlight_color { get;set;default = Color.WHITE;}
+
+ /**
+ * Sets the default background color for stacktrace that are created
+ * via Unix signals interception
+ *
+ * Default is ``Color.RED``
+ */
+ public static Color default_error_background { get;set;default = Color.RED;}
+
+ /**
+ * Sets the stacktrace higlighted text color when printed on ``stdout``
+ *
+ * Default is ``Color.WHITE``
+ */
+ public Color highlight_color { get;set;default = Color.WHITE;}
+
+ /**
+ * Sets the stacktrace background color when printed on ``stdout``
+ *
+ * Default is ``Color.RED``
+ */
+ public Color error_background { get;set;default = Color.RED;}
+
+ /**
+ * Collection of frames
+ *
+ */
+ public Gee.List<Frame> frames {
+ get {
+ return _frames;
+ }
+ }
+
+ private Printer printer = new Printer ();
+ private Extractor extractor = new Extractor ();
+
+ public Stacktrace (GLib.ProcessSignal sig = GLib.ProcessSignal.TTOU) {
+ this.sig = sig;
+ // The stacktrace is used likely to understand the inner
+ // working of the app so we displays everything.
+ if (is_custom) {
+ hide_installed_libraries = false;
+ error_background = Color.BLUE;
+ } else {
+ error_background = default_error_background;
+ highlight_color = default_highlight_color;
+ }
+ extractor.create_stacktrace (this);
+ }
+
+ /**
+ * Returns true if the stacktrace is "custom"
+ *
+ * A custom stacktrace has been created via code as
+ * opposed to created via Unix signal interception.
+ *
+ * Custom stacktrace are displayed with a different color scheme (default ``Color.GREEN``) that
+ * can be set via {@link highlight_color} and {@link error_background}
+ *
+ * Here's how to create a custom stacktrace:
+ * {{{
+ *
+ * int my_function (string arg) {
+ * var custom_stracktrace = new Stacktrace ();
+ * custom_stracktrace.print ();
+ * return 0;
+ * }
+ * }}}
+ */
+ public bool is_custom {
+ get {
+ return sig == ProcessSignal.TTOU;
+ }
+ }
+
+ /**
+ * Prints the stacktrace to ``stdout`` with colors
+ *
+ */
+ public void print () {
+ printer.print (this);
+ }
+
+ /**
+ * Registers handlers to intercept Unix signals
+ *
+ * Calling ``register_handlers`` is required for the
+ * library to display a stacktrace when the application encounters an error (ie raises a ``SIGABRT``,
+ * a ``SIGSEV`` or a ``SIGTRAP`` signal).
+ *
+ * ''Note:'' calling ``register_handlers`` is not needed to be able to display custom stacktraces. <<BR>>
+ * (See {@link is_custom} for more information about custom stacktraces).
+ *
+ * How to initialize the library so it can intercept Unix signals:
+ * {{{
+ *
+ * static int main (string[] arg) {
+ * Stacktrace.register_handlers ();
+ * // Start your application
+ * ...
+ * return 0;
+ * }
+ * }}}
+ *
+ */
+ public static void register_handlers () {
+ //Log.set_always_fatal (LogLevelFlags.LEVEL_CRITICAL);
+ Log.set_always_fatal (LogLevelFlags.LEVEL_ERROR);
+
+ Process.@signal (ProcessSignal.SEGV, handler);
+ Process.@signal (ProcessSignal.TRAP, handler);
+ if (critical_handling != CriticalHandler.IGNORE)
+ Process.@signal (ProcessSignal.ABRT, handler);
+ }
+
+ /**
+ * Defines how Unix signals are processed
+ *
+ * Default is ``CriticalHandler.PRINT_STACKTRACE``.
+ */
+ public static CriticalHandler critical_handling { get;set;default = CriticalHandler.PRINT_STACKTRACE;}
+
+ /*{
+ set {
+ _critical_handling = value;
+ if( value == CriticalHandler.CRASH )
+ //var variables = Environ.get ();
+ //Environ.set_variable (variables, "G_DEBUG", "fatal-criticals" );
+ Log.set_always_fatal (LogLevelFlags.LEVEL_CRITICAL);
+ }
+ get {
+ }
+
+ }*/
+
+ private static void handler (int sig) {
+ if( !enabled)
+ return;
+ Stacktrace stack = new Stacktrace ((ProcessSignal) sig);
+ stack.print ();
+ if (sig != ProcessSignal.TRAP ||
+ (sig == ProcessSignal.TRAP && critical_handling == CriticalHandler.CRASH))
+ Process.exit (1);
+ }
+
+ }
+}
diff --git a/libraries/libIvy/meson.build b/libraries/libIvy/meson.build
new file mode 100644
index 00000000..c5f3593e
--- /dev/null
+++ b/libraries/libIvy/meson.build
@@ -0,0 +1,16 @@
+ivy_inc = include_directories('.')
+ivy_lib = static_library(
+ 'ivy',
+ [
+ 'Extractor.vala',
+ 'Frame.vala',
+ 'Printer.vala',
+ 'Stacktrace.vala'
+ ],
+ dependencies: [
+ gee,
+ linux,
+ posix,
+ ],
+ vala_vapi: 'ivy.vapi'
+)
diff --git a/libVilistextum/charset.c b/libraries/libVilistextum/charset.c
index 06606512..25c7ba78 100644
--- a/libVilistextum/charset.c
+++ b/libraries/libVilistextum/charset.c
@@ -9,7 +9,8 @@
* 14.10.2001: creation of this file
*
*/
-
+
+#define _POSIX_C_SOURCE 2 /* for popen, pclose */
#include <stdio.h>
#include <string.h>
#include <errno.h>
@@ -25,14 +26,53 @@ char *default_charset = "iso-8859-1";
char iconv_charset[DEF_STR_LEN];
int usr=0;
iconv_t conv;
+char internal_locale[256];
/* ------------------------------------------------ */
+static int suffix(const char * str, const char * suffix)
+{
+ if ( strlen(str) < strlen(suffix) ) return 0;
+ if ( ! strcmp(suffix, str + ( strlen(str) - strlen(suffix) ) ) ) return 1;
+ return 0;
+}
+
+static int utf_8_locale(const char * locale)
+{
+ if (!locale) return 0;
+ return suffix(locale,".utf8") || suffix(locale, ".UTF-8");
+}
+
int init_multibyte()
{
- char *ret;
- ret = setlocale(LC_CTYPE, "");
- if (ret==NULL)
+ char *locale_found;
+ locale_found = setlocale(LC_CTYPE, "");
+
+ if (locale_found == NULL)
+ {
+ FILE *fp = popen("locale -a", "r");
+ if (fp)
+ {
+ while (!feof(fp) && !locale_found)
+ {
+ char buf[256];
+ if (fgets(buf, sizeof(buf), fp) != NULL)
+ {
+ /* remove newline */
+ buf[strlen(buf)-1] = '\0';
+ /* check for a working UTF-8 locale */
+ if (utf_8_locale(buf) &&
+ (locale_found = setlocale(LC_CTYPE, buf)))
+ {
+ strcpy(internal_locale, buf);
+ }
+ }
+ }
+ }
+ }
+
+
+ if (locale_found == NULL)
{
fprintf(stderr, "setlocale failed with: \"\"\n\n");
error = 1;
diff --git a/libVilistextum/charset.h b/libraries/libVilistextum/charset.h
index 37e21d07..37e21d07 100644
--- a/libVilistextum/charset.h
+++ b/libraries/libVilistextum/charset.h
diff --git a/libVilistextum/fileio.c b/libraries/libVilistextum/fileio.c
index b4c6ac5f..322c272d 100644
--- a/libVilistextum/fileio.c
+++ b/libraries/libVilistextum/fileio.c
@@ -29,7 +29,7 @@
FILE *in;
-CHAR* OUTPUT;
+CHAR* OUTPUT = NULL;
CHAR LINEBREAK[1] = L"\n";
size_t currentsize = 0;
size_t outputsize = 0;
@@ -39,18 +39,13 @@ long int count = 0;
void open_files(char *input)
{
- if((in = fmemopen(input, strlen(input), "r"))==0)
+ in = fmemopen(input, strlen(input), "r");
+ if(in == NULL)
{
fprintf(stderr, "Couldn't open input file %s!\n",input);
error = 1;
}
- if(OUTPUT != NULL)
- {
- currentsize = 0;
- free(OUTPUT);
- }
-
outputsize = strlen(input);
OUTPUT = malloc(sizeof(CHAR)*(outputsize+1));
OUTPUT[0]='\0';
@@ -78,9 +73,34 @@ void output_string(CHAR *str)
/* ------------------------------------------------ */
-CHAR* getOutput()
+void cleanup()
{
- return OUTPUT;
+ currentsize = 0;
+ free(OUTPUT);
+ OUTPUT = NULL;
+ fclose(in);
+}
+
+/* ------------------------------------------------ */
+
+char* getOutput(size_t input_length)
+{
+ if(!error)
+ {
+ size_t buffersize = 2*sizeof(char)*input_length;
+ char* buffer = malloc(buffersize);
+ int ret = wcstombs ( buffer, OUTPUT, buffersize );
+ if (ret==buffersize) buffer[buffersize-1]='\0';
+ cleanup();
+ if (ret)
+ return buffer;
+
+ return NULL;
+ }
+
+
+ cleanup();
+ return NULL;
}
/* ------------------------------------------------ */
diff --git a/libVilistextum/fileio.h b/libraries/libVilistextum/fileio.h
index c744f36d..96d2d017 100644
--- a/libVilistextum/fileio.h
+++ b/libraries/libVilistextum/fileio.h
@@ -10,6 +10,6 @@ int get_current_char();
int read_char();
void putback_char(CHAR c);
void quit();
-CHAR* getOutput();
+char* getOutput();
#endif
diff --git a/libVilistextum/html.c b/libraries/libVilistextum/html.c
index bab62cc2..bab62cc2 100644
--- a/libVilistextum/html.c
+++ b/libraries/libVilistextum/html.c
diff --git a/libVilistextum/html.h b/libraries/libVilistextum/html.h
index 68b1b935..68b1b935 100644
--- a/libVilistextum/html.h
+++ b/libraries/libVilistextum/html.h
diff --git a/libVilistextum/html_tag.c b/libraries/libVilistextum/html_tag.c
index c1fce910..c1fce910 100644
--- a/libVilistextum/html_tag.c
+++ b/libraries/libVilistextum/html_tag.c
diff --git a/libVilistextum/html_tag.h b/libraries/libVilistextum/html_tag.h
index 42456144..42456144 100644
--- a/libVilistextum/html_tag.h
+++ b/libraries/libVilistextum/html_tag.h
diff --git a/libVilistextum/latin1.c b/libraries/libVilistextum/latin1.c
index 90b394f2..90b394f2 100644
--- a/libVilistextum/latin1.c
+++ b/libraries/libVilistextum/latin1.c
diff --git a/libVilistextum/latin1.h b/libraries/libVilistextum/latin1.h
index 2b754fae..2b754fae 100644
--- a/libVilistextum/latin1.h
+++ b/libraries/libVilistextum/latin1.h
diff --git a/libVilistextum/lists.c b/libraries/libVilistextum/lists.c
index 6b75d2f8..6b75d2f8 100644
--- a/libVilistextum/lists.c
+++ b/libraries/libVilistextum/lists.c
diff --git a/libVilistextum/lists.h b/libraries/libVilistextum/lists.h
index 2c6041c4..2c6041c4 100644
--- a/libVilistextum/lists.h
+++ b/libraries/libVilistextum/lists.h
diff --git a/libraries/libVilistextum/meson.build b/libraries/libVilistextum/meson.build
new file mode 100644
index 00000000..0f507026
--- /dev/null
+++ b/libraries/libVilistextum/meson.build
@@ -0,0 +1,18 @@
+vilistextum_inc = include_directories('.')
+vilistextum_lib = static_library(
+ 'vilistextum',
+ [
+ 'charset.c',
+ 'fileio.c',
+ 'html.c',
+ 'html_tag.c',
+ 'latin1.c',
+ 'lists.c',
+ 'microsoft.c',
+ 'text.h',
+ 'text.c',
+ 'unicode_entities.c',
+ 'util.c',
+ 'vilistextum.c'
+ ]
+)
diff --git a/libVilistextum/microsoft.c b/libraries/libVilistextum/microsoft.c
index bd493fb7..bd493fb7 100644
--- a/libVilistextum/microsoft.c
+++ b/libraries/libVilistextum/microsoft.c
diff --git a/libVilistextum/microsoft.h b/libraries/libVilistextum/microsoft.h
index 2efe8f51..2efe8f51 100644
--- a/libVilistextum/microsoft.h
+++ b/libraries/libVilistextum/microsoft.h
diff --git a/libVilistextum/multibyte.h b/libraries/libVilistextum/multibyte.h
index f84588e3..f84588e3 100644
--- a/libVilistextum/multibyte.h
+++ b/libraries/libVilistextum/multibyte.h
diff --git a/libVilistextum/text.c b/libraries/libVilistextum/text.c
index dd9c5324..dd9c5324 100644
--- a/libVilistextum/text.c
+++ b/libraries/libVilistextum/text.c
diff --git a/libVilistextum/text.h b/libraries/libVilistextum/text.h
index d772bbf3..d772bbf3 100644
--- a/libVilistextum/text.h
+++ b/libraries/libVilistextum/text.h
diff --git a/libVilistextum/unicode_entities.c b/libraries/libVilistextum/unicode_entities.c
index 31b8441e..31b8441e 100644
--- a/libVilistextum/unicode_entities.c
+++ b/libraries/libVilistextum/unicode_entities.c
diff --git a/libVilistextum/unicode_entities.h b/libraries/libVilistextum/unicode_entities.h
index f6873a57..f6873a57 100644
--- a/libVilistextum/unicode_entities.h
+++ b/libraries/libVilistextum/unicode_entities.h
diff --git a/libVilistextum/util.c b/libraries/libVilistextum/util.c
index 218fecd9..218fecd9 100644
--- a/libVilistextum/util.c
+++ b/libraries/libVilistextum/util.c
diff --git a/libVilistextum/util.h b/libraries/libVilistextum/util.h
index f87b6dcf..f87b6dcf 100644
--- a/libVilistextum/util.h
+++ b/libraries/libVilistextum/util.h
diff --git a/libVilistextum/vilistextum.c b/libraries/libVilistextum/vilistextum.c
index 12f8d6f3..ba2d5259 100644
--- a/libVilistextum/vilistextum.c
+++ b/libraries/libVilistextum/vilistextum.c
@@ -13,16 +13,18 @@
#include <stdio.h>
#include <stdlib.h>
+#include <pthread.h>
+
#include "vilistextum.h"
#include "html.h"
#include "fileio.h"
#include "charset.h"
-char* buffer;
-size_t length;
-
/* ------------------------------------------------ */
+// libvilistextum uses globals and isn't thread-safe
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
void set_options()
{
convert_characters = 1;
@@ -43,7 +45,7 @@ char* vilistextum(char* text, int extractText)
if(text == NULL)
return NULL;
- length = strlen(text);
+ pthread_mutex_lock(&mutex);
error = 0;
set_options();
@@ -54,18 +56,7 @@ char* vilistextum(char* text, int extractText)
quit();
}
- if(!error)
- {
- CHAR* output = getOutput();
- size_t buffersize = 2*sizeof(char)*length;
- buffer = malloc(buffersize);
- int ret = wcstombs ( buffer, output, buffersize );
- if (ret==buffersize) buffer[buffersize-1]='\0';
- if (ret)
- return buffer;
- else
- return NULL;
- }
- else
- return NULL;
+ char* output = getOutput(strlen(text));
+ pthread_mutex_unlock(&mutex);
+ return output;
}
diff --git a/libVilistextum/vilistextum.h b/libraries/libVilistextum/vilistextum.h
index 26ab0836..26ab0836 100644
--- a/libVilistextum/vilistextum.h
+++ b/libraries/libVilistextum/vilistextum.h
diff --git a/libgd/gd-notification.c b/libraries/libgd/gd-notification.c
index 81534367..eee71c47 100644
--- a/libgd/gd-notification.c
+++ b/libraries/libgd/gd-notification.c
@@ -75,31 +75,31 @@ enum {
static guint notification_signals[LAST_SIGNAL] = { 0 };
static gboolean gd_notification_draw (GtkWidget *widget,
- cairo_t *cr);
+ cairo_t *cr);
static void gd_notification_get_preferred_width (GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
+ gint *minimum_size,
+ gint *natural_size);
static void gd_notification_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum_height,
- gint *natural_height);
+ gint width,
+ gint *minimum_height,
+ gint *natural_height);
static void gd_notification_get_preferred_height (GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
+ gint *minimum_size,
+ gint *natural_size);
static void gd_notification_get_preferred_width_for_height (GtkWidget *widget,
- gint height,
- gint *minimum_width,
- gint *natural_width);
+ gint height,
+ gint *minimum_width,
+ gint *natural_width);
static void gd_notification_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
+ GtkAllocation *allocation);
static gboolean gd_notification_timeout_cb (gpointer user_data);
static void gd_notification_show (GtkWidget *widget);
static void gd_notification_add (GtkContainer *container,
- GtkWidget *child);
+ GtkWidget *child);
/* signals handlers */
static void gd_notification_close_button_clicked_cb (GtkWidget *widget,
- gpointer user_data);
+ gpointer user_data);
G_DEFINE_TYPE(GdNotification, gd_notification, GTK_TYPE_BIN);
@@ -120,22 +120,22 @@ gd_notification_init (GdNotification *notification)
gtk_widget_set_has_window (GTK_WIDGET (notification), TRUE);
priv = notification->priv =
- G_TYPE_INSTANCE_GET_PRIVATE (notification,
- GD_TYPE_NOTIFICATION,
- GdNotificationPrivate);
+ G_TYPE_INSTANCE_GET_PRIVATE (notification,
+ GD_TYPE_NOTIFICATION,
+ GdNotificationPrivate);
priv->animate_y = 0;
priv->close_button = gtk_button_new ();
gtk_widget_set_parent (priv->close_button, GTK_WIDGET (notification));
gtk_widget_show (priv->close_button);
g_object_set (priv->close_button,
- "relief", GTK_RELIEF_NONE,
- "focus-on-click", FALSE,
- NULL);
+ "relief", GTK_RELIEF_NONE,
+ "focus-on-click", FALSE,
+ NULL);
g_signal_connect (priv->close_button,
- "clicked",
- G_CALLBACK (gd_notification_close_button_clicked_cb),
- notification);
+ "clicked",
+ G_CALLBACK (gd_notification_close_button_clicked_cb),
+ notification);
close_button_image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_BUTTON);
gtk_button_set_image (GTK_BUTTON (notification->priv->close_button), close_button_image);
@@ -154,10 +154,10 @@ gd_notification_finalize (GObject *object)
priv = notification->priv;
if (priv->animate_timeout != 0)
- g_source_remove (priv->animate_timeout);
+ g_source_remove (priv->animate_timeout);
if (priv->timeout_source_id != 0)
- g_source_remove (priv->timeout_source_id);
+ g_source_remove (priv->timeout_source_id);
G_OBJECT_CLASS (gd_notification_parent_class)->finalize (object);
}
@@ -169,16 +169,16 @@ gd_notification_destroy (GtkWidget *widget)
GdNotificationPrivate *priv = notification->priv;
if (!priv->sent_dismissed)
- {
- g_signal_emit (notification, notification_signals[DISMISSED], 0);
- priv->sent_dismissed = TRUE;
- }
+ {
+ g_signal_emit (notification, notification_signals[DISMISSED], 0);
+ priv->sent_dismissed = TRUE;
+ }
if (priv->close_button)
- {
- gtk_widget_unparent (priv->close_button);
- priv->close_button = NULL;
- }
+ {
+ gtk_widget_unparent (priv->close_button);
+ priv->close_button = NULL;
+ }
GTK_WIDGET_CLASS (gd_notification_parent_class)->destroy (widget);
}
@@ -212,24 +212,24 @@ gd_notification_realize (GtkWidget *widget)
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
window = gdk_window_new (gtk_widget_get_parent_window (widget),
- &attributes, attributes_mask);
+ &attributes, attributes_mask);
gtk_widget_set_window (widget, window);
gtk_widget_register_window (widget, window);
attributes.x = 0;
attributes.y = attributes.height + priv->animate_y;
attributes.event_mask = gtk_widget_get_events (widget) |
- GDK_EXPOSURE_MASK |
- GDK_VISIBILITY_NOTIFY_MASK |
- GDK_ENTER_NOTIFY_MASK |
- GDK_LEAVE_NOTIFY_MASK;
+ GDK_EXPOSURE_MASK |
+ GDK_VISIBILITY_NOTIFY_MASK |
+ GDK_ENTER_NOTIFY_MASK |
+ GDK_LEAVE_NOTIFY_MASK;
priv->bin_window = gdk_window_new (window, &attributes, attributes_mask);
gtk_widget_register_window (widget, priv->bin_window);
child = gtk_bin_get_child (bin);
if (child)
- gtk_widget_set_parent_window (child, priv->bin_window);
+ gtk_widget_set_parent_window (child, priv->bin_window);
gtk_widget_set_parent_window (priv->close_button, priv->bin_window);
gdk_window_show (priv->bin_window);
@@ -255,10 +255,10 @@ animation_target (GdNotification *notification)
GtkAllocation allocation;
if (priv->revealed) {
- gtk_widget_get_allocation (GTK_WIDGET (notification), &allocation);
- return allocation.height;
+ gtk_widget_get_allocation (GTK_WIDGET (notification), &allocation);
+ return allocation.height;
} else {
- return 0;
+ return 0;
}
}
@@ -273,26 +273,26 @@ animation_timeout_cb (gpointer user_data)
target = animation_target (notification);
if (priv->animate_y != target) {
- gtk_widget_get_allocation (GTK_WIDGET (notification), &allocation);
+ gtk_widget_get_allocation (GTK_WIDGET (notification), &allocation);
- delta = allocation.height * ANIMATION_STEP / ANIMATION_TIME;
+ delta = allocation.height * ANIMATION_STEP / ANIMATION_TIME;
- if (priv->revealed)
- priv->animate_y += delta;
- else
- priv->animate_y -= delta;
+ if (priv->revealed)
+ priv->animate_y += delta;
+ else
+ priv->animate_y -= delta;
- priv->animate_y = CLAMP (priv->animate_y, 0, allocation.height);
+ priv->animate_y = CLAMP (priv->animate_y, 0, allocation.height);
- if (priv->bin_window != NULL)
- gdk_window_move (priv->bin_window,
- 0,
- -allocation.height + priv->animate_y);
- return G_SOURCE_CONTINUE;
+ if (priv->bin_window != NULL)
+ gdk_window_move (priv->bin_window,
+ 0,
+ -allocation.height + priv->animate_y);
+ return G_SOURCE_CONTINUE;
}
if (priv->dismissed && priv->animate_y == 0)
- gtk_widget_destroy (GTK_WIDGET (notification));
+ gtk_widget_destroy (GTK_WIDGET (notification));
priv->animate_timeout = 0;
return G_SOURCE_REMOVE;
@@ -305,14 +305,14 @@ start_animation (GdNotification *notification)
int target;
if (priv->animate_timeout != 0)
- return; /* Already running */
+ return; /* Already running */
target = animation_target (notification);
if (priv->animate_y != target)
- notification->priv->animate_timeout =
- gdk_threads_add_timeout (ANIMATION_STEP,
- animation_timeout_cb,
- notification);
+ notification->priv->animate_timeout =
+ gdk_threads_add_timeout (ANIMATION_STEP,
+ animation_timeout_cb,
+ notification);
}
static void
@@ -346,16 +346,16 @@ gd_notification_set_property (GObject *object, guint prop_id, const GValue *valu
switch (prop_id) {
case PROP_TIMEOUT:
- gd_notification_set_timeout (notification,
- g_value_get_int (value));
- break;
+ gd_notification_set_timeout (notification,
+ g_value_get_int (value));
+ break;
case PROP_SHOW_CLOSE_BUTTON:
- gd_notification_set_show_close_button (notification,
- g_value_get_boolean (value));
- break;
+ gd_notification_set_show_close_button (notification,
+ g_value_get_boolean (value));
+ break;
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
}
}
@@ -367,23 +367,23 @@ gd_notification_get_property (GObject *object, guint prop_id, GValue *value, GPa
switch (prop_id) {
case PROP_TIMEOUT:
- g_value_set_int (value, notification->priv->timeout);
- break;
+ g_value_set_int (value, notification->priv->timeout);
+ break;
case PROP_SHOW_CLOSE_BUTTON:
- g_value_set_boolean (value,
- notification->priv->show_close_button);
- break;
+ g_value_set_boolean (value,
+ notification->priv->show_close_button);
+ break;
default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
}
}
static void
gd_notification_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
+ gboolean include_internals,
+ GtkCallback callback,
+ gpointer callback_data)
{
GtkBin *bin = GTK_BIN (container);
GdNotification *notification = GD_NOTIFICATION (container);
@@ -392,10 +392,10 @@ gd_notification_forall (GtkContainer *container,
child = gtk_bin_get_child (bin);
if (child)
- (* callback) (child, callback_data);
+ (* callback) (child, callback_data);
if (include_internals)
- (* callback) (priv->close_button, callback_data);
+ (* callback) (priv->close_button, callback_data);
}
static void
@@ -404,10 +404,10 @@ unqueue_autohide (GdNotification *notification)
GdNotificationPrivate *priv = notification->priv;
if (priv->timeout_source_id)
- {
- g_source_remove (priv->timeout_source_id);
- priv->timeout_source_id = 0;
- }
+ {
+ g_source_remove (priv->timeout_source_id);
+ priv->timeout_source_id = 0;
+ }
}
static void
@@ -416,28 +416,28 @@ queue_autohide (GdNotification *notification)
GdNotificationPrivate *priv = notification->priv;
if (priv->timeout_source_id == 0 &&
- priv->timeout != -1)
- priv->timeout_source_id =
- gdk_threads_add_timeout (priv->timeout * 1000,
- gd_notification_timeout_cb,
- notification);
+ priv->timeout != -1)
+ priv->timeout_source_id =
+ gdk_threads_add_timeout (priv->timeout * 1000,
+ gd_notification_timeout_cb,
+ notification);
}
static gboolean
gd_notification_visibility_notify_event (GtkWidget *widget,
- GdkEventVisibility *event)
+ GdkEventVisibility *event)
{
GdNotification *notification = GD_NOTIFICATION (widget);
GdNotificationPrivate *priv = notification->priv;
if (!gtk_widget_get_visible (widget))
- return FALSE;
+ return FALSE;
if (priv->waiting_for_viewable)
- {
- start_animation (notification);
- priv->waiting_for_viewable = FALSE;
- }
+ {
+ start_animation (notification);
+ priv->waiting_for_viewable = FALSE;
+ }
queue_autohide (notification);
@@ -446,32 +446,32 @@ gd_notification_visibility_notify_event (GtkWidget *widget,
static gboolean
gd_notification_enter_notify (GtkWidget *widget,
- GdkEventCrossing *event)
+ GdkEventCrossing *event)
{
GdNotification *notification = GD_NOTIFICATION (widget);
GdNotificationPrivate *priv = notification->priv;
if ((event->window == priv->bin_window) &&
- (event->detail != GDK_NOTIFY_INFERIOR))
- {
- unqueue_autohide (notification);
- }
+ (event->detail != GDK_NOTIFY_INFERIOR))
+ {
+ unqueue_autohide (notification);
+ }
return FALSE;
}
static gboolean
gd_notification_leave_notify (GtkWidget *widget,
- GdkEventCrossing *event)
+ GdkEventCrossing *event)
{
GdNotification *notification = GD_NOTIFICATION (widget);
GdNotificationPrivate *priv = notification->priv;
if ((event->window == priv->bin_window) &&
- (event->detail != GDK_NOTIFY_INFERIOR))
- {
- queue_autohide (notification);
- }
+ (event->detail != GDK_NOTIFY_INFERIOR))
+ {
+ queue_autohide (notification);
+ }
return FALSE;
}
@@ -515,34 +515,34 @@ gd_notification_class_init (GdNotificationClass *klass)
* Since: 0.1
*/
g_object_class_install_property (object_class,
- PROP_TIMEOUT,
- g_param_spec_int("timeout", "timeout",
- "The time it takes to hide the widget, in seconds",
- -1, G_MAXINT, -1,
- GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ PROP_TIMEOUT,
+ g_param_spec_int("timeout", "timeout",
+ "The time it takes to hide the widget, in seconds",
+ -1, G_MAXINT, -1,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
- PROP_SHOW_CLOSE_BUTTON,
- g_param_spec_boolean("show-close-button", "show-close-button",
- "Whether to show a stock close button that dismisses the notification",
- TRUE,
- GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ PROP_SHOW_CLOSE_BUTTON,
+ g_param_spec_boolean("show-close-button", "show-close-button",
+ "Whether to show a stock close button that dismisses the notification",
+ TRUE,
+ GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
notification_signals[DISMISSED] = g_signal_new ("dismissed",
- G_OBJECT_CLASS_TYPE (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GdNotificationClass, dismissed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
+ G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdNotificationClass, dismissed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
g_type_class_add_private (object_class, sizeof (GdNotificationPrivate));
}
static void
get_padding_and_border (GdNotification *notification,
- GtkBorder *border)
+ GtkBorder *border)
{
GtkStyleContext *context;
GtkStateFlags state;
@@ -568,29 +568,29 @@ gd_notification_draw (GtkWidget *widget, cairo_t *cr)
GtkStyleContext *context;
if (gtk_cairo_should_draw_window (cr, priv->bin_window))
- {
- context = gtk_widget_get_style_context (widget);
+ {
+ context = gtk_widget_get_style_context (widget);
- gtk_render_background (context, cr,
- 0, 0,
- gtk_widget_get_allocated_width (widget),
- gtk_widget_get_allocated_height (widget));
- gtk_render_frame (context,cr,
- 0, 0,
- gtk_widget_get_allocated_width (widget),
- gtk_widget_get_allocated_height (widget));
+ gtk_render_background (context, cr,
+ 0, 0,
+ gtk_widget_get_allocated_width (widget),
+ gtk_widget_get_allocated_height (widget));
+ gtk_render_frame (context,cr,
+ 0, 0,
+ gtk_widget_get_allocated_width (widget),
+ gtk_widget_get_allocated_height (widget));
- if (GTK_WIDGET_CLASS (gd_notification_parent_class)->draw)
- GTK_WIDGET_CLASS (gd_notification_parent_class)->draw(widget, cr);
- }
+ if (GTK_WIDGET_CLASS (gd_notification_parent_class)->draw)
+ GTK_WIDGET_CLASS (gd_notification_parent_class)->draw(widget, cr);
+ }
return FALSE;
}
static void
gd_notification_add (GtkContainer *container,
- GtkWidget *child)
+ GtkWidget *child)
{
GtkBin *bin = GTK_BIN (container);
GdNotification *notification = GD_NOTIFICATION (bin);
@@ -622,36 +622,36 @@ gd_notification_get_preferred_width (GtkWidget *widget, gint *minimum_size, gint
child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child))
- {
- gtk_widget_get_preferred_width (child,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
+ {
+ gtk_widget_get_preferred_width (child,
+ &child_min, &child_nat);
+ minimum += child_min;
+ natural += child_nat;
+ }
if (priv->show_close_button)
- {
- gtk_widget_get_preferred_width (priv->close_button,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
+ {
+ gtk_widget_get_preferred_width (priv->close_button,
+ &child_min, &child_nat);
+ minimum += child_min;
+ natural += child_nat;
+ }
minimum += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
natural += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
if (minimum_size)
- *minimum_size = minimum;
+ *minimum_size = minimum;
if (natural_size)
- *natural_size = natural;
+ *natural_size = natural;
}
static void
gd_notification_get_preferred_width_for_height (GtkWidget *widget,
- gint height,
- gint *minimum_width,
- gint *natural_width)
+ gint height,
+ gint *minimum_width,
+ gint *natural_width)
{
GdNotification *notification = GD_NOTIFICATION (widget);
GdNotificationPrivate *priv = notification->priv;
@@ -670,36 +670,36 @@ gd_notification_get_preferred_width_for_height (GtkWidget *widget,
child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child))
- {
- gtk_widget_get_preferred_width_for_height (child, child_height,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
+ {
+ gtk_widget_get_preferred_width_for_height (child, child_height,
+ &child_min, &child_nat);
+ minimum += child_min;
+ natural += child_nat;
+ }
if (priv->show_close_button)
- {
- gtk_widget_get_preferred_width_for_height (priv->close_button, child_height,
- &child_min, &child_nat);
- minimum += child_min;
- natural += child_nat;
- }
+ {
+ gtk_widget_get_preferred_width_for_height (priv->close_button, child_height,
+ &child_min, &child_nat);
+ minimum += child_min;
+ natural += child_nat;
+ }
minimum += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
natural += padding.left + padding.right + 2 * SHADOW_OFFSET_X;
if (minimum_width)
- *minimum_width = minimum;
+ *minimum_width = minimum;
if (natural_width)
- *natural_width = natural;
+ *natural_width = natural;
}
static void
gd_notification_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum_height,
- gint *natural_height)
+ gint width,
+ gint *minimum_height,
+ gint *natural_height)
{
GdNotification *notification = GD_NOTIFICATION (widget);
GdNotificationPrivate *priv = notification->priv;
@@ -712,50 +712,50 @@ gd_notification_get_preferred_height_for_width (GtkWidget *widget,
get_padding_and_border (notification, &padding);
if (priv->show_close_button)
- {
- gtk_widget_get_preferred_height (priv->close_button,
- &minimum, &natural);
- gtk_widget_get_preferred_width (priv->close_button,
- NULL, &button_width);
- }
+ {
+ gtk_widget_get_preferred_height (priv->close_button,
+ &minimum, &natural);
+ gtk_widget_get_preferred_width (priv->close_button,
+ NULL, &button_width);
+ }
child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child))
- {
- child_width = width - button_width -
- 2 * SHADOW_OFFSET_X - padding.left - padding.right;
+ {
+ child_width = width - button_width -
+ 2 * SHADOW_OFFSET_X - padding.left - padding.right;
- gtk_widget_get_preferred_height_for_width (child, child_width,
- &child_min, &child_nat);
- minimum = MAX (minimum, child_min);
- natural = MAX (natural, child_nat);
- }
+ gtk_widget_get_preferred_height_for_width (child, child_width,
+ &child_min, &child_nat);
+ minimum = MAX (minimum, child_min);
+ natural = MAX (natural, child_nat);
+ }
minimum += padding.top + padding.bottom + SHADOW_OFFSET_Y;
natural += padding.top + padding.bottom + SHADOW_OFFSET_Y;
if (minimum_height)
- *minimum_height = minimum;
+ *minimum_height = minimum;
if (natural_height)
- *natural_height = natural;
+ *natural_height = natural;
}
static void
-gd_notification_get_preferred_height (GtkWidget *widget,
- gint *minimum_height,
- gint *natural_height)
+gd_notification_get_preferred_height (GtkWidget *widget,
+ gint *minimum_height,
+ gint *natural_height)
{
gint width;
gd_notification_get_preferred_width (widget, &width, NULL);
gd_notification_get_preferred_height_for_width (widget, width,
- minimum_height, natural_height);
+ minimum_height, natural_height);
}
static void
gd_notification_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
+ GtkAllocation *allocation)
{
GdNotification *notification = GD_NOTIFICATION (widget);
GdNotificationPrivate *priv = notification->priv;
@@ -768,52 +768,52 @@ gd_notification_size_allocate (GtkWidget *widget,
gtk_widget_set_allocation (widget, allocation);
/* If somehow the notification changes while not hidden
- and we're not animating, immediately follow the resize */
+ and we're not animating, immediately follow the resize */
if (priv->animate_y > 0 &&
- !priv->animate_timeout)
- priv->animate_y = allocation->height;
+ !priv->animate_timeout)
+ priv->animate_y = allocation->height;
get_padding_and_border (notification, &padding);
if (gtk_widget_get_realized (widget))
- {
- gdk_window_move_resize (gtk_widget_get_window (widget),
- allocation->x,
- allocation->y,
- allocation->width,
- allocation->height);
- gdk_window_move_resize (priv->bin_window,
- 0,
- -allocation->height + priv->animate_y,
- allocation->width,
- allocation->height);
- }
+ {
+ gdk_window_move_resize (gtk_widget_get_window (widget),
+ allocation->x,
+ allocation->y,
+ allocation->width,
+ allocation->height);
+ gdk_window_move_resize (priv->bin_window,
+ 0,
+ -allocation->height + priv->animate_y,
+ allocation->width,
+ allocation->height);
+ }
child_allocation.x = SHADOW_OFFSET_X + padding.left;
child_allocation.y = padding.top;
if (priv->show_close_button)
- gtk_widget_get_preferred_size (priv->close_button, &button_req, NULL);
+ gtk_widget_get_preferred_size (priv->close_button, &button_req, NULL);
else
- button_req.width = button_req.height = 0;
+ button_req.width = button_req.height = 0;
child_allocation.height = MAX (1, allocation->height - SHADOW_OFFSET_Y - padding.top - padding.bottom);
child_allocation.width = MAX (1, (allocation->width - button_req.width -
- 2 * SHADOW_OFFSET_X - padding.left - padding.right));
+ 2 * SHADOW_OFFSET_X - padding.left - padding.right));
child = gtk_bin_get_child (bin);
if (child && gtk_widget_get_visible (child))
- gtk_widget_size_allocate (child, &child_allocation);
+ gtk_widget_size_allocate (child, &child_allocation);
if (priv->show_close_button)
- {
- child_allocation.x += child_allocation.width;
- child_allocation.width = button_req.width;
- child_allocation.y += (child_allocation.height - button_req.height) / 2;
- child_allocation.height = button_req.height;
+ {
+ child_allocation.x += child_allocation.width;
+ child_allocation.width = button_req.width;
+ child_allocation.y += (child_allocation.height - button_req.height) / 2;
+ child_allocation.height = button_req.height;
- gtk_widget_size_allocate (priv->close_button, &child_allocation);
- }
+ gtk_widget_size_allocate (priv->close_button, &child_allocation);
+ }
}
static gboolean
@@ -828,7 +828,7 @@ gd_notification_timeout_cb (gpointer user_data)
void
gd_notification_set_timeout (GdNotification *notification,
- gint timeout_sec)
+ gint timeout_sec)
{
GdNotificationPrivate *priv = notification->priv;
@@ -838,7 +838,7 @@ gd_notification_set_timeout (GdNotification *notification,
void
gd_notification_set_show_close_button (GdNotification *notification,
- gboolean show_close_button)
+ gboolean show_close_button)
{
GdNotificationPrivate *priv = notification->priv;
diff --git a/libgd/gd-notification.h b/libraries/libgd/gd-notification.h
index 8efa191a..cfd11e08 100644
--- a/libgd/gd-notification.h
+++ b/libraries/libgd/gd-notification.h
@@ -57,10 +57,10 @@ GType gd_notification_get_type (void) G_GNUC_CONST;
GtkWidget *gd_notification_new (void);
void gd_notification_set_timeout (GdNotification *notification,
- gint timeout_sec);
+ gint timeout_sec);
void gd_notification_dismiss (GdNotification *notification);
void gd_notification_set_show_close_button (GdNotification *notification,
- gboolean show_close_button);
+ gboolean show_close_button);
G_END_DECLS
diff --git a/libgd/gd-types-catalog.c b/libraries/libgd/gd-types-catalog.c
index 3a6c72e2..3a6c72e2 100644
--- a/libgd/gd-types-catalog.c
+++ b/libraries/libgd/gd-types-catalog.c
diff --git a/libgd/gd-types-catalog.h b/libraries/libgd/gd-types-catalog.h
index fc99416b..fc99416b 100644
--- a/libgd/gd-types-catalog.h
+++ b/libraries/libgd/gd-types-catalog.h
diff --git a/libgd/gd.h b/libraries/libgd/gd.h
index 27da22fc..27da22fc 100644
--- a/libgd/gd.h
+++ b/libraries/libgd/gd.h
diff --git a/libraries/libgd/meson.build b/libraries/libgd/meson.build
new file mode 100644
index 00000000..6832514b
--- /dev/null
+++ b/libraries/libgd/meson.build
@@ -0,0 +1,12 @@
+gd_inc = include_directories('..')
+gd_lib = static_library(
+ 'gd',
+ [
+ 'gd-notification.c',
+ 'gd-types-catalog.c'
+ ],
+ dependencies: [
+ glib,
+ gtk
+ ]
+)
diff --git a/libgtkimageview/gtkimageview.c b/libraries/libgtkimageview/gtkimageview.c
index 8c933409..30ab7337 100644
--- a/libgtkimageview/gtkimageview.c
+++ b/libraries/libgtkimageview/gtkimageview.c
@@ -153,8 +153,8 @@ static GParamSpec *widget_props[LAST_WIDGET_PROPERTY] = { NULL, };
G_DEFINE_TYPE_WITH_CODE (GtkImageView, gtk_image_view, GTK_TYPE_WIDGET,
- G_ADD_PRIVATE (GtkImageView)
- G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
+ G_ADD_PRIVATE (GtkImageView)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
typedef struct _LoadTaskData LoadTaskData;
@@ -166,25 +166,25 @@ struct _LoadTaskData
static void gtk_image_view_update_surface (GtkImageView *image_view,
- const GdkPixbuf *frame,
- int scale_factor);
+ const GdkPixbuf *frame,
+ int scale_factor);
static void adjustment_value_changed_cb (GtkAdjustment *adjustment,
- gpointer user_data);
+ gpointer user_data);
static void gtk_image_view_update_adjustments (GtkImageView *image_view);
static void gtk_image_view_compute_bounding_box (GtkImageView *image_view,
- double *width,
- double *height,
- double *scale_out);
+ double *width,
+ double *height,
+ double *scale_out);
static void gtk_image_view_ensure_gestures (GtkImageView *image_view);
static inline void gtk_image_view_restrict_adjustment (GtkAdjustment *adjustment);
static void gtk_image_view_fix_anchor (GtkImageView *image_view,
- double anchor_x,
- double anchor_y,
- State *old_state);
+ double anchor_x,
+ double anchor_y,
+ State *old_state);
static inline double
@@ -193,9 +193,9 @@ gtk_image_view_get_real_scale (GtkImageView *image_view)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->in_zoom || priv->in_scale_transition)
- return priv->visible_scale;
+ return priv->visible_scale;
else
- return priv->scale;
+ return priv->scale;
}
static inline double
@@ -204,9 +204,9 @@ gtk_image_view_get_real_angle (GtkImageView *image_view)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->in_rotate || priv->in_angle_transition)
- return priv->visible_angle;
+ return priv->visible_angle;
else
- return priv->angle;
+ return priv->angle;
}
static inline double
@@ -215,9 +215,9 @@ gtk_image_view_clamp_angle (double angle)
double new_angle = angle;
if (angle > 360.0)
- new_angle -= (int)(angle / 360.0) * 360;
+ new_angle -= (int)(angle / 360.0) * 360;
else if (angle < 0.0)
- new_angle += 360 - ((int)(angle /360) * 360.0);
+ new_angle += 360 - ((int)(angle /360) * 360.0);
g_assert (new_angle >= 0.0);
g_assert (new_angle <= 360.0);
@@ -233,17 +233,17 @@ gtk_image_view_get_snapped_angle (double angle)
static void
gtk_image_view_get_current_state (GtkImageView *image_view,
- State *state)
+ State *state)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->hadjustment != NULL && priv->vadjustment != NULL)
- {
- state->hvalue = gtk_adjustment_get_value (priv->hadjustment);
- state->vvalue = gtk_adjustment_get_value (priv->vadjustment);
- state->hupper = gtk_adjustment_get_upper (priv->hadjustment);
- state->vupper = gtk_adjustment_get_upper (priv->vadjustment);
- }
+ {
+ state->hvalue = gtk_adjustment_get_value (priv->hadjustment);
+ state->vvalue = gtk_adjustment_get_value (priv->vadjustment);
+ state->hupper = gtk_adjustment_get_upper (priv->hadjustment);
+ state->vupper = gtk_adjustment_get_upper (priv->vadjustment);
+ }
state->angle = gtk_image_view_get_real_angle (image_view);
state->scale = gtk_image_view_get_real_scale (image_view);
}
@@ -255,16 +255,16 @@ gtk_image_view_transitions_enabled (GtkImageView *image_view)
gboolean animations_enabled;
g_object_get (gtk_widget_get_settings (GTK_WIDGET (image_view)),
- "gtk-enable-animations", &animations_enabled,
- NULL);
+ "gtk-enable-animations", &animations_enabled,
+ NULL);
return priv->transitions_enabled && animations_enabled && priv->image_surface;
}
static gboolean
scale_frameclock_cb (GtkWidget *widget,
- GdkFrameClock *frame_clock,
- gpointer user_data)
+ GdkFrameClock *frame_clock,
+ gpointer user_data)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -280,30 +280,30 @@ scale_frameclock_cb (GtkWidget *widget,
priv->size_valid = FALSE;
if (t >= 1.0)
- priv->in_scale_transition = FALSE;
+ priv->in_scale_transition = FALSE;
if (priv->hadjustment && priv->vadjustment)
- {
- GtkAllocation allocation;
- gtk_widget_get_allocation (widget, &allocation);
- gtk_image_view_update_adjustments (image_view);
+ {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation (widget, &allocation);
+ gtk_image_view_update_adjustments (image_view);
- gtk_image_view_fix_anchor (image_view,
- allocation.width / 2,
- allocation.height / 2,
- &state);
- }
+ gtk_image_view_fix_anchor (image_view,
+ allocation.width / 2,
+ allocation.height / 2,
+ &state);
+ }
if (priv->fit_allocation)
- gtk_widget_queue_draw (widget);
+ gtk_widget_queue_draw (widget);
else
- gtk_widget_queue_resize (widget);
+ gtk_widget_queue_resize (widget);
if (t >= 1.0)
- {
- priv->scale_transition_id = 0;
- return G_SOURCE_REMOVE;
- }
+ {
+ priv->scale_transition_id = 0;
+ return G_SOURCE_REMOVE;
+ }
return G_SOURCE_CONTINUE;
}
@@ -314,7 +314,7 @@ gtk_image_view_animate_to_scale (GtkImageView *image_view)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->scale_transition_id != 0)
- gtk_widget_remove_tick_callback (GTK_WIDGET (image_view), priv->scale_transition_id);
+ gtk_widget_remove_tick_callback (GTK_WIDGET (image_view), priv->scale_transition_id);
/* Target scale is priv->scale */
priv->in_scale_transition = TRUE;
@@ -323,14 +323,14 @@ gtk_image_view_animate_to_scale (GtkImageView *image_view)
priv->scale_transition_start = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (GTK_WIDGET (image_view)));
priv->scale_transition_id = gtk_widget_add_tick_callback (GTK_WIDGET (image_view),
- scale_frameclock_cb,
- NULL, NULL);
+ scale_frameclock_cb,
+ NULL, NULL);
}
static gboolean
angle_frameclock_cb (GtkWidget *widget,
- GdkFrameClock *frame_clock,
- gpointer user_data)
+ GdkFrameClock *frame_clock,
+ gpointer user_data)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -340,9 +340,9 @@ angle_frameclock_cb (GtkWidget *widget,
double target_angle = priv->angle;
if (direction == 1 && target_angle < priv->transition_start_angle)
- target_angle += 360.0;
+ target_angle += 360.0;
else if (direction == 0 && target_angle > priv->transition_start_angle)
- target_angle -= 360.0;
+ target_angle -= 360.0;
double t = (now - priv->angle_transition_start) / TRANSITION_DURATION;
double new_angle = (target_angle - priv->transition_start_angle) * t;
@@ -353,45 +353,45 @@ angle_frameclock_cb (GtkWidget *widget,
priv->size_valid = FALSE;
if (t >= 1.0)
- priv->in_angle_transition = FALSE;
+ priv->in_angle_transition = FALSE;
if (priv->hadjustment && priv->vadjustment)
- {
- GtkAllocation allocation;
- gtk_widget_get_allocation (widget, &allocation);
- gtk_image_view_update_adjustments (image_view);
+ {
+ GtkAllocation allocation;
+ gtk_widget_get_allocation (widget, &allocation);
+ gtk_image_view_update_adjustments (image_view);
- gtk_image_view_fix_anchor (image_view,
- allocation.width / 2,
- allocation.height / 2,
- &state);
- }
+ gtk_image_view_fix_anchor (image_view,
+ allocation.width / 2,
+ allocation.height / 2,
+ &state);
+ }
if (priv->fit_allocation)
- gtk_widget_queue_draw (widget);
+ gtk_widget_queue_draw (widget);
else
- gtk_widget_queue_resize (widget);
+ gtk_widget_queue_resize (widget);
if (t >= 1.0)
- {
- priv->angle_transition_id = 0;
- return G_SOURCE_REMOVE;
- }
+ {
+ priv->angle_transition_id = 0;
+ return G_SOURCE_REMOVE;
+ }
return G_SOURCE_CONTINUE;
}
static void
gtk_image_view_animate_to_angle (GtkImageView *image_view,
- int direction)
+ int direction)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->angle_transition_id != 0)
- {
- gtk_widget_remove_tick_callback (GTK_WIDGET (image_view), priv->angle_transition_id);
- priv->angle_transition_id = 0;
- }
+ {
+ gtk_widget_remove_tick_callback (GTK_WIDGET (image_view), priv->angle_transition_id);
+ priv->angle_transition_id = 0;
+ }
/* Target angle is priv->angle */
priv->in_angle_transition = TRUE;
@@ -400,9 +400,9 @@ gtk_image_view_animate_to_angle (GtkImageView *image_view,
priv->angle_transition_start = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (GTK_WIDGET (image_view)));
priv->angle_transition_id = gtk_widget_add_tick_callback (GTK_WIDGET (image_view),
- angle_frameclock_cb,
- GINT_TO_POINTER (direction),
- NULL);
+ angle_frameclock_cb,
+ GINT_TO_POINTER (direction),
+ NULL);
}
static void
@@ -414,7 +414,7 @@ gtk_image_view_do_snapping (GtkImageView *image_view)
g_assert (priv->snap_angle);
if (gtk_image_view_transitions_enabled (image_view))
- gtk_image_view_animate_to_angle (image_view, new_angle > priv->angle);
+ gtk_image_view_animate_to_angle (image_view, new_angle > priv->angle);
priv->angle = new_angle;
@@ -430,9 +430,9 @@ free_load_task_data (LoadTaskData *data)
static void
to_rotate_coords (GtkImageView *image_view,
- State *state,
- double in_x, double in_y,
- double *out_x, double *out_y)
+ State *state,
+ double in_x, double in_y,
+ double *out_x, double *out_y)
{
double cx = state->hupper / 2.0 - state->hvalue;
double cy = state->vupper / 2.0 - state->vvalue;
@@ -443,15 +443,15 @@ to_rotate_coords (GtkImageView *image_view,
static void
gtk_image_view_fix_anchor (GtkImageView *image_view,
- double anchor_x,
- double anchor_y,
- State *old_state)
+ double anchor_x,
+ double anchor_y,
+ State *old_state)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
double hupper_delta = gtk_adjustment_get_upper (priv->hadjustment)
- - old_state->hupper;
+ - old_state->hupper;
double vupper_delta = gtk_adjustment_get_upper (priv->vadjustment)
- - old_state->vupper;
+ - old_state->vupper;
double hupper_delta_scale, vupper_delta_scale;
double hupper_delta_angle, vupper_delta_angle;
double cur_scale = gtk_image_view_get_real_scale (image_view);
@@ -468,9 +468,9 @@ gtk_image_view_fix_anchor (GtkImageView *image_view,
/* Amount of upper change caused by scale */
hupper_delta_scale = ((old_state->hupper / old_state->scale) * cur_scale)
- - old_state->hupper;
+ - old_state->hupper;
vupper_delta_scale = ((old_state->vupper / old_state->scale) * cur_scale)
- - old_state->vupper;
+ - old_state->vupper;
/* Amount of upper change caused by angle */
hupper_delta_angle = hupper_delta - hupper_delta_scale;
@@ -480,64 +480,64 @@ gtk_image_view_fix_anchor (GtkImageView *image_view,
* updated scale
*/
{
- double hvalue = gtk_adjustment_get_value (priv->hadjustment);
- double vvalue = gtk_adjustment_get_value (priv->vadjustment);
+ double hvalue = gtk_adjustment_get_value (priv->hadjustment);
+ double vvalue = gtk_adjustment_get_value (priv->vadjustment);
- double px = anchor_x + hvalue;
- double py = anchor_y + vvalue;
+ double px = anchor_x + hvalue;
+ double py = anchor_y + vvalue;
- double px_after = (px / old_state->scale) * cur_scale;
- double py_after = (py / old_state->scale) * cur_scale;
+ double px_after = (px / old_state->scale) * cur_scale;
+ double py_after = (py / old_state->scale) * cur_scale;
- gtk_adjustment_set_value (priv->hadjustment,
- hvalue + px_after - px);
- gtk_adjustment_set_value (priv->vadjustment,
- vvalue + py_after - py);
+ gtk_adjustment_set_value (priv->hadjustment,
+ hvalue + px_after - px);
+ gtk_adjustment_set_value (priv->vadjustment,
+ vvalue + py_after - py);
}
gtk_adjustment_set_value (priv->hadjustment,
- gtk_adjustment_get_value (priv->hadjustment) + hupper_delta_angle / 2.0);
+ gtk_adjustment_get_value (priv->hadjustment) + hupper_delta_angle / 2.0);
gtk_adjustment_set_value (priv->vadjustment,
- gtk_adjustment_get_value (priv->vadjustment) + vupper_delta_angle / 2.0);
+ gtk_adjustment_get_value (priv->vadjustment) + vupper_delta_angle / 2.0);
{
- double rotate_anchor_x = 0;
- double rotate_anchor_y = 0;
- double anchor_angle;
- double anchor_length;
- double new_anchor_x, new_anchor_y;
- double delta_x, delta_y;
-
- /* Calculate the angle of the given anchor point relative to the
- * bounding box center and the OLD state */
- to_rotate_coords (image_view, old_state,
- anchor_x, anchor_y,
- &rotate_anchor_x, &rotate_anchor_y);
- anchor_angle = atan2 (rotate_anchor_y, rotate_anchor_x);
- anchor_length = sqrt ((rotate_anchor_x * rotate_anchor_x) +
- (rotate_anchor_y * rotate_anchor_y));
-
- /* The angle of the anchor point NOW is the old angle plus
- * the difference between old surface angle and new surface angle */
- anchor_angle += DEG_TO_RAD (gtk_image_view_get_real_angle (image_view)
- - old_state->angle);
-
- /* Calculate the position of the new anchor point, relative
- * to the bounding box center */
- new_anchor_x = cos (anchor_angle) * anchor_length;
- new_anchor_y = sin (anchor_angle) * anchor_length;
-
- /* The difference between old anchor and new anchor
- * is what we care about... */
- delta_x = rotate_anchor_x - new_anchor_x;
- delta_y = rotate_anchor_y - new_anchor_y;
-
- /* At last, make the old anchor match the new anchor */
- gtk_adjustment_set_value (priv->hadjustment,
- gtk_adjustment_get_value (priv->hadjustment) - delta_x);
- gtk_adjustment_set_value (priv->vadjustment,
- gtk_adjustment_get_value (priv->vadjustment) - delta_y);
+ double rotate_anchor_x = 0;
+ double rotate_anchor_y = 0;
+ double anchor_angle;
+ double anchor_length;
+ double new_anchor_x, new_anchor_y;
+ double delta_x, delta_y;
+
+ /* Calculate the angle of the given anchor point relative to the
+ * bounding box center and the OLD state */
+ to_rotate_coords (image_view, old_state,
+ anchor_x, anchor_y,
+ &rotate_anchor_x, &rotate_anchor_y);
+ anchor_angle = atan2 (rotate_anchor_y, rotate_anchor_x);
+ anchor_length = sqrt ((rotate_anchor_x * rotate_anchor_x) +
+ (rotate_anchor_y * rotate_anchor_y));
+
+ /* The angle of the anchor point NOW is the old angle plus
+ * the difference between old surface angle and new surface angle */
+ anchor_angle += DEG_TO_RAD (gtk_image_view_get_real_angle (image_view)
+ - old_state->angle);
+
+ /* Calculate the position of the new anchor point, relative
+ * to the bounding box center */
+ new_anchor_x = cos (anchor_angle) * anchor_length;
+ new_anchor_y = sin (anchor_angle) * anchor_length;
+
+ /* The difference between old anchor and new anchor
+ * is what we care about... */
+ delta_x = rotate_anchor_x - new_anchor_x;
+ delta_y = rotate_anchor_y - new_anchor_y;
+
+ /* At last, make the old anchor match the new anchor */
+ gtk_adjustment_set_value (priv->hadjustment,
+ gtk_adjustment_get_value (priv->hadjustment) - delta_x);
+ gtk_adjustment_set_value (priv->vadjustment,
+ gtk_adjustment_get_value (priv->vadjustment) - delta_y);
}
@@ -546,9 +546,9 @@ gtk_image_view_fix_anchor (GtkImageView *image_view,
static void
gtk_image_view_compute_bounding_box (GtkImageView *image_view,
- double *width,
- double *height,
- double *scale_out)
+ double *width,
+ double *height,
+ double *scale_out)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
GtkAllocation alloc;
@@ -565,20 +565,20 @@ gtk_image_view_compute_bounding_box (GtkImageView *image_view,
double angle;
if (priv->size_valid)
- {
- *width = priv->cached_width;
- *height = priv->cached_height;
- if (scale_out)
- *scale_out = priv->cached_scale;
- return;
- }
+ {
+ *width = priv->cached_width;
+ *height = priv->cached_height;
+ if (scale_out)
+ *scale_out = priv->cached_scale;
+ return;
+ }
if (!priv->image_surface)
- {
- *width = 0;
- *height = 0;
- return;
- }
+ {
+ *width = 0;
+ *height = 0;
+ return;
+ }
gtk_widget_get_allocation (GTK_WIDGET (image_view), &alloc);
angle = gtk_image_view_get_real_angle (image_view);
@@ -600,28 +600,28 @@ gtk_image_view_compute_bounding_box (GtkImageView *image_view,
bb_height = round (MAX (fabs (upper_right_y), fabs (upper_left_y)) * 2.0);
if (priv->fit_allocation)
- {
- double scale_x = (double)alloc.width / (double)bb_width;
- double scale_y = (double)alloc.height / (double)bb_height;
+ {
+ double scale_x = (double)alloc.width / (double)bb_width;
+ double scale_y = (double)alloc.height / (double)bb_height;
- scale = MIN (MIN (scale_x, scale_y), 1.0);
- }
+ scale = MIN (MIN (scale_x, scale_y), 1.0);
+ }
else
- {
- scale = gtk_image_view_get_real_scale (image_view);
- }
+ {
+ scale = gtk_image_view_get_real_scale (image_view);
+ }
priv->cached_scale = scale;
if (scale_out)
- *scale_out = scale;
+ *scale_out = scale;
if (priv->fit_allocation)
- {
- g_assert (!priv->scale_set);
- priv->scale = scale;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE]);
- }
+ {
+ g_assert (!priv->scale_set);
+ priv->scale = scale;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_SCALE]);
+ }
*width = priv->cached_width = bb_width * scale;
*height = priv->cached_height = bb_height * scale;
@@ -640,9 +640,9 @@ gtk_image_view_restrict_adjustment (GtkAdjustment *adjustment)
upper = gtk_adjustment_get_upper (adjustment);
if (value > upper - page_size)
- gtk_adjustment_set_value (adjustment, upper - page_size);
+ gtk_adjustment_set_value (adjustment, upper - page_size);
else if (value < 0)
- gtk_adjustment_set_value (adjustment, 0);
+ gtk_adjustment_set_value (adjustment, 0);
}
static void
@@ -654,44 +654,44 @@ gtk_image_view_update_adjustments (GtkImageView *image_view)
int widget_height = gtk_widget_get_allocated_height (GTK_WIDGET (image_view));
if (!priv->hadjustment && !priv->vadjustment)
- return;
+ return;
if (!priv->image_surface)
- {
- if (priv->hadjustment)
- gtk_adjustment_configure (priv->hadjustment, 0, 0, 1, 0, 0, 1);
+ {
+ if (priv->hadjustment)
+ gtk_adjustment_configure (priv->hadjustment, 0, 0, 1, 0, 0, 1);
- if (priv->vadjustment)
- gtk_adjustment_configure (priv->vadjustment, 0, 0, 1, 0, 0, 1);
+ if (priv->vadjustment)
+ gtk_adjustment_configure (priv->vadjustment, 0, 0, 1, 0, 0, 1);
- return;
- }
+ return;
+ }
gtk_image_view_compute_bounding_box (image_view,
- &width,
- &height,
- NULL);
+ &width,
+ &height,
+ NULL);
/* compute_bounding_box makes sure that the bounding box is never bigger than
* the widget allocation if fit-allocation is set */
if (priv->hadjustment)
- {
- gtk_adjustment_set_upper (priv->hadjustment, MAX (width, widget_width));
- gtk_adjustment_set_page_size (priv->hadjustment, widget_width);
- gtk_image_view_restrict_adjustment (priv->hadjustment);
- }
+ {
+ gtk_adjustment_set_upper (priv->hadjustment, MAX (width, widget_width));
+ gtk_adjustment_set_page_size (priv->hadjustment, widget_width);
+ gtk_image_view_restrict_adjustment (priv->hadjustment);
+ }
if (priv->vadjustment)
- {
- gtk_adjustment_set_upper (priv->vadjustment, MAX (height, widget_height));
- gtk_adjustment_set_page_size (priv->vadjustment, widget_height);
- gtk_image_view_restrict_adjustment (priv->vadjustment);
- }
+ {
+ gtk_adjustment_set_upper (priv->vadjustment, MAX (height, widget_height));
+ gtk_adjustment_set_page_size (priv->vadjustment, widget_height);
+ gtk_image_view_restrict_adjustment (priv->vadjustment);
+ }
}
static void
gtk_image_view_set_scale_internal (GtkImageView *image_view,
- double scale)
+ double scale)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
scale = MAX (0, scale);
@@ -699,21 +699,21 @@ gtk_image_view_set_scale_internal (GtkImageView *image_view,
priv->scale = scale;
priv->size_valid = FALSE;
g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE]);
+ widget_props[PROP_SCALE]);
if (priv->scale_set)
- {
- priv->scale_set = FALSE;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE_SET]);
- }
+ {
+ priv->scale_set = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_SCALE_SET]);
+ }
if (priv->fit_allocation)
- {
- priv->fit_allocation = FALSE;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_FIT_ALLOCATION]);
- }
+ {
+ priv->fit_allocation = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_FIT_ALLOCATION]);
+ }
gtk_image_view_update_adjustments (image_view);
@@ -722,30 +722,30 @@ gtk_image_view_set_scale_internal (GtkImageView *image_view,
static void
gesture_zoom_begin_cb (GtkGesture *gesture,
- GdkEventSequence *sequence,
- gpointer user_data)
+ GdkEventSequence *sequence,
+ gpointer user_data)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (user_data);
if (!priv->zoomable ||
- !priv->image_surface)
- {
- gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
- return;
- }
+ !priv->image_surface)
+ {
+ gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
+ return;
+ }
if (priv->anchor_x == -1 && priv->anchor_y == -1)
- {
- gtk_gesture_get_bounding_box_center (gesture,
- &priv->anchor_x,
- &priv->anchor_y);
- }
+ {
+ gtk_gesture_get_bounding_box_center (gesture,
+ &priv->anchor_x,
+ &priv->anchor_y);
+ }
}
static void
gesture_zoom_end_cb (GtkGesture *gesture,
- GdkEventSequence *sequence,
- gpointer image_view)
+ GdkEventSequence *sequence,
+ gpointer image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -758,13 +758,13 @@ gesture_zoom_end_cb (GtkGesture *gesture,
static void
gesture_zoom_cancel_cb (GtkGesture *gesture,
- GdkEventSequence *sequence,
- gpointer user_data)
+ GdkEventSequence *sequence,
+ gpointer user_data)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (user_data);
if (priv->in_zoom)
- gtk_image_view_set_scale (user_data, priv->gesture_start_scale);
+ gtk_image_view_set_scale (user_data, priv->gesture_start_scale);
priv->in_zoom = FALSE;
priv->anchor_x = -1;
@@ -773,8 +773,8 @@ gesture_zoom_cancel_cb (GtkGesture *gesture,
static void
gesture_zoom_changed_cb (GtkGestureZoom *gesture,
- double delta,
- GtkWidget *widget)
+ double delta,
+ GtkWidget *widget)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -782,17 +782,17 @@ gesture_zoom_changed_cb (GtkGestureZoom *gesture,
double new_scale;
if (!priv->in_zoom)
- {
- priv->in_zoom = TRUE;
- priv->gesture_start_scale = priv->scale;
- }
+ {
+ priv->in_zoom = TRUE;
+ priv->gesture_start_scale = priv->scale;
+ }
if (priv->fit_allocation)
- {
- priv->fit_allocation = FALSE;
- g_object_notify_by_pspec (G_OBJECT (widget),
- widget_props[PROP_FIT_ALLOCATION]);
- }
+ {
+ priv->fit_allocation = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (widget),
+ widget_props[PROP_FIT_ALLOCATION]);
+ }
new_scale = priv->gesture_start_scale * delta;
gtk_image_view_get_current_state (image_view, &state);
@@ -803,54 +803,54 @@ gesture_zoom_changed_cb (GtkGestureZoom *gesture,
gtk_image_view_update_adjustments (image_view);
if (priv->hadjustment != NULL && priv->vadjustment != NULL)
- {
- gtk_image_view_fix_anchor (image_view,
- priv->anchor_x,
- priv->anchor_y,
- &state);
- }
+ {
+ gtk_image_view_fix_anchor (image_view,
+ priv->anchor_x,
+ priv->anchor_y,
+ &state);
+ }
gtk_widget_queue_resize (GTK_WIDGET (image_view));
}
static void
gesture_rotate_begin_cb (GtkGesture *gesture,
- GdkEventSequence *sequence,
- gpointer user_data)
+ GdkEventSequence *sequence,
+ gpointer user_data)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (user_data);
if (!priv->rotatable ||
- !priv->image_surface)
- {
- gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
- return;
- }
+ !priv->image_surface)
+ {
+ gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
+ return;
+ }
if (priv->anchor_x == -1 && priv->anchor_y == -1)
- {
- gtk_gesture_get_bounding_box_center (gesture,
- &priv->anchor_x,
- &priv->anchor_y);
- }
+ {
+ gtk_gesture_get_bounding_box_center (gesture,
+ &priv->anchor_x,
+ &priv->anchor_y);
+ }
}
static void
gesture_rotate_end_cb (GtkGesture *gesture,
- GdkEventSequence *sequence,
- gpointer image_view)
+ GdkEventSequence *sequence,
+ gpointer image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
priv->angle = gtk_image_view_clamp_angle (priv->visible_angle);
if (priv->snap_angle)
- {
- /* Will update priv->angle */
- gtk_image_view_do_snapping (image_view);
- }
+ {
+ /* Will update priv->angle */
+ gtk_image_view_do_snapping (image_view);
+ }
g_object_notify_by_pspec (image_view,
- widget_props[PROP_ANGLE]);
+ widget_props[PROP_ANGLE]);
priv->in_rotate = FALSE;
priv->anchor_x = -1;
@@ -859,8 +859,8 @@ gesture_rotate_end_cb (GtkGesture *gesture,
static void
gesture_rotate_cancel_cb (GtkGesture *gesture,
- GdkEventSequence *sequence,
- gpointer image_view)
+ GdkEventSequence *sequence,
+ gpointer image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -874,9 +874,9 @@ gesture_rotate_cancel_cb (GtkGesture *gesture,
static void
gesture_rotate_changed_cb (GtkGestureRotate *gesture,
- double angle,
- double delta,
- GtkWidget *widget)
+ double angle,
+ double delta,
+ GtkWidget *widget)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -884,10 +884,10 @@ gesture_rotate_changed_cb (GtkGestureRotate *gesture,
double new_angle;
if (!priv->in_rotate)
- {
- priv->in_rotate = TRUE;
- priv->gesture_start_angle = priv->angle;
- }
+ {
+ priv->in_rotate = TRUE;
+ priv->gesture_start_angle = priv->angle;
+ }
new_angle = priv->gesture_start_angle + RAD_TO_DEG (delta);
gtk_image_view_get_current_state (image_view, &old_state);
@@ -897,15 +897,15 @@ gesture_rotate_changed_cb (GtkGestureRotate *gesture,
gtk_image_view_update_adjustments (image_view);
if (priv->hadjustment && priv->vadjustment && !priv->fit_allocation)
- gtk_image_view_fix_anchor (image_view,
- priv->anchor_x,
- priv->anchor_y,
- &old_state);
+ gtk_image_view_fix_anchor (image_view,
+ priv->anchor_x,
+ priv->anchor_y,
+ &old_state);
if (priv->fit_allocation)
- gtk_widget_queue_draw (widget);
+ gtk_widget_queue_draw (widget);
else
- gtk_widget_queue_resize (widget);
+ gtk_widget_queue_resize (widget);
}
static void
@@ -914,39 +914,39 @@ gtk_image_view_ensure_gestures (GtkImageView *image_view)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->zoomable && priv->zoom_gesture == NULL)
- {
- priv->zoom_gesture = gtk_gesture_zoom_new (GTK_WIDGET (image_view));
- g_signal_connect (priv->zoom_gesture, "scale-changed",
- (GCallback)gesture_zoom_changed_cb, image_view);
- g_signal_connect (priv->zoom_gesture, "begin",
- (GCallback)gesture_zoom_begin_cb, image_view);
- g_signal_connect (priv->zoom_gesture, "end",
- (GCallback)gesture_zoom_end_cb, image_view);
- g_signal_connect (priv->zoom_gesture, "cancel",
- (GCallback)gesture_zoom_cancel_cb, image_view);
- }
+ {
+ priv->zoom_gesture = gtk_gesture_zoom_new (GTK_WIDGET (image_view));
+ g_signal_connect (priv->zoom_gesture, "scale-changed",
+ (GCallback)gesture_zoom_changed_cb, image_view);
+ g_signal_connect (priv->zoom_gesture, "begin",
+ (GCallback)gesture_zoom_begin_cb, image_view);
+ g_signal_connect (priv->zoom_gesture, "end",
+ (GCallback)gesture_zoom_end_cb, image_view);
+ g_signal_connect (priv->zoom_gesture, "cancel",
+ (GCallback)gesture_zoom_cancel_cb, image_view);
+ }
else if (!priv->zoomable && priv->zoom_gesture != NULL)
- {
- g_clear_object (&priv->zoom_gesture);
- }
+ {
+ g_clear_object (&priv->zoom_gesture);
+ }
if (priv->rotatable && priv->rotate_gesture == NULL)
- {
- priv->rotate_gesture = gtk_gesture_rotate_new (GTK_WIDGET (image_view));
- g_signal_connect (priv->rotate_gesture, "angle-changed", (GCallback)gesture_rotate_changed_cb, image_view);
- g_signal_connect (priv->rotate_gesture, "begin", (GCallback)gesture_rotate_begin_cb, image_view);
- g_signal_connect (priv->rotate_gesture, "end", (GCallback)gesture_rotate_end_cb, image_view);
- g_signal_connect (priv->rotate_gesture, "cancel", (GCallback)gesture_rotate_cancel_cb, image_view);
-
- }
+ {
+ priv->rotate_gesture = gtk_gesture_rotate_new (GTK_WIDGET (image_view));
+ g_signal_connect (priv->rotate_gesture, "angle-changed", (GCallback)gesture_rotate_changed_cb, image_view);
+ g_signal_connect (priv->rotate_gesture, "begin", (GCallback)gesture_rotate_begin_cb, image_view);
+ g_signal_connect (priv->rotate_gesture, "end", (GCallback)gesture_rotate_end_cb, image_view);
+ g_signal_connect (priv->rotate_gesture, "cancel", (GCallback)gesture_rotate_cancel_cb, image_view);
+
+ }
else if (!priv->rotatable && priv->rotate_gesture != NULL)
- {
- g_clear_object (&priv->rotate_gesture);
- }
+ {
+ g_clear_object (&priv->rotate_gesture);
+ }
if (priv->zoom_gesture && priv->rotate_gesture)
- gtk_gesture_group (priv->zoom_gesture,
- priv->rotate_gesture);
+ gtk_gesture_group (priv->zoom_gesture,
+ priv->rotate_gesture);
}
static void
@@ -985,9 +985,9 @@ gtk_image_view_get_current_frame (GtkImageView *image_view)
g_assert (priv->source_animation);
if (priv->is_animation)
- return gdk_pixbuf_animation_iter_get_pixbuf (priv->source_animation_iter);
+ return gdk_pixbuf_animation_iter_get_pixbuf (priv->source_animation_iter);
else
- return gdk_pixbuf_animation_get_static_image (priv->source_animation);
+ return gdk_pixbuf_animation_get_static_image (priv->source_animation);
}
static gboolean
@@ -997,12 +997,12 @@ gtk_image_view_update_animation (gpointer user_data)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->is_animation)
- {
- gdk_pixbuf_animation_iter_advance (priv->source_animation_iter, NULL);
- gtk_image_view_update_surface (image_view,
- gtk_image_view_get_current_frame (image_view),
- priv->scale_factor);
- }
+ {
+ gdk_pixbuf_animation_iter_advance (priv->source_animation_iter, NULL);
+ gtk_image_view_update_surface (image_view,
+ gtk_image_view_get_current_frame (image_view),
+ priv->scale_factor);
+ }
return priv->is_animation;
}
@@ -1026,11 +1026,11 @@ gtk_image_view_stop_animation (GtkImageView *image_view)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->animation_timeout != 0)
- {
- g_assert (priv->is_animation);
- g_source_remove (priv->animation_timeout);
- priv->animation_timeout = 0;
- }
+ {
+ g_assert (priv->is_animation);
+ g_source_remove (priv->animation_timeout);
+ priv->animation_timeout = 0;
+ }
}
static gboolean
@@ -1050,73 +1050,73 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
double scale = 0.0;
if (priv->vadjustment && priv->hadjustment)
- {
- int x = - gtk_adjustment_get_value (priv->hadjustment);
- int y = - gtk_adjustment_get_value (priv->vadjustment);
- int w = gtk_adjustment_get_upper (priv->hadjustment);
- int h = gtk_adjustment_get_upper (priv->vadjustment);
-
- gtk_render_background (sc, ct, x, y, w, h);
- gtk_render_frame (sc, ct, x, y, w, h);
- }
+ {
+ int x = - gtk_adjustment_get_value (priv->hadjustment);
+ int y = - gtk_adjustment_get_value (priv->vadjustment);
+ int w = gtk_adjustment_get_upper (priv->hadjustment);
+ int h = gtk_adjustment_get_upper (priv->vadjustment);
+
+ gtk_render_background (sc, ct, x, y, w, h);
+ gtk_render_frame (sc, ct, x, y, w, h);
+ }
else
- {
- gtk_render_background (sc, ct, 0, 0, widget_width, widget_height);
- gtk_render_frame (sc, ct, 0, 0, widget_width, widget_height);
- }
+ {
+ gtk_render_background (sc, ct, 0, 0, widget_width, widget_height);
+ gtk_render_frame (sc, ct, 0, 0, widget_width, widget_height);
+ }
if (!priv->image_surface)
- return GDK_EVENT_PROPAGATE;
+ return GDK_EVENT_PROPAGATE;
gtk_image_view_compute_bounding_box (image_view,
- &draw_width, &draw_height,
- &scale);
+ &draw_width, &draw_height,
+ &scale);
if (draw_width == 0 || draw_height == 0)
- return GDK_EVENT_PROPAGATE;
+ return GDK_EVENT_PROPAGATE;
image_width = cairo_image_surface_get_width (priv->image_surface) * scale / priv->scale_factor;
image_height = cairo_image_surface_get_height (priv->image_surface) * scale / priv->scale_factor;
if (priv->hadjustment && priv->vadjustment)
- {
- draw_x = (gtk_adjustment_get_page_size (priv->hadjustment) - image_width) / 2.0;
- draw_y = (gtk_adjustment_get_page_size (priv->vadjustment) - image_height) / 2.0;
- }
+ {
+ draw_x = (gtk_adjustment_get_page_size (priv->hadjustment) - image_width) / 2.0;
+ draw_y = (gtk_adjustment_get_page_size (priv->vadjustment) - image_height) / 2.0;
+ }
else
- {
- draw_x = (widget_width - image_width) / 2.0;
- draw_y = (widget_height - image_height) / 2.0;
- }
+ {
+ draw_x = (widget_width - image_width) / 2.0;
+ draw_y = (widget_height - image_height) / 2.0;
+ }
cairo_rectangle (ct, 0, 0, widget_width, widget_height);
if (priv->hadjustment && draw_width >= widget_width)
- {
- draw_x = (draw_width - image_width) / 2.0;
- draw_x -= gtk_adjustment_get_value (priv->hadjustment);
- }
+ {
+ draw_x = (draw_width - image_width) / 2.0;
+ draw_x -= gtk_adjustment_get_value (priv->hadjustment);
+ }
if (priv->vadjustment && draw_height >= widget_height)
- {
- draw_y = (draw_height - image_height) / 2.0;
- draw_y -= gtk_adjustment_get_value (priv->vadjustment);
- }
+ {
+ draw_y = (draw_height - image_height) / 2.0;
+ draw_y -= gtk_adjustment_get_value (priv->vadjustment);
+ }
/* Rotate around the center */
cairo_translate (ct,
- draw_x + (image_width / 2.0),
- draw_y + (image_height / 2.0));
+ draw_x + (image_width / 2.0),
+ draw_y + (image_height / 2.0));
cairo_rotate (ct, DEG_TO_RAD (gtk_image_view_get_real_angle (image_view)));
cairo_translate (ct,
- - draw_x - (image_width / 2.0),
- - draw_y - (image_height / 2.0));
+ - draw_x - (image_width / 2.0),
+ - draw_y - (image_height / 2.0));
cairo_scale (ct, scale , scale );
cairo_set_source_surface (ct,
- priv->image_surface,
- draw_x / scale ,
- draw_y / scale);
+ priv->image_surface,
+ draw_x / scale ,
+ draw_y / scale);
cairo_pattern_set_filter (cairo_get_source (ct), CAIRO_FILTER_BILINEAR);
cairo_fill (ct);
@@ -1125,97 +1125,97 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
static void
gtk_image_view_set_hadjustment (GtkImageView *image_view,
- GtkAdjustment *hadjustment)
+ GtkAdjustment *hadjustment)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->hadjustment && priv->hadjustment == hadjustment)
- return;
+ return;
if (priv->hadjustment)
- {
- g_signal_handlers_disconnect_by_func (priv->hadjustment, adjustment_value_changed_cb, image_view);
- g_object_unref (priv->hadjustment);
- }
+ {
+ g_signal_handlers_disconnect_by_func (priv->hadjustment, adjustment_value_changed_cb, image_view);
+ g_object_unref (priv->hadjustment);
+ }
if (hadjustment)
- {
- g_signal_connect (G_OBJECT (hadjustment), "value-changed",
- G_CALLBACK (adjustment_value_changed_cb), image_view);
- priv->hadjustment = g_object_ref_sink (hadjustment);
- }
+ {
+ g_signal_connect (G_OBJECT (hadjustment), "value-changed",
+ G_CALLBACK (adjustment_value_changed_cb), image_view);
+ priv->hadjustment = g_object_ref_sink (hadjustment);
+ }
else
- {
- priv->hadjustment = hadjustment;
- }
+ {
+ priv->hadjustment = hadjustment;
+ }
g_object_notify (G_OBJECT (image_view), "hadjustment");
gtk_image_view_update_adjustments (image_view);
if (priv->fit_allocation)
- gtk_widget_queue_draw (GTK_WIDGET (image_view));
+ gtk_widget_queue_draw (GTK_WIDGET (image_view));
else
- gtk_widget_queue_resize (GTK_WIDGET (image_view));
+ gtk_widget_queue_resize (GTK_WIDGET (image_view));
}
static void
gtk_image_view_set_vadjustment (GtkImageView *image_view,
- GtkAdjustment *vadjustment)
+ GtkAdjustment *vadjustment)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->vadjustment == vadjustment)
- return;
+ return;
if (priv->vadjustment)
- {
- g_signal_handlers_disconnect_by_func (priv->vadjustment, adjustment_value_changed_cb, image_view);
- g_object_unref (priv->vadjustment);
- }
+ {
+ g_signal_handlers_disconnect_by_func (priv->vadjustment, adjustment_value_changed_cb, image_view);
+ g_object_unref (priv->vadjustment);
+ }
if (vadjustment)
- {
- g_signal_connect ((GObject *)vadjustment, "value-changed",
- (GCallback) adjustment_value_changed_cb, image_view);
- priv->vadjustment = g_object_ref_sink (vadjustment);
- }
+ {
+ g_signal_connect ((GObject *)vadjustment, "value-changed",
+ (GCallback) adjustment_value_changed_cb, image_view);
+ priv->vadjustment = g_object_ref_sink (vadjustment);
+ }
else
- {
- priv->vadjustment = vadjustment;
- }
+ {
+ priv->vadjustment = vadjustment;
+ }
g_object_notify (G_OBJECT (image_view), "vadjustment");
gtk_image_view_update_adjustments (image_view);
if (priv->fit_allocation)
- gtk_widget_queue_draw ((GtkWidget *)image_view);
+ gtk_widget_queue_draw ((GtkWidget *)image_view);
else
- gtk_widget_queue_resize ((GtkWidget *)image_view);
+ gtk_widget_queue_resize ((GtkWidget *)image_view);
}
static void
gtk_image_view_set_hscroll_policy (GtkImageView *image_view,
- GtkScrollablePolicy hscroll_policy)
+ GtkScrollablePolicy hscroll_policy)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->hscroll_policy == hscroll_policy)
- return;
+ return;
priv->hscroll_policy = hscroll_policy;
}
static void
gtk_image_view_set_vscroll_policy (GtkImageView *image_view,
- GtkScrollablePolicy vscroll_policy)
+ GtkScrollablePolicy vscroll_policy)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->vscroll_policy == vscroll_policy)
- return;
+ return;
priv->vscroll_policy = vscroll_policy;
}
@@ -1245,7 +1245,7 @@ gtk_image_view_set_vscroll_policy (GtkImageView *image_view,
*/
void
gtk_image_view_set_scale (GtkImageView *image_view,
- double scale)
+ double scale)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
State state;
@@ -1254,46 +1254,46 @@ gtk_image_view_set_scale (GtkImageView *image_view,
g_return_if_fail (scale > 0.0);
if (scale == priv->scale)
- return;
+ return;
gtk_image_view_get_current_state (image_view, &state);
if (gtk_image_view_transitions_enabled (image_view))
- gtk_image_view_animate_to_scale (image_view);
+ gtk_image_view_animate_to_scale (image_view);
priv->scale = scale;
g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE]);
+ widget_props[PROP_SCALE]);
if (priv->scale_set)
- {
- priv->scale_set = FALSE;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE_SET]);
- }
+ {
+ priv->scale_set = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_SCALE_SET]);
+ }
if (priv->fit_allocation)
- {
- priv->fit_allocation = FALSE;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_FIT_ALLOCATION]);
- }
+ {
+ priv->fit_allocation = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_FIT_ALLOCATION]);
+ }
priv->size_valid = FALSE;
gtk_image_view_update_adjustments (image_view);
if (!priv->image_surface)
- return;
+ return;
if (priv->hadjustment != NULL && priv->vadjustment != NULL)
- {
- int pointer_x = gtk_widget_get_allocated_width (GTK_WIDGET (image_view)) / 2;
- int pointer_y = gtk_widget_get_allocated_height (GTK_WIDGET (image_view)) / 2;
- gtk_image_view_fix_anchor (image_view,
- pointer_x,
- pointer_y,
- &state);
- }
+ {
+ int pointer_x = gtk_widget_get_allocated_width (GTK_WIDGET (image_view)) / 2;
+ int pointer_y = gtk_widget_get_allocated_height (GTK_WIDGET (image_view)) / 2;
+ gtk_image_view_fix_anchor (image_view,
+ pointer_x,
+ pointer_y,
+ &state);
+ }
gtk_widget_queue_resize (GTK_WIDGET (image_view));
}
@@ -1333,7 +1333,7 @@ gtk_image_view_get_scale (GtkImageView *image_view)
*/
void
gtk_image_view_set_angle (GtkImageView *image_view,
- double angle)
+ double angle)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
State state;
@@ -1341,47 +1341,47 @@ gtk_image_view_set_angle (GtkImageView *image_view,
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
if (angle == priv->angle)
- return;
+ return;
gtk_image_view_get_current_state (image_view, &state);
if (gtk_image_view_transitions_enabled (image_view) &&
- ABS(gtk_image_view_clamp_angle (angle) - priv->angle) > ANGLE_TRANSITION_MIN_DELTA)
- {
- gtk_image_view_animate_to_angle (image_view, angle > priv->angle);
- }
+ ABS(gtk_image_view_clamp_angle (angle) - priv->angle) > ANGLE_TRANSITION_MIN_DELTA)
+ {
+ gtk_image_view_animate_to_angle (image_view, angle > priv->angle);
+ }
angle = gtk_image_view_clamp_angle (angle);
if (priv->snap_angle)
- priv->angle = gtk_image_view_get_snapped_angle (angle);
+ priv->angle = gtk_image_view_get_snapped_angle (angle);
else
- priv->angle = angle;
+ priv->angle = angle;
priv->size_valid = FALSE;
gtk_image_view_update_adjustments (image_view);
g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_ANGLE]);
+ widget_props[PROP_ANGLE]);
if (!priv->image_surface)
- return;
+ return;
if (priv->hadjustment && priv->vadjustment && !priv->fit_allocation)
- {
- int pointer_x = gtk_widget_get_allocated_width (GTK_WIDGET (image_view)) / 2;
- int pointer_y = gtk_widget_get_allocated_height (GTK_WIDGET (image_view)) / 2;
- gtk_image_view_fix_anchor (image_view,
- pointer_x,
- pointer_y,
- &state);
- }
+ {
+ int pointer_x = gtk_widget_get_allocated_width (GTK_WIDGET (image_view)) / 2;
+ int pointer_y = gtk_widget_get_allocated_height (GTK_WIDGET (image_view)) / 2;
+ gtk_image_view_fix_anchor (image_view,
+ pointer_x,
+ pointer_y,
+ &state);
+ }
if (priv->fit_allocation)
- gtk_widget_queue_draw (GTK_WIDGET (image_view));
+ gtk_widget_queue_draw (GTK_WIDGET (image_view));
else
- gtk_widget_queue_resize (GTK_WIDGET (image_view));
+ gtk_widget_queue_resize (GTK_WIDGET (image_view));
}
/**
@@ -1413,7 +1413,7 @@ gtk_image_view_get_angle (GtkImageView *image_view)
*/
void
gtk_image_view_set_snap_angle (GtkImageView *image_view,
- gboolean snap_angle)
+ gboolean snap_angle)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -1422,18 +1422,18 @@ gtk_image_view_set_snap_angle (GtkImageView *image_view,
snap_angle = !!snap_angle;
if (snap_angle == priv->snap_angle)
- return;
+ return;
priv->snap_angle = snap_angle;
g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SNAP_ANGLE]);
+ widget_props[PROP_SNAP_ANGLE]);
if (priv->snap_angle)
- {
- gtk_image_view_do_snapping (image_view);
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_ANGLE]);
- }
+ {
+ gtk_image_view_do_snapping (image_view);
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_ANGLE]);
+ }
}
/**
@@ -1470,7 +1470,7 @@ gtk_image_view_get_snap_angle (GtkImageView *image_view)
*/
void
gtk_image_view_set_fit_allocation (GtkImageView *image_view,
- gboolean fit_allocation)
+ gboolean fit_allocation)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
@@ -1478,23 +1478,23 @@ gtk_image_view_set_fit_allocation (GtkImageView *image_view,
fit_allocation = !!fit_allocation;
if (fit_allocation == priv->fit_allocation)
- return;
+ return;
priv->fit_allocation = fit_allocation;
g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_FIT_ALLOCATION]);
+ widget_props[PROP_FIT_ALLOCATION]);
priv->scale_set = FALSE;
priv->size_valid = FALSE;
g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE_SET]);
+ widget_props[PROP_SCALE_SET]);
if (!priv->fit_allocation)
- {
- priv->scale = 1.0;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_SCALE]);
- }
+ {
+ priv->scale = 1.0;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_SCALE]);
+ }
gtk_image_view_update_adjustments (image_view);
@@ -1528,7 +1528,7 @@ gtk_image_view_get_fit_allocation (GtkImageView *image_view)
*/
void
gtk_image_view_set_rotatable (GtkImageView *image_view,
- gboolean rotatable)
+ gboolean rotatable)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
@@ -1536,12 +1536,12 @@ gtk_image_view_set_rotatable (GtkImageView *image_view,
rotatable = !!rotatable;
if (priv->rotatable != rotatable)
- {
- priv->rotatable = rotatable;
- gtk_image_view_ensure_gestures (image_view);
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_ROTATABLE]);
- }
+ {
+ priv->rotatable = rotatable;
+ gtk_image_view_ensure_gestures (image_view);
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_ROTATABLE]);
+ }
}
/**
@@ -1571,7 +1571,7 @@ gtk_image_view_get_rotatable (GtkImageView *image_view)
*/
void
gtk_image_view_set_zoomable (GtkImageView *image_view,
- gboolean zoomable)
+ gboolean zoomable)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
@@ -1579,12 +1579,12 @@ gtk_image_view_set_zoomable (GtkImageView *image_view,
zoomable = !!zoomable;
if (zoomable != priv->zoomable)
- {
- priv->zoomable = zoomable;
- gtk_image_view_ensure_gestures (image_view);
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_ZOOMABLE]);
- }
+ {
+ priv->zoomable = zoomable;
+ gtk_image_view_ensure_gestures (image_view);
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_ZOOMABLE]);
+ }
}
/**
@@ -1615,7 +1615,7 @@ gtk_image_view_get_zoomable (GtkImageView *image_view)
*/
void
gtk_image_view_set_transitions_enabled (GtkImageView *image_view,
- gboolean transitions_enabled)
+ gboolean transitions_enabled)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
@@ -1623,11 +1623,11 @@ gtk_image_view_set_transitions_enabled (GtkImageView *image_view,
transitions_enabled = !!transitions_enabled;
if (transitions_enabled != priv->transitions_enabled)
- {
- priv->transitions_enabled = transitions_enabled;
- g_object_notify_by_pspec (G_OBJECT (image_view),
- widget_props[PROP_TRANSITIONS_ENABLED]);
- }
+ {
+ priv->transitions_enabled = transitions_enabled;
+ g_object_notify_by_pspec (G_OBJECT (image_view),
+ widget_props[PROP_TRANSITIONS_ENABLED]);
+ }
}
/**
@@ -1679,12 +1679,12 @@ gtk_image_view_realize (GtkWidget *widget)
attributes.height = allocation.height;
attributes.window_type = GDK_WINDOW_CHILD;
attributes.event_mask = gtk_widget_get_events (widget) |
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_SMOOTH_SCROLL_MASK |
- GDK_SCROLL_MASK |
- GDK_TOUCH_MASK;
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_SMOOTH_SCROLL_MASK |
+ GDK_SCROLL_MASK |
+ GDK_TOUCH_MASK;
attributes.wclass = GDK_INPUT_ONLY;
window = gtk_widget_get_parent_window (widget);
@@ -1693,7 +1693,7 @@ gtk_image_view_realize (GtkWidget *widget)
g_object_ref (G_OBJECT (window));
window = gdk_window_new (gtk_widget_get_parent_window (widget),
- &attributes, GDK_WA_X | GDK_WA_Y);
+ &attributes, GDK_WA_X | GDK_WA_Y);
priv->event_window = window;
gtk_widget_register_window (widget, priv->event_window);
@@ -1706,18 +1706,18 @@ gtk_image_view_unrealize (GtkWidget *widget)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (GTK_IMAGE_VIEW (widget));
if (priv->event_window)
- {
- gtk_widget_unregister_window (widget, priv->event_window);
- gdk_window_destroy (priv->event_window);
- priv->event_window = NULL;
- }
+ {
+ gtk_widget_unregister_window (widget, priv->event_window);
+ gdk_window_destroy (priv->event_window);
+ priv->event_window = NULL;
+ }
GTK_WIDGET_CLASS (gtk_image_view_parent_class)->unrealize (widget);
}
static void
gtk_image_view_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
+ GtkAllocation *allocation)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -1725,14 +1725,14 @@ gtk_image_view_size_allocate (GtkWidget *widget,
gtk_widget_set_allocation (widget, allocation);
if (gtk_widget_get_realized (widget))
- {
- gdk_window_move_resize (priv->event_window,
- allocation->x, allocation->y,
- allocation->width, allocation->height);
- }
+ {
+ gdk_window_move_resize (priv->event_window,
+ allocation->x, allocation->y,
+ allocation->width, allocation->height);
+ }
if (priv->fit_allocation)
- priv->size_valid = FALSE;
+ priv->size_valid = FALSE;
gtk_image_view_update_adjustments (image_view);
}
@@ -1743,10 +1743,10 @@ gtk_image_view_map (GtkWidget *widget)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (GTK_IMAGE_VIEW (widget));
if (priv->is_animation)
- gtk_image_view_start_animation (GTK_IMAGE_VIEW (widget));
+ gtk_image_view_start_animation (GTK_IMAGE_VIEW (widget));
if (priv->event_window)
- gdk_window_show (priv->event_window);
+ gdk_window_show (priv->event_window);
GTK_WIDGET_CLASS (gtk_image_view_parent_class)->map (widget);
}
@@ -1757,14 +1757,14 @@ gtk_image_view_unmap (GtkWidget *widget)
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (GTK_IMAGE_VIEW (widget));
if (priv->is_animation)
- gtk_image_view_stop_animation (GTK_IMAGE_VIEW (widget));
+ gtk_image_view_stop_animation (GTK_IMAGE_VIEW (widget));
GTK_WIDGET_CLASS (gtk_image_view_parent_class)->unmap (widget);
}
static void
adjustment_value_changed_cb (GtkAdjustment *adjustment,
- gpointer user_data)
+ gpointer user_data)
{
GtkImageView *image_view = user_data;
@@ -1775,58 +1775,58 @@ adjustment_value_changed_cb (GtkAdjustment *adjustment,
static void
gtk_image_view_get_preferred_height (GtkWidget *widget,
- int *minimal,
- int *natural)
+ int *minimal,
+ int *natural)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
double width, height;
gtk_image_view_compute_bounding_box (image_view,
- &width,
- &height,
- NULL);
+ &width,
+ &height,
+ NULL);
if (priv->fit_allocation)
- {
- *minimal = 0;
- *natural = height;
- }
+ {
+ *minimal = 0;
+ *natural = height;
+ }
else
- {
- *minimal = height;
- *natural = height;
- }
+ {
+ *minimal = height;
+ *natural = height;
+ }
}
static void
gtk_image_view_get_preferred_width (GtkWidget *widget,
- int *minimal,
- int *natural)
+ int *minimal,
+ int *natural)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
double width, height;
gtk_image_view_compute_bounding_box (image_view,
- &width,
- &height,
- NULL);
+ &width,
+ &height,
+ NULL);
if (priv->fit_allocation)
- {
- *minimal = 0;
- *natural = width;
- }
+ {
+ *minimal = 0;
+ *natural = width;
+ }
else
- {
- *minimal = width;
- *natural = width;
- }
+ {
+ *minimal = width;
+ *natural = width;
+ }
}
static gboolean
gtk_image_view_scroll_event (GtkWidget *widget,
- GdkEventScroll *event)
+ GdkEventScroll *event)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -1834,126 +1834,126 @@ gtk_image_view_scroll_event (GtkWidget *widget,
State state;
if (!priv->image_surface ||
- !priv->zoomable)
- return GDK_EVENT_PROPAGATE;
+ !priv->zoomable)
+ return GDK_EVENT_PROPAGATE;
if (event->state & GDK_SHIFT_MASK ||
- event->state & GDK_CONTROL_MASK)
- return GDK_EVENT_PROPAGATE;
+ event->state & GDK_CONTROL_MASK)
+ return GDK_EVENT_PROPAGATE;
gtk_image_view_get_current_state (image_view, &state);
gtk_image_view_set_scale_internal (image_view, new_scale);
if (priv->hadjustment && priv->vadjustment)
- {
- gtk_image_view_fix_anchor (image_view,
- event->x,
- event->y,
- &state);
- }
+ {
+ gtk_image_view_fix_anchor (image_view,
+ event->x,
+ event->y,
+ &state);
+ }
return GDK_EVENT_STOP;
}
static void
gtk_image_view_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
GtkImageView *image_view = (GtkImageView *) object;
switch (prop_id)
- {
- case PROP_SCALE:
- gtk_image_view_set_scale (image_view, g_value_get_double (value));
- break;
- case PROP_ANGLE:
- gtk_image_view_set_angle (image_view, g_value_get_double (value));
- break;
- case PROP_SNAP_ANGLE:
- gtk_image_view_set_snap_angle (image_view, g_value_get_boolean (value));
- break;
- case PROP_FIT_ALLOCATION:
- gtk_image_view_set_fit_allocation (image_view, g_value_get_boolean (value));
- break;
- case PROP_ROTATABLE:
- gtk_image_view_set_rotatable (image_view, g_value_get_boolean (value));
- break;
- case PROP_ZOOMABLE:
- gtk_image_view_set_zoomable (image_view, g_value_get_boolean (value));
- break;
- case PROP_TRANSITIONS_ENABLED:
- gtk_image_view_set_transitions_enabled (image_view, g_value_get_boolean (value));
- break;
- case PROP_HADJUSTMENT:
- gtk_image_view_set_hadjustment (image_view, g_value_get_object (value));
- break;
- case PROP_VADJUSTMENT:
- gtk_image_view_set_vadjustment (image_view, g_value_get_object (value));
- break;
- case PROP_HSCROLL_POLICY:
- gtk_image_view_set_hscroll_policy (image_view, g_value_get_enum (value));
- break;
- case PROP_VSCROLL_POLICY:
- gtk_image_view_set_vscroll_policy (image_view, g_value_get_enum (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
+ {
+ case PROP_SCALE:
+ gtk_image_view_set_scale (image_view, g_value_get_double (value));
+ break;
+ case PROP_ANGLE:
+ gtk_image_view_set_angle (image_view, g_value_get_double (value));
+ break;
+ case PROP_SNAP_ANGLE:
+ gtk_image_view_set_snap_angle (image_view, g_value_get_boolean (value));
+ break;
+ case PROP_FIT_ALLOCATION:
+ gtk_image_view_set_fit_allocation (image_view, g_value_get_boolean (value));
+ break;
+ case PROP_ROTATABLE:
+ gtk_image_view_set_rotatable (image_view, g_value_get_boolean (value));
+ break;
+ case PROP_ZOOMABLE:
+ gtk_image_view_set_zoomable (image_view, g_value_get_boolean (value));
+ break;
+ case PROP_TRANSITIONS_ENABLED:
+ gtk_image_view_set_transitions_enabled (image_view, g_value_get_boolean (value));
+ break;
+ case PROP_HADJUSTMENT:
+ gtk_image_view_set_hadjustment (image_view, g_value_get_object (value));
+ break;
+ case PROP_VADJUSTMENT:
+ gtk_image_view_set_vadjustment (image_view, g_value_get_object (value));
+ break;
+ case PROP_HSCROLL_POLICY:
+ gtk_image_view_set_hscroll_policy (image_view, g_value_get_enum (value));
+ break;
+ case PROP_VSCROLL_POLICY:
+ gtk_image_view_set_vscroll_policy (image_view, g_value_get_enum (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
gtk_image_view_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
GtkImageView *image_view = (GtkImageView *)object;
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
switch (prop_id)
- {
- case PROP_SCALE:
- g_value_set_double (value, priv->scale);
- break;
- case PROP_SCALE_SET:
- g_value_set_boolean (value, priv->scale_set);
- break;
- case PROP_ANGLE:
- g_value_set_double (value, priv->angle);
- break;
- case PROP_SNAP_ANGLE:
- g_value_set_boolean (value, priv->snap_angle);
- break;
- case PROP_FIT_ALLOCATION:
- g_value_set_boolean (value, priv->fit_allocation);
- break;
- case PROP_ROTATABLE:
- g_value_set_boolean (value, priv->rotatable);
- break;
- case PROP_ZOOMABLE:
- g_value_set_boolean (value, priv->zoomable);
- break;
- case PROP_TRANSITIONS_ENABLED:
- g_value_set_boolean (value, priv->transitions_enabled);
- break;
- case PROP_HADJUSTMENT:
- g_value_set_object (value, priv->hadjustment);
- break;
- case PROP_VADJUSTMENT:
- g_value_set_object (value, priv->vadjustment);
- break;
- case PROP_HSCROLL_POLICY:
- g_value_set_enum (value, priv->hscroll_policy);
- break;
- case PROP_VSCROLL_POLICY:
- g_value_set_enum (value, priv->vscroll_policy);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- }
+ {
+ case PROP_SCALE:
+ g_value_set_double (value, priv->scale);
+ break;
+ case PROP_SCALE_SET:
+ g_value_set_boolean (value, priv->scale_set);
+ break;
+ case PROP_ANGLE:
+ g_value_set_double (value, priv->angle);
+ break;
+ case PROP_SNAP_ANGLE:
+ g_value_set_boolean (value, priv->snap_angle);
+ break;
+ case PROP_FIT_ALLOCATION:
+ g_value_set_boolean (value, priv->fit_allocation);
+ break;
+ case PROP_ROTATABLE:
+ g_value_set_boolean (value, priv->rotatable);
+ break;
+ case PROP_ZOOMABLE:
+ g_value_set_boolean (value, priv->zoomable);
+ break;
+ case PROP_TRANSITIONS_ENABLED:
+ g_value_set_boolean (value, priv->transitions_enabled);
+ break;
+ case PROP_HADJUSTMENT:
+ g_value_set_object (value, priv->hadjustment);
+ break;
+ case PROP_VADJUSTMENT:
+ g_value_set_object (value, priv->vadjustment);
+ break;
+ case PROP_HSCROLL_POLICY:
+ g_value_set_enum (value, priv->hscroll_policy);
+ break;
+ case PROP_VSCROLL_POLICY:
+ g_value_set_enum (value, priv->vscroll_policy);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
}
static void
@@ -1973,7 +1973,7 @@ gtk_image_view_finalize (GObject *object)
g_clear_object (&priv->vadjustment);
if (priv->image_surface)
- cairo_surface_destroy (priv->image_surface);
+ cairo_surface_destroy (priv->image_surface);
G_OBJECT_CLASS (gtk_image_view_parent_class)->finalize (object);
}
@@ -2004,12 +2004,12 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_SCALE] = g_param_spec_double ("scale",
- "Scale",
- "The scale the internal surface gets drawn with",
- 0.0,
- G_MAXDOUBLE,
- 1.0,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Scale",
+ "The scale the internal surface gets drawn with",
+ 0.0,
+ G_MAXDOUBLE,
+ 1.0,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:scale-set:
* Whether or not the current value of the scale property was set by the user.
@@ -2019,10 +2019,10 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_SCALE_SET] = g_param_spec_boolean ("scale-set",
- "Scale Set",
- "Wheter the scale property has been set by the user or by GtkImageView itself",
- FALSE,
- _PARAM_READABLE|G_PARAM_EXPLICIT_NOTIFY);
+ "Scale Set",
+ "Wheter the scale property has been set by the user or by GtkImageView itself",
+ FALSE,
+ _PARAM_READABLE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:angle:
* The angle the surface gets rotated about.
@@ -2030,22 +2030,22 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_ANGLE] = g_param_spec_double ("angle",
- "Angle",
- "The angle the internal surface gets rotated about",
- 0.0,
- 360.0,
- 0.0,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Angle",
+ "The angle the internal surface gets rotated about",
+ 0.0,
+ 360.0,
+ 0.0,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:rotatable:
* Whether or not the image can be rotated using a two-finger rotate gesture.
*
*/
widget_props[PROP_ROTATABLE] = g_param_spec_boolean ("rotatable",
- "Rotatable",
- "Controls user-rotatability",
- TRUE,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Rotatable",
+ "Controls user-rotatability",
+ TRUE,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:zoomable:
* Whether or not the image can be scaled using a two-finger zoom gesture, as well as
@@ -2053,10 +2053,10 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_ZOOMABLE] = g_param_spec_boolean ("zoomable",
- "Zoomable",
- "Controls user-zoomability",
- TRUE,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Zoomable",
+ "Controls user-zoomability",
+ TRUE,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:snap-angle:
* Whether or not the angle property snaps to 90° steps. If this is enabled
@@ -2066,10 +2066,10 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_SNAP_ANGLE] = g_param_spec_boolean ("snap-angle",
- "Snap Angle",
- "Snap angle to 90° steps",
- FALSE,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Snap Angle",
+ "Snap angle to 90° steps",
+ FALSE,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:fit-allocation:
@@ -2079,10 +2079,10 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_FIT_ALLOCATION] = g_param_spec_boolean ("fit-allocation",
- "Fit Allocation",
- "Scale the image down to fit into the widget allocation",
- FALSE,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Fit Allocation",
+ "Scale the image down to fit into the widget allocation",
+ FALSE,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkImageView:transitions-enabled
@@ -2097,10 +2097,10 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
*
*/
widget_props[PROP_TRANSITIONS_ENABLED] = g_param_spec_boolean ("transitions-enabled",
- "Transitions Enabled",
- "Whether scale and angle changes get interpolated",
- TRUE,
- _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ "Transitions Enabled",
+ "Whether scale and angle changes get interpolated",
+ TRUE,
+ _PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties (object_class, LAST_WIDGET_PROPERTY, widget_props);
@@ -2125,30 +2125,30 @@ gtk_image_view_new ()
static void
gtk_image_view_replace_surface (GtkImageView *image_view,
- cairo_surface_t *surface,
- int scale_factor)
+ cairo_surface_t *surface,
+ int scale_factor)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->image_surface)
- cairo_surface_destroy (priv->image_surface);
+ cairo_surface_destroy (priv->image_surface);
if (scale_factor == 0)
- priv->scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (image_view));
+ priv->scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (image_view));
else
- priv->scale_factor = scale_factor;
+ priv->scale_factor = scale_factor;
priv->image_surface = surface;
priv->size_valid = FALSE;
if (surface)
- cairo_surface_reference (priv->image_surface);
+ cairo_surface_reference (priv->image_surface);
}
static void
gtk_image_view_update_surface (GtkImageView *image_view,
- const GdkPixbuf *frame,
- int scale_factor)
+ const GdkPixbuf *frame,
+ int scale_factor)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
GdkWindow *window = gtk_widget_get_window (GTK_WIDGET (image_view));
@@ -2156,95 +2156,95 @@ gtk_image_view_update_surface (GtkImageView *image_view,
gboolean size_changed = TRUE;
new_surface = gdk_cairo_surface_create_from_pixbuf (frame,
- scale_factor,
- window);
+ scale_factor,
+ window);
if (priv->image_surface)
- {
- size_changed = (cairo_image_surface_get_width (priv->image_surface) !=
- cairo_image_surface_get_width (new_surface)) ||
- (cairo_image_surface_get_height (priv->image_surface) !=
- cairo_image_surface_get_height (new_surface)) ||
- (scale_factor != priv->scale_factor);
- }
+ {
+ size_changed = (cairo_image_surface_get_width (priv->image_surface) !=
+ cairo_image_surface_get_width (new_surface)) ||
+ (cairo_image_surface_get_height (priv->image_surface) !=
+ cairo_image_surface_get_height (new_surface)) ||
+ (scale_factor != priv->scale_factor);
+ }
gtk_image_view_replace_surface (image_view,
- new_surface,
- scale_factor);
+ new_surface,
+ scale_factor);
if (priv->fit_allocation || !size_changed)
- gtk_widget_queue_draw (GTK_WIDGET (image_view));
+ gtk_widget_queue_draw (GTK_WIDGET (image_view));
else
- gtk_widget_queue_resize (GTK_WIDGET (image_view));
+ gtk_widget_queue_resize (GTK_WIDGET (image_view));
g_assert (priv->image_surface != NULL);
}
static void
gtk_image_view_replace_animation (GtkImageView *image_view,
- GdkPixbufAnimation *animation,
- int scale_factor)
+ GdkPixbufAnimation *animation,
+ int scale_factor)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
if (priv->source_animation)
- {
- g_assert (priv->image_surface);
- if (priv->is_animation)
- {
- gtk_image_view_stop_animation (image_view);
- g_clear_object (&priv->source_animation_iter);
- }
- }
+ {
+ g_assert (priv->image_surface);
+ if (priv->is_animation)
+ {
+ gtk_image_view_stop_animation (image_view);
+ g_clear_object (&priv->source_animation_iter);
+ }
+ }
priv->is_animation = !gdk_pixbuf_animation_is_static_image (animation);
if (priv->is_animation)
- {
- priv->source_animation = animation;
- priv->source_animation_iter = gdk_pixbuf_animation_get_iter (priv->source_animation,
- NULL);
- gtk_image_view_update_surface (image_view,
- gtk_image_view_get_current_frame (image_view),
- scale_factor);
-
- gtk_image_view_start_animation (image_view);
- }
+ {
+ priv->source_animation = animation;
+ priv->source_animation_iter = gdk_pixbuf_animation_get_iter (priv->source_animation,
+ NULL);
+ gtk_image_view_update_surface (image_view,
+ gtk_image_view_get_current_frame (image_view),
+ scale_factor);
+
+ gtk_image_view_start_animation (image_view);
+ }
else
- {
- gtk_image_view_update_surface (image_view,
- gdk_pixbuf_animation_get_static_image (animation),
- scale_factor);
- g_object_unref (animation);
- }
+ {
+ gtk_image_view_update_surface (image_view,
+ gdk_pixbuf_animation_get_static_image (animation),
+ scale_factor);
+ g_object_unref (animation);
+ }
}
static void
gtk_image_view_load_image_from_stream (GtkImageView *image_view,
- GInputStream *input_stream,
- int scale_factor,
- GCancellable *cancellable,
- GError *error)
+ GInputStream *input_stream,
+ int scale_factor,
+ GCancellable *cancellable,
+ GError *error)
{
GdkPixbufAnimation *result;
g_assert (error == NULL);
result = gdk_pixbuf_animation_new_from_stream (input_stream,
- cancellable,
- &error);
+ cancellable,
+ &error);
if (!error)
- gtk_image_view_replace_animation (image_view, result, scale_factor);
+ gtk_image_view_replace_animation (image_view, result, scale_factor);
g_object_unref (input_stream);
}
static void
gtk_image_view_load_image_contents (GTask *task,
- gpointer source_object,
- gpointer task_data,
- GCancellable *cancellable)
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
{
GtkImageView *image_view = source_object;
LoadTaskData *data = task_data;
@@ -2255,31 +2255,31 @@ gtk_image_view_load_image_contents (GTask *task,
in_stream = g_file_read (file, cancellable, &error);
if (error)
- {
- /* in_stream is NULL */
- g_object_unref (file);
- g_task_return_error (task, error);
- return;
- }
+ {
+ /* in_stream is NULL */
+ g_object_unref (file);
+ g_task_return_error (task, error);
+ return;
+ }
/* Closes and unrefs the input stream */
gtk_image_view_load_image_from_stream (image_view,
- G_INPUT_STREAM (in_stream),
- data->scale_factor,
- cancellable,
- error);
+ G_INPUT_STREAM (in_stream),
+ data->scale_factor,
+ cancellable,
+ error);
if (error)
- g_task_return_error (task, error);
+ g_task_return_error (task, error);
else
- g_task_return_boolean (task, TRUE);
+ g_task_return_boolean (task, TRUE);
}
static void
gtk_image_view_load_from_input_stream (GTask *task,
- gpointer source_object,
- gpointer task_data,
- GCancellable *cancellable)
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
{
GtkImageView *image_view = source_object;
LoadTaskData *data = task_data;
@@ -2288,15 +2288,15 @@ gtk_image_view_load_from_input_stream (GTask *task,
/* Closes and unrefs the input stream */
gtk_image_view_load_image_from_stream (image_view,
- in_stream,
- data->scale_factor,
- cancellable,
- error);
+ in_stream,
+ data->scale_factor,
+ cancellable,
+ error);
if (error)
- g_task_return_error (task, error);
+ g_task_return_error (task, error);
else
- g_task_return_boolean (task, TRUE);
+ g_task_return_boolean (task, TRUE);
}
/**
@@ -2315,11 +2315,11 @@ gtk_image_view_load_from_input_stream (GTask *task,
*/
void
gtk_image_view_load_from_file_async (GtkImageView *image_view,
- GFile *file,
- int scale_factor,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+ GFile *file,
+ int scale_factor,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GTask *task;
LoadTaskData *task_data;
@@ -2353,8 +2353,8 @@ gtk_image_view_load_from_file_async (GtkImageView *image_view,
*/
gboolean
gtk_image_view_load_from_file_finish (GtkImageView *image_view,
- GAsyncResult *result,
- GError **error)
+ GAsyncResult *result,
+ GError **error)
{
g_return_val_if_fail (g_task_is_valid (result, image_view), FALSE);
@@ -2376,11 +2376,11 @@ gtk_image_view_load_from_file_finish (GtkImageView *image_view,
*/
void
gtk_image_view_load_from_stream_async (GtkImageView *image_view,
- GInputStream *input_stream,
- int scale_factor,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+ GInputStream *input_stream,
+ int scale_factor,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GTask *task;
LoadTaskData *task_data;
@@ -2412,8 +2412,8 @@ gtk_image_view_load_from_stream_async (GtkImageView *image_view,
*/
gboolean
gtk_image_view_load_from_stream_finish (GtkImageView *image_view,
- GAsyncResult *result,
- GError **error)
+ GAsyncResult *result,
+ GError **error)
{
g_return_val_if_fail (g_task_is_valid (result, image_view), FALSE);
@@ -2434,8 +2434,8 @@ gtk_image_view_load_from_stream_finish (GtkImageView *image_view,
*/
void
gtk_image_view_set_pixbuf (GtkImageView *image_view,
- const GdkPixbuf *pixbuf,
- int scale_factor)
+ const GdkPixbuf *pixbuf,
+ int scale_factor)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
@@ -2444,11 +2444,11 @@ gtk_image_view_set_pixbuf (GtkImageView *image_view,
g_return_if_fail (scale_factor >= 0);
if (priv->is_animation)
- {
- g_clear_object (&priv->source_animation);
- gtk_image_view_stop_animation (image_view);
- priv->is_animation = FALSE;
- }
+ {
+ g_clear_object (&priv->source_animation);
+ gtk_image_view_stop_animation (image_view);
+ priv->is_animation = FALSE;
+ }
gtk_image_view_update_surface (image_view, pixbuf, scale_factor);
@@ -2469,7 +2469,7 @@ gtk_image_view_set_pixbuf (GtkImageView *image_view,
*/
void
gtk_image_view_set_surface (GtkImageView *image_view,
- cairo_surface_t *surface)
+ cairo_surface_t *surface)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
double scale_x = 0.0;
@@ -2478,31 +2478,31 @@ gtk_image_view_set_surface (GtkImageView *image_view,
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
if (surface)
- {
- g_return_if_fail (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE);
+ {
+ g_return_if_fail (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE);
- cairo_surface_get_device_scale (surface, &scale_x, &scale_y);
+ cairo_surface_get_device_scale (surface, &scale_x, &scale_y);
- g_return_if_fail (scale_x == scale_y);
- }
+ g_return_if_fail (scale_x == scale_y);
+ }
if (priv->is_animation)
- {
- g_clear_object (&priv->source_animation);
- gtk_image_view_stop_animation (image_view);
- priv->is_animation = FALSE;
- }
+ {
+ g_clear_object (&priv->source_animation);
+ gtk_image_view_stop_animation (image_view);
+ priv->is_animation = FALSE;
+ }
gtk_image_view_replace_surface (image_view,
- surface,
- scale_x);
+ surface,
+ scale_x);
gtk_image_view_update_adjustments (image_view);
if (priv->fit_allocation)
- gtk_widget_queue_draw (GTK_WIDGET (image_view));
+ gtk_widget_queue_draw (GTK_WIDGET (image_view));
else
- gtk_widget_queue_resize (GTK_WIDGET (image_view));
+ gtk_widget_queue_resize (GTK_WIDGET (image_view));
}
/**
@@ -2519,8 +2519,8 @@ gtk_image_view_set_surface (GtkImageView *image_view,
*/
void
gtk_image_view_set_animation (GtkImageView *image_view,
- GdkPixbufAnimation *animation,
- int scale_factor)
+ GdkPixbufAnimation *animation,
+ int scale_factor)
{
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
g_return_if_fail (GDK_IS_PIXBUF_ANIMATION (animation));
diff --git a/libgtkimageview/gtkimageview.h b/libraries/libgtkimageview/gtkimageview.h
index e0161dfa..edd26fb3 100644
--- a/libgtkimageview/gtkimageview.h
+++ b/libraries/libgtkimageview/gtkimageview.h
@@ -53,71 +53,71 @@ GType gtk_image_view_get_type (void) G_GNUC_CONST;
GtkWidget * gtk_image_view_new (void);
void gtk_image_view_set_pixbuf (GtkImageView *image_view,
- const GdkPixbuf *pixbuf,
- int scale_factor);
+ const GdkPixbuf *pixbuf,
+ int scale_factor);
void gtk_image_view_set_surface (GtkImageView *image_view,
- cairo_surface_t *surface);
+ cairo_surface_t *surface);
void gtk_image_view_set_animation (GtkImageView *image_view,
- GdkPixbufAnimation *animation,
- int scale_factor);
+ GdkPixbufAnimation *animation,
+ int scale_factor);
void gtk_image_view_load_from_file_async (GtkImageView *image_view,
- GFile *file,
- int scale_factor,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
+ GFile *file,
+ int scale_factor,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
gboolean gtk_image_view_load_from_file_finish (GtkImageView *image_view,
- GAsyncResult *result,
- GError **error);
+ GAsyncResult *result,
+ GError **error);
void gtk_image_view_load_from_stream_async (GtkImageView *image_view,
- GInputStream *input_stream,
- int scale_factor,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
+ GInputStream *input_stream,
+ int scale_factor,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
gboolean gtk_image_view_load_from_stream_finish (GtkImageView *image_view,
- GAsyncResult *result,
- GError **error);
+ GAsyncResult *result,
+ GError **error);
void gtk_image_view_set_scale (GtkImageView *image_view,
- double scale);
+ double scale);
double gtk_image_view_get_scale (GtkImageView *image_view);
void gtk_image_view_set_angle (GtkImageView *image_view,
- double angle);
+ double angle);
double gtk_image_view_get_angle (GtkImageView *image_view);
void gtk_image_view_set_snap_angle (GtkImageView *image_view,
- gboolean snap_angle);
+ gboolean snap_angle);
gboolean gtk_image_view_get_snap_angle (GtkImageView *image_view);
void gtk_image_view_set_fit_allocation (GtkImageView *image_view,
- gboolean fit_allocation);
+ gboolean fit_allocation);
gboolean gtk_image_view_get_fit_allocation (GtkImageView *image_view);
void gtk_image_view_set_rotatable (GtkImageView *image_view,
- gboolean rotatable);
+ gboolean rotatable);
gboolean gtk_image_view_get_rotatable (GtkImageView *image_view);
void gtk_image_view_set_zoomable (GtkImageView *image_view,
- gboolean zoomable);
+ gboolean zoomable);
gboolean gtk_image_view_get_zoomable (GtkImageView *image_view);
gboolean gtk_image_view_get_scale_set (GtkImageView *image_view);
void gtk_image_view_set_transitions_enabled (GtkImageView *image_view,
- gboolean transitions_enabled);
+ gboolean transitions_enabled);
gboolean gtk_image_view_get_transitions_enabled (GtkImageView *image_view);
diff --git a/libraries/libgtkimageview/meson.build b/libraries/libgtkimageview/meson.build
new file mode 100644
index 00000000..9accd45a
--- /dev/null
+++ b/libraries/libgtkimageview/meson.build
@@ -0,0 +1,10 @@
+gtkimageview_inc = include_directories('.')
+gtkimageview_lib = static_library(
+ 'gtkimageview',
+ [
+ 'gtkimageview.c'
+ ],
+ dependencies: [
+ gtk
+ ]
+)
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..c9168b62
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,296 @@
+project('feedreader', ['vala', 'c'],
+ version: '2.2-dev',
+ meson_version: '>= 0.44.1',
+ license: 'GPL-3.0',
+ default_options: ['prefix=/usr']
+)
+
+# Constants (paths)
+VAPI_DIR = join_paths(meson.current_source_dir(), 'vapi')
+PO_DIR = join_paths(meson.current_source_dir(), 'po')
+SHARE_DIR = join_paths(get_option('prefix'),
+ get_option('datadir'))
+DATA_DIR = join_paths(get_option('prefix'),
+ get_option('datadir'),
+ meson.project_name())
+LOCALE_DIR = join_paths(get_option('prefix'),
+ get_option('localedir'))
+PKGLIBDIR = join_paths(get_option('prefix'),
+ get_option('libdir'),
+ meson.project_name())
+SHARE_PLUGINS_DIR = join_paths(PKGLIBDIR, 'pluginsShare')
+BACKEND_PLUGINS_DIR = join_paths(PKGLIBDIR, 'plugins')
+
+# Define the vapi dir
+add_project_arguments(['--vapidir=' + VAPI_DIR], language: 'vala')
+
+# Modules
+gnome = import('gnome')
+i18n = import('i18n')
+
+# Compilers
+vala_compiler = meson.get_compiler('vala')
+c_compiler = meson.get_compiler('c')
+
+# Other tools
+gtester = find_program('gtester', required:false)
+
+# Dependencies
+gdk_pixbuf = dependency('gdk-pixbuf-2.0')
+gee = dependency('gee-0.8')
+glib = dependency('glib-2.0')
+goa = dependency('goa-1.0')
+gstreamer = dependency('gstreamer-1.0')
+gstreamer_pbutils = dependency('gstreamer-pbutils-1.0')
+gtk = dependency('gtk+-3.0', version: '>=3.22')
+json_glib = dependency('json-glib-1.0')
+libcurl = c_compiler.find_library('libcurl')
+libnotify = dependency('libnotify')
+libpeas = dependency('libpeas-1.0')
+libsecret = dependency('libsecret-1')
+libsoup = dependency('libsoup-2.4')
+libxml = dependency('libxml-2.0')
+linux = vala_compiler.find_library('linux')
+posix = vala_compiler.find_library('posix')
+rest = dependency('rest-0.7')
+sqlite3 = dependency('sqlite3')
+webkit2gtk = dependency('webkit2gtk-4.0')
+webkitextension = dependency('webkit2gtk-web-extension-4.0')
+libunity = dependency('unity', required: false)
+
+# Configuration
+conf = configuration_data()
+conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
+conf.set('PREFIX', get_option('prefix'))
+conf.set('VERSION', meson.project_version())
+conf.set('LOCALE_DIR', LOCALE_DIR)
+conf.set('PKGDATADIR', DATA_DIR)
+conf.set('PKGLIBDIR', PKGLIBDIR)
+
+intermediate = configure_file(
+ input: 'Constants.vala.in',
+ output: 'Constants.intermediate.vala',
+ configuration: conf)
+
+constants = vcs_tag(
+ input : intermediate,
+ output : 'Constants.vala',
+ command : ['git', 'show-ref', '-s', 'refs/heads/master'],
+ replace_string: '#GIT_SHA1#')
+
+
+
+# Build libraries
+subdir('libraries/libgd')
+subdir('libraries/libgtkimageview')
+subdir('libraries/libIvy')
+subdir('libraries/libVilistextum')
+subdir('libraries/WebExtension')
+subdir('data')
+
+
+# VAPI's
+libgd_vapi = vala_compiler.find_library('gd-1.0', dirs: VAPI_DIR)
+gtkimageview_vapi = vala_compiler.find_library('gtkimageview', dirs: VAPI_DIR)
+libvilistextum_vapi = vala_compiler.find_library('libvilistextum', dirs: VAPI_DIR)
+
+# libVilistextum
+libvilistextum = declare_dependency(
+ link_with: vilistextum_lib,
+ include_directories: vilistextum_inc,
+ dependencies: libvilistextum_vapi
+)
+
+# libgd
+libgd = declare_dependency(
+ link_with: gd_lib,
+ include_directories: gd_inc,
+ dependencies: [libgd_vapi]
+)
+
+# GtkImageView
+libgtkimageview = declare_dependency(
+ link_with: gtkimageview_lib,
+ include_directories: gtkimageview_inc,
+ dependencies: [
+ gtkimageview_vapi,
+ c_compiler.find_library('m', required: false)
+ ]
+)
+
+# libIvy
+libivy = declare_dependency(
+ link_with: ivy_lib,
+ include_directories: ivy_inc
+)
+
+vala_sources = [
+ constants,
+ 'src/FavIcon.vala',
+ 'src/FeedReader.vala',
+ 'src/Password.vala',
+ 'src/SQLite.vala',
+ 'src/Widgets/AddPopover.vala',
+ 'src/Widgets/ArticleRow.vala',
+ 'src/Widgets/ArticleView.vala',
+ 'src/Widgets/ArticleViewHeader.vala',
+ 'src/Widgets/ArticleViewLoadProgress.vala',
+ 'src/Widgets/ArticleViewUrlOverlay.vala',
+ 'src/Widgets/BackendInfoPopover.vala',
+ 'src/Widgets/CategorieRow.vala',
+ 'src/Widgets/ColorCircle.vala',
+ 'src/Widgets/ColorPopover.vala',
+ 'src/Widgets/ColumnView.vala',
+ 'src/Widgets/ColumnViewHeader.vala',
+ 'src/Widgets/FeedList.vala',
+ 'src/Widgets/FeedListFooter.vala',
+ 'src/Widgets/FeedRow.vala',
+ 'src/Widgets/FullscreenButton.vala',
+ 'src/Widgets/FullscreenHeader.vala',
+ 'src/Widgets/HoverButton.vala',
+ 'src/Widgets/ImagePopup.vala',
+ 'src/Widgets/InAppNotification.vala',
+ 'src/Widgets/InfoBar.vala',
+ 'src/Widgets/LoginPage.vala',
+ 'src/Widgets/LoginRow.vala',
+ 'src/Widgets/MainWindow.vala',
+ 'src/Widgets/MediaPlayer.vala',
+ 'src/Widgets/MediaButton.vala',
+ 'src/Widgets/MediaRow.vala',
+ 'src/Widgets/ModeButton.vala',
+ 'src/Widgets/RemovePopover.vala',
+ 'src/Widgets/ResetPage.vala',
+ 'src/Widgets/ServiceSettingsPopover.vala',
+ 'src/Widgets/ShareRow.vala',
+ 'src/Widgets/ShortcutsWindow.vala',
+ 'src/Widgets/ServiceInfo.vala',
+ 'src/Widgets/Setting.vala',
+ 'src/Widgets/SettingsDialog.vala',
+ 'src/Widgets/SharePopover.vala',
+ 'src/Widgets/SimpleHeader.vala',
+ 'src/Widgets/SpringCleanPage.vala',
+ 'src/Widgets/TagRow.vala',
+ 'src/Widgets/TagPopover.vala',
+ 'src/Widgets/TagPopoverRow.vala',
+ 'src/Widgets/UpdateButton.vala',
+ 'src/Widgets/WebLoginPage.vala',
+ 'src/Widgets/ArticleList/ArticleList.vala',
+ 'src/Widgets/ArticleList/ArticleListBox.vala',
+ 'src/Widgets/ArticleList/ArticleListEmptyLabel.vala',
+ 'src/Widgets/ArticleList/ArticleListScroll.vala',
+ 'src/Share/share.vala',
+ 'src/Share/ServiceSetup.vala',
+ 'src/Share/ShareAccountInterface.vala',
+ 'src/Logger.vala',
+ 'src/Enums.vala',
+ 'src/FuncUtils.vala',
+ 'src/DataBaseReadOnly.vala',
+ 'src/ListUtils.vala',
+ 'src/Settings.vala',
+ 'src/StringUtils.vala',
+ 'src/Structs.vala',
+ 'src/Utils.vala',
+ 'src/QueryBuilder.vala',
+ 'src/ContentGrabber/grabberUtils.vala',
+ 'src/ContentGrabber/stringPair.vala',
+ 'src/Model/Feed.vala',
+ 'src/Model/Category.vala',
+ 'src/Model/Enclosure.vala',
+ 'src/Model/Article.vala',
+ 'src/Model/Tag.vala',
+ 'src/Model/CachedAction.vala',
+ 'src/Model/InterfaceState.vala',
+ 'src/Model/ShareAccount.vala',
+ 'src/ActionCache.vala',
+ 'src/Backend/Backend.vala',
+ 'src/DataBaseWriteAccess.vala',
+ 'src/Notification.vala',
+ 'src/CachedActionManager.vala',
+ 'src/Backend/FeedServer.vala',
+ 'src/Backend/FeedServerInterface.vala',
+ 'src/Backend/OPMLparser.vala',
+ 'src/ContentGrabber/grabberConfig.vala',
+ 'src/ContentGrabber/grabber.vala'
+]
+
+
+c_args = [
+ '-g',
+ '-w',
+ '-rdynamic',
+ '-DVERSION="' + meson.project_version() + '"',
+ '-DGETTEXT_PACKAGE="'+ meson.project_name() +'"',
+ '-DGNOMELOCALEDIR="' + LOCALE_DIR + '"',
+ '-DGOA_API_IS_SUBJECT_TO_CHANGE'
+]
+
+vala_args = [
+ '--enable-experimental',
+ '--target-glib','2.50'
+]
+
+feedreader_deps = [
+ glib,
+ gtk,
+ json_glib,
+ libsoup,
+ sqlite3,
+ gee,
+ libsecret,
+ rest,
+ webkit2gtk,
+ gstreamer,
+ gstreamer_pbutils,
+ libpeas,
+ libxml,
+ goa,
+ posix,
+ libivy,
+ libgtkimageview,
+ libvilistextum,
+ libgd
+ ]
+
+
+if libunity.found()
+ message('libUnity support ON')
+ feedreader_deps += [ libunity ]
+ vala_args += ['-D', 'LIBUNITY']
+else
+ message('libUnity support OFF')
+endif
+
+# The shared lib for plugins
+feedreader_lib = shared_library(
+ 'FeedReader',
+ vala_sources,
+ c_args: c_args,
+ vala_args: vala_args,
+ vala_header: 'FeedReader.h',
+ vala_vapi: 'FeedReader.vapi',
+ dependencies: feedreader_deps,
+ install: true
+)
+
+c_args = c_args + ['-include','FeedReader.h',]
+
+# Build plugins and data files
+subdir('plugins')
+subdir('schemas')
+subdir('po')
+
+# Create an executable file
+executable(
+ 'feedreader',
+ UI_RESOURCES + ['src/FeedReaderMain.vala'],
+ c_args: c_args,
+ vala_args: vala_args,
+ link_with: [
+ feedreader_lib
+ ],
+ dependencies: feedreader_deps,
+ install: true
+)
+
+# Post install script
+meson.add_install_script('meson_post_install.py')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000..d8d89320
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,12 @@
+option('share-plugins',
+ type: 'array',
+ choices : ['browser', 'email', 'instapaper', 'pocket', 'telegram', 'twitter', 'wallabag'],
+ value : ['browser', 'email', 'instapaper', 'pocket', 'telegram', 'twitter', 'wallabag'],
+ description: 'List of share plugins to install'
+)
+option('backend-plugins',
+ type: 'array',
+ choices: ['bazqux', 'feedbin', 'feedhq', 'feedly', 'fresh', 'inoreader', 'local', 'oldreader', 'owncloud', 'ttrss'],
+ value : ['bazqux', 'feedbin', 'feedhq', 'feedly', 'fresh', 'inoreader', 'local', 'oldreader', 'owncloud', 'ttrss'],
+ description: 'List of backend plugins to install'
+)
diff --git a/meson_post_install.py b/meson_post_install.py
new file mode 100755
index 00000000..0113f34e
--- /dev/null
+++ b/meson_post_install.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python3
+
+from os import environ, path
+from subprocess import call
+
+prefix = environ.get('MESON_INSTALL_PREFIX', '/usr/local')
+datadir = path.join(prefix, 'share')
+destdir = environ.get('DESTDIR', '')
+
+if not destdir:
+ print('Updating icon cache...')
+ icons_dir = path.join(datadir, 'icons', 'hicolor')
+ call(['gtk-update-icon-cache', '-qtf', icons_dir])
+ print("Installing new Schemas")
+ schemas_dir = path.join(datadir, 'glib-2.0/schemas')
+ call(['glib-compile-schemas', schemas_dir])
+ apps_dir = path.join(datadir, 'applications')
+ call(['update-desktop-database', apps_dir])
diff --git a/org.gnome.FeedReader.json b/org.gnome.FeedReader.json
new file mode 100644
index 00000000..770af971
--- /dev/null
+++ b/org.gnome.FeedReader.json
@@ -0,0 +1,81 @@
+{
+ "app-id": "org.gnome.FeedReader",
+ "runtime": "org.gnome.Platform",
+ "runtime-version": "3.28",
+ "sdk": "org.gnome.Sdk",
+ "command": "feedreader",
+ "finish-args": [
+ /* Play sounds */
+ "--socket=pulseaudio",
+ /* Access to X11 and XShm (video playback) */
+ "--socket=x11",
+ "--share=ipc",
+ /* Access to Wayland */
+ "--socket=wayland",
+ /* Access to OpenGL */
+ "--device=dri",
+ /* Access to Network */
+ "--share=network",
+ /* Needed for dconf to work */
+ "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro",
+ "--talk-name=ca.desrt.dconf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf",
+ "--talk-name=org.gnome.OnlineAccounts",
+ "--own-name=org.gnome.FeedReader.ArticleView",
+ "--talk-name=org.freedesktop.Notifications",
+ "--talk-name=org.freedesktop.secrets"
+ ],
+ "build-options": {
+ "cflags": "-O2 -g -w",
+ "cxxflags": "-O2 -g",
+ "env": {
+ "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_GIRDIR": "/app/share/gir-1.0",
+ "PKG_CONFIG_GOBJECT_INTROSPECTION_1_0_TYPELIBDIR": "/app/lib/girepository-1.0"
+ }
+ },
+ "modules": [{
+ "name": "libgee",
+ "cleanup": ["/include", "*.la", "/lib/pkgconfig", "/share"],
+ "sources": [{
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/libgee/0.20/libgee-0.20.1.tar.xz",
+ "sha256": "bb2802d29a518e8c6d2992884691f06ccfcc25792a5686178575c7111fea4630"
+ }]
+ }, {
+ "name": "rest",
+ "config-opts": ["--disable-introspection", "--disable-gtk-doc", "--disable-gtk-doc-html"],
+ "cleanup": ["/include", "*.la", "/lib/pkgconfig", "/share"],
+ "sources": [{
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/rest/0.8/rest-0.8.1.tar.xz",
+ "sha256": "0513aad38e5d3cedd4ae3c551634e3be1b9baaa79775e53b2dba9456f15b01c9"
+ }]
+ }, {
+ "name": "libpeas",
+ "config-opts": ["--disable-gtk-doc", "--disable-gtk-doc-html", "--disable-gtk"],
+ "cleanup": ["/include", "*.la", "/lib/pkgconfig"],
+ "sources": [{
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/libpeas/1.22/libpeas-1.22.0.tar.xz",
+ "sha256": "5b2fc0f53962b25bca131a5ec0139e6fef8e254481b6e777975f7a1d2702a962"
+ }]
+ },
+ {
+ "name": "gnome-online-accounts",
+ "config-opts": ["--disable-telepathy", "--disable-documentation", "--disable-backend"],
+ "sources": [{
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/gnome-online-accounts/3.28/gnome-online-accounts-3.28.0.tar.xz",
+ "sha256": "87bc4ef307604f1ce4f09f6e5c9996ef8d37ca5e0a3bf76f6b27d71844adb40c"
+ }]
+ },
+ {
+ "name": "feedreader",
+ "buildsystem": "meson",
+ "config-opts": ["--buildtype=release"],
+ "sources": [{
+ "type": "git",
+ "url": "https://github.com/jangernert/FeedReader.git"
+ }]
+ }
+ ]
+}
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
deleted file mode 100644
index e27a0232..00000000
--- a/plugins/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-add_subdirectory(backend)
-add_subdirectory(share)
diff --git a/plugins/backend/CMakeLists.txt b/plugins/backend/CMakeLists.txt
deleted file mode 100644
index 4ad87235..00000000
--- a/plugins/backend/CMakeLists.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-option(TTRSS "Enable Tiny Tiny RSS backend" ON)
-option(OWNCLOUD "Enable ownCloud News backend" ON)
-option(INOREADER "Enable InoReader backend" ON)
-option(FEEDLY "Enable feedly backend" ON)
-option(OLDREADER "Enable The Old Reader backend" ON)
-option(LOCAL "Enable local RSS backend" ON)
-option(FRESH "Enable FreshRSS backend" ON)
-option(FEEDBIN "Enable Feedbin backend" ON)
-
-MESSAGE(STATUS "Backend TTRSS: " ${TTRSS})
-MESSAGE(STATUS "Backend OWNCLOUD: " ${OWNCLOUD})
-MESSAGE(STATUS "Backend INOREADER: " ${INOREADER})
-MESSAGE(STATUS "Backend FEEDLY: " ${FEEDLY})
-MESSAGE(STATUS "Backend OLDREADER: " ${OLDREADER})
-MESSAGE(STATUS "Backend LOCAL: " ${LOCAL})
-MESSAGE(STATUS "Backend FRESH: " ${FRESH})
-MESSAGE(STATUS "Backend FEEDBIN: " ${FEEDBIN})
-
-
-if(TTRSS)
- add_subdirectory(ttrss)
-endif(TTRSS)
-
-if(OWNCLOUD)
- add_subdirectory(owncloud)
-endif(OWNCLOUD)
-
-if(INOREADER)
- add_subdirectory(inoreader)
-endif(INOREADER)
-
-if(FEEDLY)
- add_subdirectory(feedly)
-endif(FEEDLY)
-
-if(OLDREADER)
- add_subdirectory(oldreader)
-endif(OLDREADER)
-
-if(LOCAL)
- add_subdirectory(local)
-endif(LOCAL)
-
-if(FRESH)
- add_subdirectory(fresh)
-endif(FRESH)
-
-if(FEEDBIN)
- add_subdirectory(feedbin)
-endif(FEEDBIN)
diff --git a/plugins/backend/bazqux/bazqux.gresource.xml b/plugins/backend/bazqux/bazqux.gresource.xml
new file mode 100644
index 00000000..50932232
--- /dev/null
+++ b/plugins/backend/bazqux/bazqux.gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/FeedReader">
+ <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-bazqux.svg</file>
+ <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-bazqux-symbolic.svg</file>
+ </gresource>
+</gresources>
diff --git a/plugins/backend/oldreader/oldreaderUI.plugin b/plugins/backend/bazqux/bazqux.plugin
index a9d45370..d6cf535d 100644
--- a/plugins/backend/oldreader/oldreaderUI.plugin
+++ b/plugins/backend/bazqux/bazqux.plugin
@@ -1,8 +1,9 @@
[Plugin]
-Module=oldreaderUI
+Module=bazqux
Loader=C
-Name=TheOldReader
-Description=Add TheOldReader backend to FeedReader
+Name=bazqux
+Version=0.1
+Description=Add bazqux backend to FeedReader
Authors=Anwesh Reddy <kanishkablack@gmx.com>
Copyright=Copyright © 2015-16 Anwesh Reddy
Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/bazqux/bazquxAPI.vala b/plugins/backend/bazqux/bazquxAPI.vala
new file mode 100644
index 00000000..2a62e64c
--- /dev/null
+++ b/plugins/backend/bazqux/bazquxAPI.vala
@@ -0,0 +1,474 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.bazquxAPI : GLib.Object {
+
+ public enum bazquxSubscriptionAction {
+ EDIT,
+ SUBSCRIBE,
+ UNSUBSCRIBE
+ }
+
+ private bazquxConnection m_connection;
+ private bazquxUtils m_utils;
+ private string m_userID;
+ private DataBaseReadOnly m_db;
+
+ public bazquxAPI(bazquxUtils utils, DataBaseReadOnly db)
+ {
+ m_db = db;
+ m_utils = utils;
+ m_connection = new bazquxConnection(utils);
+ }
+
+ public LoginResponse login()
+ {
+ if(m_utils.getAccessToken() == "")
+ {
+ var result = m_connection.getToken();
+ if(getUserID())
+ return result;
+ }
+ else if(getUserID())
+ return LoginResponse.SUCCESS;
+
+ return LoginResponse.UNKNOWN_ERROR;
+ }
+
+ public bool ping()
+ {
+ return m_connection.ping();
+ }
+
+ private bool getUserID()
+ {
+ Logger.debug("getUserID: getting user info");
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("user-info", msg.get());
+
+ if(response.status != 200)
+ return false;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getUserID: Could not load message response");
+ Logger.error(e.message);
+ return false;
+ }
+ var root = parser.get_root().get_object();
+ if(root.has_member("userId"))
+ {
+ m_userID = root.get_string_member("userId");
+ m_utils.setUserID(m_userID);
+ Logger.info("bazqux: userID = " + m_userID);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool getFeeds(Gee.List<Feed> feeds)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("subscription/list", msg.get());
+
+ if(response.status != 200)
+ return false;
+
+ Logger.debug(response.data);
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getFeeds: Could not load message response");
+ Logger.error(e.message);
+ return false;
+ }
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("subscriptions");
+ uint length = array.get_length();
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+
+ string feedID = object.get_string_member("id");
+ string url = object.has_member("htmlUrl") ? object.get_string_member("htmlUrl") : object.get_string_member("url");
+ string? icon_url = object.get_string_member("iconUrl");
+
+ uint catCount = object.get_array_member("categories").get_length();
+ var categories = new Gee.ArrayList<string>();
+ for(uint j = 0; j < catCount; ++j)
+ {
+ categories.add(object.get_array_member("categories").get_object_element(j).get_string_member("id"));
+ }
+ feeds.add(
+ new Feed(
+ feedID,
+ object.get_string_member("title"),
+ url,
+ 0,
+ categories,
+ icon_url
+ )
+ );
+ }
+ return true;
+ }
+
+ public bool getCategoriesAndTags(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("tag/list", msg.get());
+
+ if(response.status != 200)
+ return false;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getCategoriesAndTags: Could not load message response");
+ Logger.error(e.message);
+ return false;
+ }
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("tags");
+ uint length = array.get_length();
+ int orderID = 0;
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ string id = object.get_string_member("id");
+ int start = id.last_index_of_char('/') + 1;
+ string title = id.substring(start);
+
+ if(id.contains("/label/"))
+ {
+ if(m_utils.tagIsCat(id, feeds))
+ {
+ categories.add(
+ new Category(
+ id,
+ title,
+ 0,
+ orderID,
+ CategoryID.MASTER.to_string(),
+ 1
+ )
+ );
+ ++orderID;
+ }
+ else
+ {
+ tags.add(
+ new Tag(
+ id,
+ title,
+ m_db.getTagColor()
+ )
+ );
+ }
+ }
+ }
+ return true;
+ }
+
+
+ public int getTotalUnread()
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("unread-count", msg.get());
+
+ if(response.status != 200)
+ return 0;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getTotalUnread: Could not load message response");
+ Logger.error(e.message);
+ }
+
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("unreadcounts");
+ uint length = array.get_length();
+ int count = 0;
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ if(object.get_string_member("id").has_prefix("feed/"))
+ {
+ count += (int)object.get_int_member("count");
+ }
+
+ }
+
+ Logger.debug("getTotalUnread %i".printf(count));
+ return count;
+ }
+
+
+ public string? updateArticles(Gee.List<string> ids, int count, string? continuation = null)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ msg.add("n", count.to_string());
+ msg.add("xt", "user/-/state/com.google/read");
+ if(continuation != null)
+ msg.add("c", continuation);
+
+ var response = m_connection.send_get_request("stream/items/ids", msg.get());
+
+ if(response.status != 200)
+ return null;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("updateArticles: Could not load message response");
+ Logger.error(e.message);
+ }
+
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("itemRefs");
+ uint length = array.get_length();
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ ids.add(object.get_string_member("id"));
+ }
+
+ if(root.has_member("continuation") && root.get_string_member("continuation") != "")
+ return root.get_string_member("continuation");
+
+ return null;
+ }
+
+ public string? getArticles(Gee.List<Article> articles, int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? continuation = null, string? tagID = null, string? feed_id = null)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ msg.add("n", count.to_string());
+
+ if(whatToGet == ArticleStatus.UNREAD)
+ msg.add("xt", "user/-/state/com.google/read");
+ if(whatToGet == ArticleStatus.READ)
+ msg.add("s", "user/-/state/com.google/read");
+ else if(whatToGet == ArticleStatus.MARKED)
+ msg.add("s", "user/-/state/com.google/starred");
+
+ if( continuation != null )
+ msg.add("c", continuation);
+
+ string api_endpoint = "stream/contents";
+ if(feed_id != null)
+ api_endpoint += "/" + feed_id;
+ else if(tagID != null)
+ api_endpoint += "/" + tagID;
+ var response = m_connection.send_get_request(api_endpoint, msg.get());
+
+ if(response.status != 200)
+ return null;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getArticles: Could not load message response");
+ Logger.error(e.message);
+ }
+
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("items");
+ uint length = array.get_length();
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ string id = object.get_string_member("id");
+ id = id.substring(id.last_index_of_char('/') + 1);
+ bool marked = false;
+ bool read = false;
+ var cats = object.get_array_member("categories");
+ uint cat_length = cats.get_length();
+
+ var tags = new Gee.ArrayList<string>();
+ for (uint j = 0; j < cat_length; j++)
+ {
+ string cat = cats.get_string_element(j);
+ if(cat.has_suffix("com.google/starred"))
+ marked = true;
+ else if(cat.has_suffix("com.google/read"))
+ read = true;
+ else if(cat.contains("/label/") && m_db.getTagName(cat) != null)
+ tags.add(cat);
+ }
+
+ var enclosures = new Gee.ArrayList<Enclosure>();
+ if(object.has_member("enclosure"))
+ {
+ var attachments = object.get_array_member("enclosure");
+
+ uint mediaCount = 0;
+ if(attachments != null)
+ mediaCount = attachments.get_length();
+
+ for(int j = 0; j < mediaCount; ++j)
+ {
+ var attachment = attachments.get_object_element(j);
+
+ enclosures.add(
+ new Enclosure(id, attachment.get_string_member("href"),
+ EnclosureType.from_string(attachment.get_string_member("type")))
+ );
+ }
+ }
+
+ articles.add(new Article(
+ id,
+ object.get_string_member("title"),
+ object.get_array_member("alternate").get_object_element(0).get_string_member("href"),
+ object.get_object_member("origin").get_string_member("streamId"),
+ read ? ArticleStatus.READ : ArticleStatus.UNREAD,
+ marked ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
+ object.get_object_member("summary").get_string_member("content"),
+ "",
+ object.get_string_member("author"),
+ new DateTime.from_unix_local(object.get_int_member("published")),
+ -1,
+ tags,
+ enclosures
+ )
+ );
+ }
+
+ if(root.has_member("continuation") && root.get_string_member("continuation") != "")
+ return root.get_string_member("continuation");
+
+ return null;
+ }
+
+
+ public void edidTag(string articleID, string tagID, bool add = true)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+
+ if(add)
+ msg.add("a", tagID);
+ else
+ msg.add("r", tagID);
+
+ msg.add("i", "tag:google.com,2005:reader/item/" + articleID);
+ m_connection.send_post_request("edit-tag", msg.get());
+ }
+
+ public void markAsRead(string? streamID = null)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ msg.add("s", streamID);
+ msg.add("ts", "%i000000".printf(Settings.state().get_int("last-sync")));
+ m_connection.send_post_request("mark-all-as-read", msg.get());
+ }
+
+ public string composeTagID(string tagName)
+ {
+ return "user/%s/label/%s".printf(m_userID, tagName);
+ }
+
+ public void deleteTag(string tagID)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ msg.add("s", tagID);
+ m_connection.send_post_request("disable-tag", msg.get());
+ }
+
+ public void renameTag(string tagID, string title)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+ msg.add("s", tagID);
+ msg.add("dest", composeTagID(title));
+ m_connection.send_post_request("rename-tag", msg.get());
+ }
+
+ public bool editSubscription(bazquxSubscriptionAction action, string feedID, string? title = null, string? add = null, string? remove = null)
+ {
+ var msg = new bazquxMessage();
+ msg.add("output", "json");
+
+ switch(action)
+ {
+ case bazquxSubscriptionAction.EDIT:
+ msg.add("ac", "edit");
+ break;
+ case bazquxSubscriptionAction.SUBSCRIBE:
+ msg.add("ac", "subscribe");
+ break;
+ case bazquxSubscriptionAction.UNSUBSCRIBE:
+ msg.add("ac", "unsubscribe");
+ break;
+ }
+
+ msg.add("s", feedID);
+
+ if(title != null)
+ msg.add("t", title);
+
+ if(add != null)
+ msg.add("a", add);
+
+ if(remove != null)
+ msg.add("r", remove);
+
+
+ var response = m_connection.send_post_request("subscription/edit", msg.get());
+
+ return response.status == 200;
+ }
+}
diff --git a/plugins/backend/bazqux/bazquxConnection.vala b/plugins/backend/bazqux/bazquxConnection.vala
new file mode 100644
index 00000000..914f3aa5
--- /dev/null
+++ b/plugins/backend/bazqux/bazquxConnection.vala
@@ -0,0 +1,142 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.bazquxConnection {
+ private string m_username;
+ private string m_api_code;
+ private string m_passwd;
+ private bazquxUtils m_utils;
+ private Soup.Session m_session;
+
+ public bazquxConnection(bazquxUtils utils)
+ {
+ m_utils = utils;
+ m_username = m_utils.getUser();
+ m_api_code = m_utils.getAccessToken();
+ m_passwd = m_utils.getPasswd();
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ }
+
+ public LoginResponse getToken()
+ {
+ Logger.debug("bazqux Connection: getToken()");
+
+ if(m_username == "" && m_passwd == "")
+ return LoginResponse.ALL_EMPTY;
+ if(m_username == "")
+ return LoginResponse.MISSING_USER;
+ if(m_passwd == "")
+ return LoginResponse.MISSING_PASSWD;
+
+ var message = new Soup.Message("POST", "https://bazqux.com/accounts/ClientLogin/");
+ string message_string = "Email=" + m_username + "&Passwd=" + m_passwd;
+ message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
+ m_session.send_message(message);
+ string response = (string)message.response_body.flatten().data;
+ try{
+
+ var regex = new Regex(".*\\w\\s.*\\w\\sAuth=");
+ if(regex.match(response))
+ {
+ Logger.error("Regex bazqux - %s".printf(response));
+ string split = regex.replace( response, -1,0,"");
+ Logger.error("authcode"+split);
+ m_utils.setAccessToken(split.strip());
+ return LoginResponse.SUCCESS;
+ }
+ else
+ {
+ Logger.debug(response);
+ return LoginResponse.WRONG_LOGIN;
+ }
+ }
+ catch(Error e)
+ {
+ Logger.error("bazquxConnection - getToken: Could not load message response");
+ Logger.error(e.message);
+ return LoginResponse.UNKNOWN_ERROR;
+ }
+ }
+
+ public Response send_get_request(string path, string? message_string = null)
+ {
+ return send_request(path, "GET", message_string);
+ }
+
+ public Response send_post_request(string path, string? message_string = null)
+ {
+ return send_request(path, "POST", message_string);
+ }
+
+ private Response send_request(string path, string type, string? message_string = null)
+ {
+
+ var message = new Soup.Message(type, bazquxSecret.base_uri + path);
+
+ string oldauth = "GoogleLogin auth=" + m_utils.getAccessToken();
+ message.request_headers.append("Authorization", oldauth);
+
+ if(message_string != null)
+ message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
+
+ m_session.send_message(message);
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
+ }
+
+ public bool ping()
+ {
+ var message = new Soup.Message("GET", "https://www.bazqux.com/reader/ping");
+
+ string oldauth = "GoogleLogin auth=" + m_utils.getAccessToken();
+ message.request_headers.append("Authorization", oldauth);
+ m_session.send_message(message);
+
+ if((string)message.response_body.data == "OK")
+ return true;
+
+ return false;
+ }
+
+}
+
+public class FeedReader.bazquxMessage {
+
+ string request = "";
+
+ public bazquxMessage()
+ {
+
+ }
+
+ public void add(string parameter, string val)
+ {
+ if(request != "")
+ request += "&";
+
+ request += parameter;
+ request += "=";
+ request += GLib.Uri.escape_string(val);
+ }
+
+ public string get()
+ {
+ return request;
+ }
+}
diff --git a/plugins/backend/bazqux/bazquxInterface.vala b/plugins/backend/bazqux/bazquxInterface.vala
new file mode 100644
index 00000000..1acebbce
--- /dev/null
+++ b/plugins/backend/bazqux/bazquxInterface.vala
@@ -0,0 +1,457 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.bazquxInterface : Peas.ExtensionBase, FeedServerInterface {
+
+ private bazquxAPI m_api;
+ private bazquxUtils m_utils;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
+
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
+ {
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new bazquxUtils(settings_backend, secrets);
+ m_api = new bazquxAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "https://bazqux.com/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID);
+ }
+
+ public string getID()
+ {
+ return "bazqux";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-bazqux";
+ }
+
+ public string serviceName()
+ {
+ return "BazQux";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var user_label = new Gtk.Label(_("Username:"));
+ var password_label = new Gtk.Label(_("Password:"));
+
+ user_label.set_alignment(1.0f, 0.5f);
+ password_label.set_alignment(1.0f, 0.5f);
+
+ user_label.set_hexpand(true);
+ password_label.set_hexpand(true);
+
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+
+ m_userEntry.activate.connect(() => { tryLogin(); });
+ m_passwordEntry.activate.connect(() => { tryLogin(); });
+
+ m_passwordEntry.set_invisible_char('*');
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ grid.attach(user_label, 0, 0, 1, 1);
+ grid.attach(m_userEntry, 1, 0, 1, 1);
+ grid.attach(password_label, 0, 1, 1, 1);
+ grid.attach(m_passwordEntry, 1, 1, 1, 1);
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-bazqux", Gtk.IconSize.MENU);
+
+ var loginLabel = new Gtk.Label(_("Please log in to FeedHQ and enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => { tryLogin(); });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPasswd());
+
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+
+ }
+
+ public void writeData()
+ {
+ m_utils.setUser(m_userEntry.get_text());
+ m_utils.setPassword(m_passwordEntry.get_text());
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ public bool supportTags()
+ {
+ return true;
+ }
+
+ public bool supportFeedManipulation()
+ {
+ return true;
+ }
+
+ public bool doInitSync()
+ {
+ return true;
+ }
+
+ public string symbolicIcon()
+ {
+ return "feed-service-bazqux-symbolic";
+ }
+
+ public string accountName()
+ {
+ return m_utils.getUser();
+ }
+
+ public string getServerURL()
+ {
+ return "https://bazqux.com/";
+ }
+
+ public string uncategorizedID()
+ {
+ return "";
+ }
+
+ public bool supportCategories()
+ {
+ return true;
+ }
+ public bool hideCategoryWhenEmpty(string cadID)
+ {
+ return false;
+ }
+
+ public bool supportMultiLevelCategories()
+ {
+ return false;
+ }
+
+ public bool supportMultiCategoriesPerFeed()
+ {
+ return false;
+ }
+
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
+ public bool tagIDaffectedByNameChange()
+ {
+ return true;
+ }
+
+ public void resetAccount()
+ {
+ m_utils.resetAccount();
+ }
+
+ public bool useMaxArticles()
+ {
+ return true;
+ }
+
+ public LoginResponse login()
+ {
+ return m_api.login();
+ }
+
+ public bool logout()
+ {
+ return true;
+ }
+
+ public void setArticleIsRead(string articleIDs, ArticleStatus read)
+ {
+ if(read == ArticleStatus.READ)
+ m_api.edidTag(articleIDs, "user/-/state/com.google/read");
+ else
+ m_api.edidTag(articleIDs, "user/-/state/com.google/read", false);
+ }
+
+ public void setArticleIsMarked(string articleID, ArticleStatus marked)
+ {
+ if(marked == ArticleStatus.MARKED)
+ m_api.edidTag(articleID, "user/-/state/com.google/starred");
+ else
+ m_api.edidTag(articleID, "user/-/state/com.google/starred", false);
+ }
+
+ public void setFeedRead(string feedID)
+ {
+ m_api.markAsRead(feedID);
+ }
+
+ public void setCategoryRead(string catID)
+ {
+ m_api.markAsRead(catID);
+ }
+
+ public void markAllItemsRead()
+ {
+ var categories = m_db.read_categories();
+ foreach(Category cat in categories)
+ {
+ m_api.markAsRead(cat.getCatID());
+ }
+
+ var feeds = m_db.read_feeds_without_cat();
+ foreach(Feed feed in feeds)
+ {
+ m_api.markAsRead(feed.getFeedID());
+ }
+ m_api.markAsRead();
+ }
+
+ public void tagArticle(string articleID, string tagID)
+ {
+ m_api.edidTag(articleID, tagID, true);
+ }
+
+ public void removeArticleTag(string articleID, string tagID)
+ {
+ m_api.edidTag(articleID, tagID, false);
+ }
+
+ public string createTag(string caption)
+ {
+ return m_api.composeTagID(caption);
+ }
+
+ public void deleteTag(string tagID)
+ {
+ m_api.deleteTag(tagID);
+ }
+
+ public void renameTag(string tagID, string title)
+ {
+ m_api.renameTag(tagID, title);
+ }
+
+ public bool serverAvailable()
+ {
+ return m_api.ping();
+ }
+
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
+ {
+ feedID = "feed/" + feedURL;
+ bool success = false;
+ errmsg = "";
+
+ if(catID == null && newCatName != null)
+ {
+ string newCatID = m_api.composeTagID(newCatName);
+ success = m_api.editSubscription(bazquxAPI.bazquxSubscriptionAction.SUBSCRIBE, "feed/"+feedURL, null, newCatID);
+ }
+ else
+ {
+ success = m_api.editSubscription(bazquxAPI.bazquxSubscriptionAction.SUBSCRIBE, "feed/"+feedURL, null, catID);
+ }
+
+ if(!success)
+ errmsg = @"bazqux could not subscribe to $feedURL";
+
+ return success;
+ }
+
+ public void addFeeds(Gee.List<Feed> feeds)
+ {
+ //FIXME
+ }
+
+ public void removeFeed(string feedID)
+ {
+ m_api.editSubscription(bazquxAPI.bazquxSubscriptionAction.UNSUBSCRIBE, feedID);
+ }
+
+ public void renameFeed(string feedID, string title)
+ {
+ m_api.editSubscription(bazquxAPI.bazquxSubscriptionAction.EDIT, feedID, title);
+ }
+
+ public void moveFeed(string feedID, string newCatID, string? currentCatID)
+ {
+ m_api.editSubscription(bazquxAPI.bazquxSubscriptionAction.EDIT, feedID, null, newCatID, currentCatID);
+ }
+
+ public string createCategory(string title, string? parentID)
+ {
+ return m_api.composeTagID(title);
+ }
+
+ public void renameCategory(string catID, string title)
+ {
+ m_api.renameTag(catID, title);
+ }
+
+ public void moveCategory(string catID, string newParentID)
+ {
+ return;
+ }
+
+ public void deleteCategory(string catID)
+ {
+ m_api.deleteTag(catID);
+ }
+
+ public void removeCatFromFeed(string feedID, string catID)
+ {
+ return;
+ }
+
+ public void importOPML(string opml)
+ {
+ var parser = new OPMLparser(opml);
+ parser.parse();
+ }
+
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
+ {
+ if(m_api.getFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getCategoriesAndTags(feeds, categories, tags))
+ return true;
+ }
+ return false;
+ }
+
+ public int getUnreadCount()
+ {
+ return m_api.getTotalUnread();
+ }
+
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
+ {
+ if(whatToGet == ArticleStatus.READ)
+ {
+ return;
+ }
+ else if(whatToGet == ArticleStatus.ALL)
+ {
+ var unreadIDs = new Gee.LinkedList<string>();
+ string? continuation = null;
+ int left = 4*count;
+
+ while(left > 0)
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ if(left > 1000)
+ {
+ continuation = m_api.updateArticles(unreadIDs, 1000, continuation);
+ left -= 1000;
+ }
+ else
+ {
+ m_api.updateArticles(unreadIDs, left, continuation);
+ left = 0;
+ }
+ }
+ m_db_write.updateArticlesByID(unreadIDs, "unread");
+ }
+
+ var articles = new Gee.LinkedList<Article>();
+ string? continuation = null;
+ int left = count;
+ string? bazqux_feedID = (isTagID) ? null : feedID;
+ string? bazqux_tagID = (isTagID) ? feedID : null;
+
+ while(left > 0)
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ if(left > 1000)
+ {
+ continuation = m_api.getArticles(articles, 1000, whatToGet, continuation, bazqux_tagID, bazqux_feedID);
+ left -= 1000;
+ }
+ else
+ {
+ continuation = m_api.getArticles(articles, left, whatToGet, continuation, bazqux_tagID, bazqux_feedID);
+ left = 0;
+ }
+ }
+ writeArticles(articles);
+ }
+
+}
+
+[ModuleInit]
+public void peas_register_types(GLib.TypeModule module)
+{
+ var objmodule = module as Peas.ObjectModule;
+ objmodule.register_extension_type(typeof(FeedReader.FeedServerInterface), typeof(FeedReader.bazquxInterface));
+}
diff --git a/plugins/backend/bazqux/bazquxUtils.vala b/plugins/backend/bazqux/bazquxUtils.vala
new file mode 100644
index 00000000..fd5b4d15
--- /dev/null
+++ b/plugins/backend/bazqux/bazquxUtils.vala
@@ -0,0 +1,100 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+namespace FeedReader.bazquxSecret {
+ const string base_uri = "https://www.bazqux.com/reader/api/0/";
+}
+
+public class FeedReader.bazquxUtils : GLib.Object {
+
+ private GLib.Settings m_settings;
+ private Password m_password;
+
+ public bazquxUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
+ {
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.bazqux", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.bazqux");
+
+ var password_schema = new Secret.Schema ("org.gnome.feedreader.bazqux", Secret.SchemaFlags.NONE,
+ "type", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, password_schema, "Feedserver login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["type"] = "BazQux";
+ attributes["Username"] = getUser();
+ return attributes;
+ });
+ }
+
+ public string getUser()
+ {
+ return Utils.gsettingReadString(m_settings, "username");
+ }
+
+ public void setUser(string user)
+ {
+ Utils.gsettingWriteString(m_settings, "username", user);
+ }
+
+ public string getAccessToken()
+ {
+ return Utils.gsettingReadString(m_settings, "access-token");
+ }
+
+ public void setAccessToken(string token)
+ {
+ Utils.gsettingWriteString(m_settings, "access-token", token);
+ }
+
+ public string getUserID()
+ {
+ return Utils.gsettingReadString(m_settings, "user-id");
+ }
+
+ public void setUserID(string id)
+ {
+ Utils.gsettingWriteString(m_settings, "user-id", id);
+ }
+
+ public void resetAccount()
+ {
+ Utils.resetSettings(m_settings);
+ m_password.delete_password();
+ }
+
+ public string getPasswd()
+ {
+ return m_password.get_password();
+ }
+
+ public void setPassword(string passwd)
+ {
+ m_password.set_password(passwd);
+ }
+
+ public bool tagIsCat(string tagID, Gee.List<Feed> feeds)
+ {
+ foreach(Feed feed in feeds)
+ {
+ if(feed.hasCat(tagID))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux-symbolic.svg b/plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux-symbolic.svg
new file mode 100644
index 00000000..540b0671
--- /dev/null
+++ b/plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux-symbolic.svg
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 16.933333 16.933334"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="feed-service-bazqux-symbolic.svg">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.2"
+ inkscape:cx="31.364099"
+ inkscape:cy="30.996224"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-280.06665)">
+ <path
+ style="fill:#bebebe;fill-opacity:1;stroke-width:0.96334606"
+ d="M 10.974609 4.2734375 C 7.1905641 4.2734375 4.1445312 7.3214235 4.1445312 11.105469 L 4.1445312 53.78125 C 4.1445312 57.565295 7.1905641 60.611328 10.974609 60.611328 L 53.564453 60.611328 C 57.348498 60.611328 60.394531 57.565295 60.394531 53.78125 L 60.394531 11.105469 C 60.394531 7.3214235 57.348498 4.2734375 53.564453 4.2734375 L 10.974609 4.2734375 z M 31.244141 13.361328 C 35.326073 13.361328 38.388721 14.132199 40.429688 15.671875 C 42.470654 17.211551 43.490234 19.458079 43.490234 22.412109 C 43.490234 25.079688 42.792935 27.245157 41.396484 28.910156 C 40.000034 30.557252 37.86842 31.829449 35.003906 32.724609 C 36.131809 34.443318 37.17027 36.107461 38.119141 37.71875 C 39.068011 39.312136 39.946309 40.780306 40.751953 42.123047 C 41.575501 43.447885 42.32749 44.620142 43.007812 45.640625 C 43.688135 46.661108 44.323256 47.467788 44.914062 48.058594 C 45.218417 48.362948 45.521817 48.630539 45.826172 48.863281 C 46.130526 49.07812 46.44532 49.257165 46.767578 49.400391 C 47.107739 49.543616 47.456389 49.669924 47.814453 49.777344 C 48.190421 49.884763 48.601248 49.99219 49.048828 50.099609 L 49.130859 51.28125 C 47.841828 51.442379 46.758117 51.521484 45.880859 51.521484 C 45.146828 51.521484 44.502265 51.504556 43.947266 51.46875 C 43.392266 51.432944 42.90038 51.361326 42.470703 51.253906 C 42.041026 51.146487 41.647127 51.012691 41.289062 50.851562 C 40.948901 50.67253 40.607739 50.448236 40.267578 50.179688 C 39.533546 49.624688 38.809878 48.827449 38.09375 47.789062 C 37.395525 46.732773 36.660463 45.541635 35.890625 44.216797 C 35.13869 42.891959 34.350892 41.48792 33.527344 40.001953 C 32.703796 38.498083 31.834939 37.029913 30.921875 35.597656 C 30.653327 35.167979 30.421545 34.826817 30.224609 34.576172 C 30.045577 34.325527 29.840164 34.129554 29.607422 33.986328 C 29.392583 33.843102 29.13248 33.745116 28.828125 33.691406 C 28.541674 33.637697 28.164702 33.601888 27.699219 33.583984 L 25.847656 33.529297 L 25.847656 42.847656 L 25.847656 45.748047 C 25.865559 46.607401 25.882487 47.385759 25.900391 48.083984 C 25.918294 48.638984 26.152029 48.989587 26.599609 49.132812 L 29.580078 50.017578 L 29.660156 51.173828 C 27.529674 51.120118 25.400014 51.091797 23.269531 51.091797 C 21.103243 51.091797 18.883083 51.120118 16.609375 51.173828 L 16.501953 50.017578 L 19.804688 49.025391 C 20.252268 48.900068 20.49349 48.621083 20.529297 48.191406 C 20.5472 47.475278 20.556641 46.679992 20.556641 45.802734 C 20.574544 44.907574 20.583984 43.921849 20.583984 42.847656 L 20.583984 21.068359 C 20.583984 20.155296 20.574544 19.331688 20.556641 18.597656 C 20.556641 17.863625 20.5472 17.202134 20.529297 16.611328 C 20.511394 16.145845 20.29654 15.840491 19.884766 15.697266 L 16.554688 14.650391 L 16.501953 13.496094 C 18.811468 13.567707 21.057996 13.603516 23.242188 13.603516 C 23.671865 13.603516 24.218441 13.594075 24.880859 13.576172 C 25.543278 13.540365 26.348005 13.504556 27.296875 13.46875 C 28.263648 13.432944 29.070328 13.406575 29.714844 13.388672 C 30.359359 13.370769 30.868173 13.361328 31.244141 13.361328 z M 29.310547 15.589844 C 28.809257 15.589844 28.272122 15.608725 27.699219 15.644531 C 27.126316 15.680338 26.510075 15.733075 25.847656 15.804688 L 25.847656 31.515625 C 26.939752 31.569335 27.949892 31.595703 28.880859 31.595703 C 31.978115 31.595703 34.243524 30.9417 35.675781 29.634766 C 37.125941 28.309928 37.851563 26.242445 37.851562 23.431641 C 37.851562 20.710352 37.16175 18.723928 35.783203 17.470703 C 34.404656 16.217478 32.246674 15.589844 29.310547 15.589844 z "
+ id="rect4496"
+ transform="matrix(0.26458333,0,0,0.26458333,0,280.06665)" />
+ </g>
+</svg>
diff --git a/plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux.svg b/plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux.svg
new file mode 100644
index 00000000..ebfc2034
--- /dev/null
+++ b/plugins/backend/bazqux/icons/64x64/places/feed-service-bazqux.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 16.933333 16.933334"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="feed-service-bazqux.svg">
+ <defs
+ id="defs2">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4537">
+ <stop
+ style="stop-color:#4ba5cd;stop-opacity:1"
+ offset="0"
+ id="stop4533" />
+ <stop
+ style="stop-color:#3399cc;stop-opacity:1"
+ offset="1"
+ id="stop4535" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4537"
+ id="linearGradient4539"
+ x1="14.622954"
+ y1="282.11716"
+ x2="1.8426337"
+ y2="294.85025"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="29.434843"
+ inkscape:cy="22.708692"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-280.06665)">
+ <rect
+ id="rect4496"
+ width="14.882812"
+ height="14.905667"
+ x="1.0965502"
+ y="281.19757"
+ style="fill:url(#linearGradient4539);stroke-width:0.25488532;fill-opacity:1"
+ ry="1.8072118" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.55173111px;line-height:9.0947628px;font-family:Constantia;-inkscape-font-specification:'Constantia, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.36379051;"
+ x="3.6696992"
+ y="293.5849"
+ id="text4500"><tspan
+ sodipodi:role="line"
+ id="tspan4498"
+ x="3.6696992"
+ y="293.5849"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.55173111px;font-family:Constantia;-inkscape-font-specification:'Constantia, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;stroke-width:0.36379051;">R</tspan></text>
+ </g>
+</svg>
diff --git a/plugins/backend/bazqux/meson.build b/plugins/backend/bazqux/meson.build
new file mode 100644
index 00000000..f8ff1af8
--- /dev/null
+++ b/plugins/backend/bazqux/meson.build
@@ -0,0 +1,49 @@
+bazqux_resources = gnome.compile_resources(
+ 'bazqux_res',
+ 'bazqux.gresource.xml'
+)
+
+shared_library(
+ 'bazqux',
+ [
+ 'bazquxAPI.vala',
+ 'bazquxInterface.vala',
+ 'bazquxUtils.vala',
+ 'bazquxConnection.vala'
+ ],
+ bazqux_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.bazqux.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'bazqux.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/bazqux/org.gnome.feedreader.bazqux.gschema.xml b/plugins/backend/bazqux/org.gnome.feedreader.bazqux.gschema.xml
new file mode 100644
index 00000000..b5ca15e0
--- /dev/null
+++ b/plugins/backend/bazqux/org.gnome.feedreader.bazqux.gschema.xml
@@ -0,0 +1,24 @@
+<schemalist>
+ <schema id="org.gnome.feedreader.bazqux" path="/org/gnome/feedreader/bazqux/" gettext-domain="bazqux">
+
+ <key name="username" type="s">
+ <default>""</default>
+ <summary>apiCode</summary>
+ <description>Authenticated username to Thebazqux throught API</description>
+ </key>
+ <key name="access-token" type="s">
+ <default>""</default>
+ <description>Authorization code to Thebazqux throught API</description>
+ </key>
+
+ <key name="service" type="s">
+ <default>""</default>
+ <description>Service Name</description>
+ </key>
+ <key name="user-id" type="s">
+ <default>""</default>
+ <description>Interneal User ID</description>
+ </key>
+ </schema>
+
+</schemalist>
diff --git a/plugins/backend/demo/CMakeLists.txt b/plugins/backend/demo/CMakeLists.txt
deleted file mode 100644
index d6d018c7..00000000
--- a/plugins/backend/demo/CMakeLists.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-set (NAME demo)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- demoInterface.vala
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- demoLoginWidget.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
diff --git a/plugins/backend/demo/demo.plugin b/plugins/backend/demo/demo.plugin
index 961878c4..7f302f74 100644
--- a/plugins/backend/demo/demo.plugin
+++ b/plugins/backend/demo/demo.plugin
@@ -2,6 +2,7 @@
Module=demo
Loader=C
Name=Demo Backend
+Version=0.1
Description=This is just a demo
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/demo/demoInterface.vala b/plugins/backend/demo/demoInterface.vala
index 2caa36b5..270f7767 100644
--- a/plugins/backend/demo/demoInterface.vala
+++ b/plugins/backend/demo/demoInterface.vala
@@ -10,7 +10,131 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
// This method gets executed right after the plugin is loaded. Do everything
// you need to set up the plugin here.
//--------------------------------------------------------------------------------------
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
+ {
+
+ }
+
+ //--------------------------------------------------------------------------------------
+ // Return the the website/homepage of the project
+ //--------------------------------------------------------------------------------------
+ public string getWebsite()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Return an unique id for the backend. Basically a short form of the name:
+ // Tiny Tiny RSS -> "ttrss"
+ // Local Backend -> "local"
+ //--------------------------------------------------------------------------------------
+ public string getID()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Return flags describing the type of Service
+ // - LOCAL
+ // - HOSTED
+ // - SELF_HOSTED
+ // - FREE_SOFTWARE
+ // - PROPRIETARY
+ // - FREE
+ // - PAID_PREMIUM
+ // - PAID
+ //--------------------------------------------------------------------------------------
+ public BackendFlags getFlags()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Return the login UI inside a Gtk.Box (username- and password-entries)
+ // Return 'null' if use web-login
+ //--------------------------------------------------------------------------------------
+ public Gtk.Box? getWidget()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Return the name of the service-icon (non-symbolic).
+ //--------------------------------------------------------------------------------------
+ public string iconName()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Return the name of the service as displayed to the user
+ //--------------------------------------------------------------------------------------
+ public string serviceName()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Return wheather the plugin needs a webview to log in via oauth.
+ //--------------------------------------------------------------------------------------
+ public bool needWebLogin()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Only important for self-hosted services.
+ // If the server is secured by htaccess and a second username and password
+ // is required, show the UI to enter those in this methode.
+ // If htaccess won't be needed do nothing here.
+ //--------------------------------------------------------------------------------------
+ public void showHtAccess()
+ {
+
+ }
+
+ //--------------------------------------------------------------------------------------
+ // Methode gets executed before logging in. Write all the data gathered
+ // into gsettings (password, username, access-key).
+ //--------------------------------------------------------------------------------------
+ public void writeData()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Do stuff after a successful login
+ //--------------------------------------------------------------------------------------
+ public async void postLoginAction()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Only needed if "needWebLogin()" retruned true. Return URL that should be
+ // loaded to log in via website.
+ //--------------------------------------------------------------------------------------
+ public string buildLoginURL()
+ {
+
+ }
+
+
+ //--------------------------------------------------------------------------------------
+ // Extract access-key from redirect-URL from webview after loggin in with
+ // the webview.
+ // Return "true" if extracted sucessfuly, "false" otherwise.
+ //--------------------------------------------------------------------------------------
+ public bool extractCode(string redirectURL)
{
}
@@ -88,7 +212,7 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
// Argument: ID of a category
// Return: wheather the category should be visible when empty
//--------------------------------------------------------------------------------------
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
}
@@ -129,6 +253,11 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
}
+ public bool syncFeedsAndCategories()
+ {
+
+ }
+
//--------------------------------------------------------------------------------------
// Does changing the name of a tag also change it's ID?
@@ -241,7 +370,7 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
//--------------------------------------------------------------------------------------
// Mark all articles of the feeds that are part of the category as read
//--------------------------------------------------------------------------------------
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
}
@@ -310,7 +439,7 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
// "catID": the category the feed should be placed into, "null" otherwise
// "newCatName": the name of a new category the feed should be put in, "null" otherwise
//--------------------------------------------------------------------------------------
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
}
@@ -415,7 +544,7 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
// Fill up the emtpy LinkedList's that are provided with instances of the
// model-classes category, feed and article
//--------------------------------------------------------------------------------------
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
}
@@ -435,17 +564,18 @@ public class FeedReader.demoInterface : Peas.ExtensionBase, FeedServerInterface
//
// "count": the number of articles to get
// "whatToGet": the kind of articles to get (all/unread/marked/etc.)
+ // "since": how far back to sync articles (null = no limit)
// "feedID": get only articles of a secific feed or tag
// "isTagID": false if "feedID" is a feed-ID, true if "feedID" is a tag-ID
//
// It is recommended after getting the articles from the server to use the signal
- // "writeArticles(Gee.LinkedList<article> articles)"
+ // "writeArticles(Gee.List<Article> articles)"
// to automatically process them in the content-grabber, write them to the
// data-base and send all the signals to the UI to update accordingly.
// But if the API suggests a different approach you can everything on your
// own (see ttrss-backend).
//--------------------------------------------------------------------------------------
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
}
diff --git a/plugins/backend/demo/demoLoginWidget.vala b/plugins/backend/demo/demoLoginWidget.vala
deleted file mode 100644
index 112239eb..00000000
--- a/plugins/backend/demo/demoLoginWidget.vala
+++ /dev/null
@@ -1,156 +0,0 @@
-//--------------------------------------------------------------------------------------
-// This is the plugin that extends user-interface of FeedReader
-// It adds all the necessary widgets to the interface to log into the service.
-// User- and password-entries, or redirect to a website to log in.
-//--------------------------------------------------------------------------------------
-
-public class FeedReader.demoLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- //--------------------------------------------------------------------------------------
- // Called when loading plugin. Setup all the widgets here and add them to
- // m_stack and m_listStore.
- // The signal "login()" can be emmited when try to log in.
- // For example after pressing "enter" in the password-entry.
- //--------------------------------------------------------------------------------------
- public void init()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return the the website/homepage of the project
- //--------------------------------------------------------------------------------------
- public string getWebsite()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return an unique id for the backend. Basically a short form of the name:
- // Tiny Tiny RSS -> "ttrss"
- // Local Backend -> "local"
- //--------------------------------------------------------------------------------------
- public string getID()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return flags describing the type of Service
- // - LOCAL
- // - HOSTED
- // - SELF_HOSTED
- // - FREE_SOFTWARE
- // - PROPRIETARY
- // - FREE
- // - PAID_PREMIUM
- // - PAID
- //--------------------------------------------------------------------------------------
- public BackendFlags getFlags()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return the login UI inside a Gtk.Box (username- and password-entries)
- // Return 'null' if use web-login
- //--------------------------------------------------------------------------------------
- public Gtk.Box? getWidget()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return the name of the service-icon (non-symbolic).
- //--------------------------------------------------------------------------------------
- public string iconName()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return the name of the service as displayed to the user
- //--------------------------------------------------------------------------------------
- public string serviceName()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Return wheather the plugin needs a webview to log in via oauth.
- //--------------------------------------------------------------------------------------
- public bool needWebLogin()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Only important for self-hosted services.
- // If the server is secured by htaccess and a second username and password
- // is required, show the UI to enter those in this methode.
- // If htaccess won't be needed do nothing here.
- //--------------------------------------------------------------------------------------
- public void showHtAccess()
- {
-
- }
-
- //--------------------------------------------------------------------------------------
- // Methode gets executed before logging in. Write all the data gathered
- // into gsettings (password, username, access-key).
- //--------------------------------------------------------------------------------------
- public void writeData()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Do stuff after a successful login
- //--------------------------------------------------------------------------------------
- public async void postLoginAction()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Only needed if "needWebLogin()" retruned true. Return URL that should be
- // loaded to log in via website.
- //--------------------------------------------------------------------------------------
- public string buildLoginURL()
- {
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // Extract access-key from redirect-URL from webview after loggin in with
- // the webview.
- // Return "true" if extracted sucessfuly, "false" otherwise.
- //--------------------------------------------------------------------------------------
- public bool extractCode(string redirectURL)
- {
-
- }
-}
-
-
-//--------------------------------------------------------------------------------------
-// Boilerplate code for the plugin. Replace "demoLoginWidget" with the name
-// of your interface-class.
-//--------------------------------------------------------------------------------------
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.demoLoginWidget));
-}
diff --git a/plugins/backend/demo/demoUI.plugin b/plugins/backend/demo/demoUI.plugin
deleted file mode 100644
index f445c309..00000000
--- a/plugins/backend/demo/demoUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=demoUI
-Loader=C
-Name=Demo Backend
-Description=This is just a demo
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/demo/meson.build b/plugins/backend/demo/meson.build
new file mode 100644
index 00000000..66f18601
--- /dev/null
+++ b/plugins/backend/demo/meson.build
@@ -0,0 +1,41 @@
+demo_resources = gnome.compile_resources(
+ 'demo_res',
+ 'demo.gresource.xml'
+)
+
+shared_library(
+ 'demo',
+ [
+ 'demoInterface.vala'
+ ],
+ demo_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ feedreader
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.demo.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'demo.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/demo/org.gnome.feedreader.demo.gschema.xml b/plugins/backend/demo/org.gnome.feedreader.demo.gschema.xml
index ba3cdcc7..18277c92 100644
--- a/plugins/backend/demo/org.gnome.feedreader.demo.gschema.xml
+++ b/plugins/backend/demo/org.gnome.feedreader.demo.gschema.xml
@@ -1,5 +1,5 @@
<schemalist>
<schema id="org.gnome.feedreader.demo" path="/org/gnome/feedreader/demo/" gettext-domain="feedreader">
-
+
</schema>
</schemalist>
diff --git a/plugins/backend/feedbin/CMakeLists.txt b/plugins/backend/feedbin/CMakeLists.txt
deleted file mode 100644
index 35361e9c..00000000
--- a/plugins/backend/feedbin/CMakeLists.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-set (NAME feedbin)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- feedbinInterface.vala
- feedbinAPI.vala
- feedbinConnection.vala
- feedbinUtils.vala
-
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- feedbinLoginWidget.vala
- feedbinUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
diff --git a/plugins/backend/feedbin/TestFeedbin.vala b/plugins/backend/feedbin/TestFeedbin.vala
new file mode 100644
index 00000000..ff2ad2de
--- /dev/null
+++ b/plugins/backend/feedbin/TestFeedbin.vala
@@ -0,0 +1,246 @@
+const string host_env = "FEEDBIN_TEST_HOST";
+const string user_env = "FEEDBIN_TEST_USER";
+const string password_env = "FEEDBIN_TEST_PASSWORD";
+
+void delete_subscription(FeedbinAPI api, string url)
+{
+ var subscriptions = api.get_subscriptions();
+ foreach(var subscription in subscriptions)
+ {
+ if(subscription.feed_url != url)
+ continue;
+ api.delete_subscription(subscription.id);
+ break;
+ }
+}
+
+void add_login_tests(string host)
+{
+ string? username = Environment.get_variable(user_env);
+ string? password = Environment.get_variable(password_env);
+ if(username == null || password == null)
+ return;
+
+ // Stick a random number at the end of Feed URL's to ensure that they're
+ // unique, even if we run two tests against the same account
+ uint nonce = Random.next_int();
+
+ Test.add_data_func ("/feedbinapi/login", () => {
+
+ var api = new FeedbinAPI(username, password, null, host);
+ assert(api.login());
+
+ api = new FeedbinAPI("wrong", "password", null, host);
+ assert(!api.login());
+
+ api.username = username;
+ assert(!api.login());
+
+ api.password = password;
+ assert(api.login());
+ });
+
+ Test.add_data_func ("/feedbinapi/subscription", () => {
+ if(username == null || password == null)
+ {
+ Test.skip(@"Need $user_env and $password_env set to run Feedbin tests");
+ return;
+ }
+
+ var api = new FeedbinAPI(username, password, null, host);
+
+ var url = "https://www.brendanlong.com/feeds/all.atom.xml?feedreader-test-subscribe-$(nonce)";
+ delete_subscription(api, url);
+
+ var subscription = api.add_subscription(url);
+ assert(subscription.id != 0);
+
+ {
+ var got_subscription = api.get_subscription(subscription.id);
+ assert(got_subscription.id == subscription.id);
+ }
+
+ bool found_subscription = false;
+ foreach(var got_subscription in api.get_subscriptions())
+ {
+ if(got_subscription.id == subscription.id)
+ {
+ assert(got_subscription.feed_id == subscription.feed_id);
+ assert(got_subscription.feed_url == subscription.feed_url);
+ assert(got_subscription.site_url == subscription.site_url);
+ assert(got_subscription.title == subscription.title);
+ found_subscription = true;
+ }
+ }
+ assert(found_subscription);
+
+ string title = "Rename test";
+ api.rename_subscription(subscription.id, title);
+ var renamed_subscription = api.get_subscription(subscription.id);
+ assert(renamed_subscription.title == title);
+
+ api.delete_subscription(subscription.id);
+ foreach(var got_subscription in api.get_subscriptions())
+ {
+ assert(got_subscription.id != subscription.id);
+ assert(got_subscription.feed_url != url);
+ }
+ });
+
+ Test.add_data_func ("/feedbinapi/taggings", () => {
+ if(username == null || password == null)
+ {
+ Test.skip(@"Need $user_env and $password_env set to run Feedbin tests");
+ return;
+ }
+
+ var api = new FeedbinAPI(username, password, null, host);
+
+ var url = @"https://www.brendanlong.com/feeds/all.atom.xml?feedreader-test-taggings-$(nonce)";
+ delete_subscription(api, url);
+
+ var subscription = api.add_subscription(url);
+
+ // The subscription is new so it shouldn't have any taggings
+ var taggings = api.get_taggings();
+ foreach(var tagging in taggings)
+ {
+ assert(tagging.feed_id != subscription.feed_id);
+ }
+
+ string category = "Taggings Test";
+ api.add_tagging(subscription.feed_id, category);
+
+ // Check taggings
+ int64? tagging_id = null;
+ foreach(var tagging in api.get_taggings())
+ {
+ if(tagging.feed_id == subscription.feed_id)
+ {
+ assert(tagging.name == category);
+ tagging_id = tagging.id;
+ break;
+ }
+ }
+ assert(tagging_id != null);
+
+ // Delete the tag and verify that it's gone
+ api.delete_tagging(tagging_id);
+ foreach(var tagging in api.get_taggings())
+ {
+ assert(tagging.feed_id != subscription.feed_id);
+ }
+
+ // cleanup
+ api.delete_subscription(subscription.id);
+ });
+
+ Test.add_data_func ("/feedbinapi/entries", () => {
+ if(username == null || password == null)
+ {
+ Test.skip(@"Need $user_env and $password_env set to run Feedbin tests");
+ return;
+ }
+
+ var api = new FeedbinAPI(username, password, null, host);
+
+ // Note: This one shouldn't be deleted or recreated, since we want the entries to be available
+ var url = "https://www.brendanlong.com/feeds/all.atom.xml?feed-reader-test-entries";
+
+ var subscription = api.add_subscription(url);
+
+ /* FIXME: Figure out why this next line is failing
+ var entries = api.get_entries(1, false, null, subscription.feed_id);
+ foreach(var entry in entries)
+ {
+ assert(entry.feed_id == subscription.feed_id);
+ }
+
+ assert(entries.size > 0);
+ int i = Random.int_range(0, entries.size);
+ var entry = entries.to_array()[i];
+ var entry_ids = new Gee.ArrayList<int64?>();
+ entry_ids.add(entry.id);
+
+ // read status
+ api.set_entries_read(entry_ids, true);
+ var unread_entries = api.get_unread_entries();
+ assert(!unread_entries.contains(entry.id));
+
+ api.set_entries_read(entry_ids, false);
+ unread_entries = api.get_unread_entries();
+ assert(unread_entries.contains(entry.id));
+
+ api.set_entries_read(entry_ids, true);
+ unread_entries = api.get_unread_entries();
+ assert(!unread_entries.contains(entry.id));
+
+ // starred status
+ api.set_entries_starred(entry_ids, true);
+ var starred_entries = api.get_starred_entries();
+ assert(starred_entries.contains(entry.id));
+
+ api.set_entries_starred(entry_ids, false);
+ starred_entries = api.get_starred_entries();
+ assert(!starred_entries.contains(entry.id));
+
+ api.set_entries_starred(entry_ids, true);
+ starred_entries = api.get_starred_entries();
+ assert(starred_entries.contains(entry.id));
+ */
+ });
+
+ Test.add_data_func ("/feedbinapi/favicons", () => {
+ if(username == null || password == null)
+ {
+ Test.skip(@"Need $user_env and $password_env set to run Feedbin tests");
+ return;
+ }
+
+ var api = new FeedbinAPI(username, password, null, host);
+
+ // Note: This one shouldn't be deleted or recreated, since we want the entries to be available
+ var url = "https://www.brendanlong.com/feeds/all.atom.xml?feed-reader-test-favicons";
+
+ var subscription = api.add_subscription(url);
+ var favicons = api.get_favicons();
+ bool found_favicon = false;
+ foreach(var i in favicons.entries)
+ {
+ if(i.key != "www.brendanlong.com")
+ continue;
+ // Don't check the contents of the Favicon because Feedbin doesn't
+ // seem to neccessarily return the exact icon we gave it
+ found_favicon = true;
+ break;
+ }
+ // FIXME: We don't download icons on the test server because favicon downloading
+ // is handled by a different service
+ //assert(found_favicon);
+ });
+}
+
+void main(string[] args)
+{
+ Test.init(ref args);
+
+ string? host = Environment.get_variable(host_env);
+ if(host == null)
+ host = "https://api.feedbin.com";
+
+ // Tests that don't need a login
+ Test.add_data_func ("/feedbinapi/construct", () => {
+ var api = new FeedbinAPI("user", "password", null, host);
+ assert(api != null);
+ });
+
+ Test.add_data_func ("/feedbinapi/bad login", () => {
+ var api = new FeedbinAPI("user", "password", null, host);
+
+ assert(!api.login());
+ });
+
+ add_login_tests(host);
+
+ Test.run ();
+}
diff --git a/plugins/backend/feedbin/feedbin.plugin b/plugins/backend/feedbin/feedbin.plugin
index 9ee14023..c17da888 100644
--- a/plugins/backend/feedbin/feedbin.plugin
+++ b/plugins/backend/feedbin/feedbin.plugin
@@ -2,6 +2,7 @@
Module=feedbin
Loader=C
Name=Feedbin
+Version=0.1
Description=Add Feedbin backend to FeedReader
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/feedbin/feedbinAPI.vala b/plugins/backend/feedbin/feedbinAPI.vala
index cf8fab00..0de7ca16 100644
--- a/plugins/backend/feedbin/feedbinAPI.vala
+++ b/plugins/backend/feedbin/feedbinAPI.vala
@@ -13,323 +13,422 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.feedbinAPI : Object {
+// TODO: Make a general-purpose HttpClient module with these errors
+public errordomain FeedbinError {
+ INVALID_FORMAT,
+ MULTIPLE_CHOICES,
+ NO_CONNECTION,
+ NOT_AUTHORIZED,
+ NOT_FOUND,
+ UNKNOWN_ERROR
+}
- private feedbinConnection m_connection;
- private feedbinUtils m_utils;
+public class FeedbinAPI : Object {
+ private const string BASE_URI_FORMAT = "%s/v2/";
- public feedbinAPI()
- {
- m_connection = new feedbinConnection();
- m_utils = new feedbinUtils();
- }
+ private Soup.Session m_session;
+ private string m_base_uri;
+ public string username { get ; set; }
+ public string password { get ; set; }
- public LoginResponse login()
+ public FeedbinAPI(string username, string password, string? user_agent = null, string? host = "https://api.feedbin.com")
{
- Logger.debug("feedbin backend: login");
+ this.username = username;
+ this.password = password;
+ m_base_uri = BASE_URI_FORMAT.printf(host);
+ m_session = new Soup.Session();
- if(!Utils.ping("https://feedbin.com/"))
- return LoginResponse.NO_CONNECTION;
+ if(user_agent != null)
+ m_session.user_agent = user_agent;
- return LoginResponse.SUCCESS;
+ m_session.authenticate.connect(authenticate);
}
- public bool getSubscriptionList(Gee.LinkedList<feed> feeds)
+ ~FeedbinAPI()
{
- string response = m_connection.getRequest("subscriptions.json");
+ m_session.authenticate.disconnect(authenticate);
+ }
- if(response == "" || response == null)
- return false;
+ private void authenticate(Soup.Message msg, Soup.Auth auth, bool retrying)
+ {
+ if(!retrying)
+ auth.authenticate(this.username, this.password);
+ }
- var parser = new Json.Parser();
- try
- {
- parser.load_from_data(response, -1);
- }
- catch (Error e)
- {
- Logger.error("getTagList: Could not load message response");
- Logger.error(e.message);
- return false;
- }
- Json.Array array = parser.get_root().get_array();
+ private Soup.Message request(string method, string last_part, string? input = null) throws FeedbinError
+ {
+ var path = m_base_uri + last_part;
+ var message = new Soup.Message(method, path);
- for (int i = 0; i < array.get_length (); i++)
- {
- Json.Object object = array.get_object_element(i);
+ if(method == "POST" || method == "PUT")
+ message.request_headers.append("Content-Type", "application/json; charset=utf-8");
- string url = object.get_string_member("site_url");
- string id = object.get_int_member("feed_id").to_string();
- string xmlURL = object.get_string_member("feed_url");
+ if(input != null)
+ message.request_body.append_take(input.data);
- string title = "No Title";
- if(object.has_member("title"))
- {
- title = object.get_string_member("title");
- }
- else
+ m_session.send_message(message);
+ var status = message.status_code;
+ if(status < 200 || status >= 400)
+ {
+ switch(status)
{
- title = Utils.URLtoFeedName(url);
+ case Soup.Status.CANT_RESOLVE:
+ case Soup.Status.CANT_RESOLVE_PROXY:
+ case Soup.Status.CANT_CONNECT:
+ case Soup.Status.CANT_CONNECT_PROXY:
+ throw new FeedbinError.NO_CONNECTION(@"Connection to $m_base_uri failed");
+ case Soup.Status.UNAUTHORIZED:
+ throw new FeedbinError.NOT_AUTHORIZED(@"Not authorized to $method $path");
+ case Soup.Status.NOT_FOUND:
+ throw new FeedbinError.NOT_FOUND(@"$method $path not found");
}
-
- feeds.add(
- new feed(
- id,
- title,
- url,
- Utils.downloadIcon(id, url),
- 0,
- { "0" },
- xmlURL)
- );
+ string phrase = Soup.Status.get_phrase(status);
+ throw new FeedbinError.UNKNOWN_ERROR(@"Unexpected status $status ($phrase) for $method $path");
}
+ return message;
+ }
- return true;
+ // TODO: Move to DateUtils
+ private static DateTime string_to_datetime(string s) throws FeedbinError
+ {
+ var time = TimeVal();
+ if(!time.from_iso8601(s))
+ throw new FeedbinError.INVALID_FORMAT(@"Expected date but got $s");
+ return new DateTime.from_timeval_utc(time);
}
- public bool getTaggings(Gee.LinkedList<category> categories, Gee.LinkedList<feed> feeds)
+ // TODO: JSON utils?
+ private static DateTime get_datetime_member(Json.Object obj, string name) throws FeedbinError
{
- string response = m_connection.getRequest("taggings.json");
+ var s = obj.get_string_member(name);
+ return string_to_datetime(s);
+ }
- if(response == "" || response == null)
- return false;
+ private Soup.Message post_request(string path, string input) throws FeedbinError
+ {
+ return request("POST", path, input);
+ }
+
+ private Soup.Message delete_request(string path, string? input = null) throws FeedbinError
+ {
+ return request("DELETE", path, input);
+ }
+
+ private Soup.Message get_request(string path) throws FeedbinError
+ {
+ return request("GET", path);
+ }
+
+ private static Json.Node parse_json(Soup.Message response) throws FeedbinError
+ {
+ var method = response.method;
+ var uri = response.uri.to_string(false);
+ string content = (string)response.response_body.flatten().data;
+ if(content == null)
+ {
+ throw new FeedbinError.INVALID_FORMAT(@"$method $uri returned no content but expected JSON");
+ }
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(content, -1);
}
catch (Error e)
{
- Logger.error("getTagList: Could not load message response");
- Logger.error(e.message);
- return false;
+ throw new FeedbinError.INVALID_FORMAT(@"$method $uri returned invalid JSON: " + e.message + "\nContent is: $content");
}
- Json.Array array = parser.get_root().get_array();
-
- for (int i = 0; i < array.get_length (); i++)
- {
- Json.Object object = array.get_object_element(i);
+ return parser.get_root();
+ }
- string id = "catID%i".printf(i);
- string name = object.get_string_member("name");
- string feedID = object.get_int_member("feed_id").to_string();
+ private Json.Node get_json(string path) throws FeedbinError
+ {
+ var response = get_request(path);
+ return parse_json(response);
+ }
- string? id2 = m_utils.catExists(categories, name);
+ private Soup.Message post_json_object(string path, Json.Object obj) throws FeedbinError
+ {
+ var root = new Json.Node(Json.NodeType.OBJECT);
+ root.set_object(obj);
- if(id2 == null)
- {
- categories.add(
- new category (
- id,
- name,
- 0,
- i+1,
- CategoryID.MASTER.to_string(),
- 1
- )
- );
-
- m_utils.addFeedToCat(feeds, feedID, id);
- }
- else
- {
- m_utils.addFeedToCat(feeds, feedID, id2);
- }
+ var gen = new Json.Generator();
+ gen.set_root(root);
+ var data = gen.to_data(null);
+ return post_request(path, data);
+ }
+ public bool login() throws FeedbinError
+ {
+ try
+ {
+ var res = get_request("authentication.json");
+ return res.status_code == Soup.Status.OK;
+ }
+ catch(FeedbinError.NOT_AUTHORIZED e)
+ {
+ return false;
}
-
- return true;
}
+ public struct Subscription {
+ int64 id;
+ DateTime created_at;
+ int64 feed_id;
+ string? title;
+ string? feed_url;
+ string? site_url;
-
- public int getEntries(Gee.LinkedList<article> articles, int page, bool starred, DateTime? timestamp, string? feedID = null)
- {
- string request = "entries.json?per_page=100";
- request += "&page=%i".printf(page);
- request += "&starred=%s".printf(starred ? "true" : "false");
- if(timestamp != null)
+ public Subscription.from_json(Json.Object object) throws FeedbinError
{
- var t = GLib.TimeVal();
- if(timestamp.to_timeval(out t))
- {
- request += "&since=%s".printf(t.to_iso8601());
- }
+ id = object.get_int_member("id");
+ created_at = get_datetime_member(object, "created_at");
+ feed_id = object.get_int_member("feed_id");
+ title = object.get_string_member("title");
+ feed_url = object.get_string_member("feed_url");
+ site_url = object.get_string_member("site_url");
}
+ }
- request += "&include_enclosure=true";
+ public Subscription get_subscription(int64 subscription_id) throws FeedbinError
+ {
+ var root = get_json(@"subscriptions/$subscription_id.json");
+ return Subscription.from_json(root.get_object());
+ }
- if(feedID != null)
- request = "feeds/%s/%s".printf(feedID, request);
+ public Gee.List<Subscription?> get_subscriptions() throws FeedbinError
+ {
+ var root = get_json("subscriptions.json");
+ var subscriptions = new Gee.ArrayList<Subscription?>();
+ var array = root.get_array();
+ for(var i = 0; i < array.get_length(); ++i)
+ {
+ var node = array.get_object_element(i);
+ subscriptions.add(Subscription.from_json(node));
+ }
+ return subscriptions;
+ }
- Logger.debug(request);
+ public void delete_subscription(int64 subscription_id) throws FeedbinError
+ {
+ delete_request(@"subscriptions/$subscription_id.json");
+ }
- string response = m_connection.getRequest(request);
+ public Subscription? add_subscription(string url) throws FeedbinError
+ {
+ Json.Object object = new Json.Object();
+ object.set_string_member("feed_url", url);
- var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ var response = post_json_object("subscriptions.json", object);
+ if(response.status_code == 300)
+ throw new FeedbinError.MULTIPLE_CHOICES("Site $url has multiple feeds to subscribe to");
+
+ var root = parse_json(response);
+ return Subscription.from_json(root.get_object());
}
- catch(Error e)
+ catch (FeedbinError.NOT_FOUND e)
{
- Logger.error("getEntries: Could not load message response");
- Logger.error(e.message);
- Logger.error(response);
+ return null;
}
+ }
+
+ public void rename_subscription(int64 subscription_id, string title) throws FeedbinError
+ {
+ Json.Object object = new Json.Object();
+ object.set_string_member("title", title);
+ post_json_object(@"subscriptions/$subscription_id/update.json", object);
+ }
- var root = parser.get_root();
+ public struct Tagging
+ {
+ int64 id;
+ int64 feed_id;
+ string name;
- if(root.get_node_type() != Json.NodeType.ARRAY)
+ public Tagging.from_json(Json.Object object)
{
- Logger.error(response);
- return 0;
+ id = object.get_int_member("id");
+ feed_id = object.get_int_member("feed_id");
+ name = object.get_string_member("name");
}
+ }
- var array = root.get_array();
- uint length = array.get_length();
+ public void add_tagging(int64 feed_id, string tag_name) throws FeedbinError
+ {
+ Json.Object object = new Json.Object();
+ object.set_int_member("feed_id", feed_id);
+ object.set_string_member("name", tag_name);
- Logger.debug("article count: %u".printf(length));
+ post_json_object("taggings.json", object);
+ // TODO: Return id
+ }
+
+ public void delete_tagging(int64 tagging_id) throws FeedbinError
+ {
+ delete_request(@"taggings/$tagging_id.json");
+ }
- for(uint i = 0; i < length; i++)
+ public Gee.List<Tagging?> get_taggings() throws FeedbinError
+ {
+ var root = get_json("taggings.json");
+ var taggings = new Gee.ArrayList<Tagging?>();
+ var array = root.get_array();
+ for(var i = 0; i < array.get_length(); ++i)
{
- Json.Object object = array.get_object_element(i);
- string id = object.get_int_member("id").to_string();
+ var object = array.get_object_element(i);
+ taggings.add(Tagging.from_json(object));
+ }
+ return taggings;
+ }
- var time = new GLib.DateTime.now_local();
+ public struct Entry
+ {
+ int64 id;
+ int64 feed_id;
+ string? title;
+ string? url;
+ string? author;
+ string? content;
+ string? summary;
+ DateTime published;
+ DateTime created_at;
+
+ public Entry.from_json(Json.Object object) throws FeedbinError
+ {
+ id = object.get_int_member("id");
+ feed_id = object.get_int_member("feed_id");
+ title = object.get_string_member("title");
+ url = object.get_string_member("url");
+ author = object.get_string_member("author");
+ content = object.get_string_member("content");
+ summary = object.get_string_member("summary");
+ published = get_datetime_member(object, "published");
+ created_at = get_datetime_member(object, "created_at");
+ }
+ }
+ public Gee.List<Entry?> get_entries(int page, bool only_starred, DateTime? since, int64? feed_id = null) throws FeedbinError
+ {
+ string starred = only_starred ? "true" : "false";
+ string path = @"entries.json?per_page=100&page=$page&starred=$starred&include_enclosure=true";
+ if(since != null)
+ {
var t = GLib.TimeVal();
- if(t.from_iso8601(object.get_string_member("published")))
+ if(since.to_timeval(out t))
{
- time = new DateTime.from_timeval_local(t);
+ path += "&since=" + t.to_iso8601();
}
+ }
+
+ if(feed_id != null)
+ path = @"feeds/$feed_id/$path";
- articles.add(new article(
- id,
- object.get_string_member("title"),
- object.get_string_member("url"),
- object.get_int_member("feed_id").to_string(),
- ArticleStatus.READ,
- ArticleStatus.UNMARKED,
- object.get_string_member("content"),
- object.get_string_member("summary"),
- object.get_string_member("author"),
- time,
- -1,
- "",
- ""
- )
- );
+ Json.Node root;
+ try
+ {
+ root = get_json(path);
+ }
+ catch(FeedbinError.NOT_FOUND e)
+ {
+ return Gee.List.empty<Entry?>();
}
- return (int)length;
+ var entries = new Gee.ArrayList<Entry?>();
+ var array = root.get_array();
+ for(var i = 0; i < array.get_length(); ++i)
+ {
+ var object = array.get_object_element(i);
+ entries.add(Entry.from_json(object));
+ }
+ return entries;
}
- public Gee.LinkedList<string> unreadEntries()
+ private Gee.Set<int64?> get_x_entries(string path) throws FeedbinError
{
- string response = m_connection.getRequest("unread_entries.json");
- response = response.substring(1, response.length-2);
- var a = response.split(",");
- var ids = new Gee.LinkedList<string>();
-
- foreach(string s in a)
+ var root = get_json(path);
+ var array = root.get_array();
+ // We have to set the hash function here manually or contains() won't
+ // work right -- presumably because it's trying to do pointer comparisons?
+ var ids = new Gee.HashSet<int64?>(
+ (n) => { return int64_hash(n); },
+ (a, b) => { return int64_equal(a, b); });
+ for(var i = 0; i < array.get_length(); ++i)
{
- ids.add(s);
+ ids.add(array.get_int_element(i));
}
-
return ids;
}
- public Gee.LinkedList<string> starredEntries()
+ public Gee.Set<int64?> get_unread_entries() throws FeedbinError
{
- string response = m_connection.getRequest("starred_entries.json");
- response = response.substring(1, response.length-2);
- var a = response.split(",");
- var ids = new Gee.LinkedList<string>();
-
- foreach(string s in a)
- {
- ids.add(s);
- }
+ return get_x_entries("unread_entries.json");
+ }
- return ids;
+ public Gee.Set<int64?> get_starred_entries() throws FeedbinError
+ {
+ return get_x_entries("starred_entries.json");
}
- public void createUnreadEntries(string articleIDs, bool read)
+ private void set_entries_status(string type, Gee.Collection<int64?> entry_ids, bool create) throws FeedbinError
{
- var ids = articleIDs.split(",");
Json.Array array = new Json.Array();
- foreach(string id in ids)
+ foreach(var id in entry_ids)
{
- array.add_int_element(int64.parse(id));
+ array.add_int_element(id);
}
Json.Object object = new Json.Object();
- object.set_array_member("unread_entries", array);
-
- var root = new Json.Node(Json.NodeType.OBJECT);
- root.set_object(object);
-
- var gen = new Json.Generator();
- gen.set_root(root);
- string json = gen.to_data(null);
+ object.set_array_member(type, array);
- string response = "";
-
- if(!read)
- response = m_connection.postRequest("unread_entries.json", json);
- else
- response = m_connection.deleteRequest("unread_entries.json", json);
+ string path = create ? @"$type.json" : @"$type/delete.json";
+ post_json_object(path, object);
}
- public void createStarredEntries(string articleID, bool starred)
+ public void set_entries_read(Gee.Collection<int64?> entry_ids, bool read) throws FeedbinError
{
- Json.Array array = new Json.Array();
- array.add_int_element(int64.parse(articleID));
-
- Json.Object object = new Json.Object();
- object.set_array_member("starred_entries", array);
-
- var root = new Json.Node(Json.NodeType.OBJECT);
- root.set_object(object);
-
- var gen = new Json.Generator();
- gen.set_root(root);
- string json = gen.to_data(null);
-
- string response = "";
-
- if(starred)
- response = m_connection.postRequest("starred_entries.json", json);
- else
- response = m_connection.deleteRequest("starred_entries.json", json);
+ set_entries_status("unread_entries", entry_ids, !read);
}
- public void deleteFeed(string feedID)
+ public void set_entries_starred(Gee.Collection<int64?> entry_ids, bool starred) throws FeedbinError
{
- m_connection.deleteRequest("subscriptions/%s.json".printf(feedID), "");
+ set_entries_status("starred_entries", entry_ids, starred);
}
- public void renameFeed(string feedID, string title)
+ public Gee.Map<string, Bytes?> get_favicons() throws FeedbinError
{
- Json.Object object = new Json.Object();
- object.set_string_member("title", title);
-
- var root = new Json.Node(Json.NodeType.OBJECT);
- root.set_object(object);
-
- var gen = new Json.Generator();
- gen.set_root(root);
- string json = gen.to_data(null);
-
- Logger.debug(json);
+ // The favicon API isn't public right now; make sure to handle it
+ // suddenly changing or disappearing
+ try
+ {
+ var root = get_json("favicons.json");
+ if(root == null)
+ return Gee.Map.empty<string, Bytes?>();
- var response = m_connection.postRequest("subscriptions/%s/update.json".printf(feedID), json);
+ var array = root.get_array();
+ if(array == null)
+ return Gee.Map.empty<string, Bytes?>();
- Logger.debug("subscriptions/%s/update.json".printf(feedID));
- Logger.debug(response);
+ var favicons = new Gee.HashMap<string, Bytes?>();
+ for(var i = 0; i < array.get_length(); ++i)
+ {
+ var obj = array.get_object_element(i);
+ string host = obj.get_string_member("host");
+ if(host == null)
+ continue;
+ var favicon_encoded = obj.get_string_member("favicon");
+ if(favicon_encoded == null)
+ continue;
+ var favicon = new Bytes.take(Base64.decode(favicon_encoded));
+ favicons.set(host, favicon);
+ }
+ return favicons;
+ }
+ catch(Error e)
+ {
+ return Gee.Map.empty<string, Bytes?>();
+ }
}
-
}
diff --git a/plugins/backend/feedbin/feedbinConnection.vala b/plugins/backend/feedbin/feedbinConnection.vala
deleted file mode 100644
index 7237065f..00000000
--- a/plugins/backend/feedbin/feedbinConnection.vala
+++ /dev/null
@@ -1,84 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.feedbinConnection {
-
- private feedbinUtils m_utils;
- private GLib.Settings m_settingsTweaks;
-
- private const string BASE_URI = "https://api.feedbin.com/v2/";
-
- public feedbinConnection()
- {
- m_utils = new feedbinUtils();
- m_settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- }
-
- public string postRequest(string path, string input)
- {
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.authenticate.connect((msg, auth, retrying) => {
- auth.authenticate(m_utils.getUser(), m_utils.getPasswd());
- });
-
- var message = new Soup.Message("POST", BASE_URI+path);
- if(m_settingsTweaks.get_boolean("do-not-track"))
- message.request_headers.append("DNT", "1");
-
- message.request_headers.append("Content-Type", "application/json; charset=utf-8");
-
- message.request_body.append_take(input.data);
- session.send_message(message);
-
- return (string)message.response_body.flatten().data;
- }
-
- public string deleteRequest(string path, string input)
- {
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.authenticate.connect((msg, auth, retrying) => {
- auth.authenticate(m_utils.getUser(), m_utils.getPasswd());
- });
-
- var message = new Soup.Message("DELETE", BASE_URI+path);
- if(m_settingsTweaks.get_boolean("do-not-track"))
- message.request_headers.append("DNT", "1");
-
- message.request_headers.append("Content-Type", "application/json; charset=utf-8");
-
- message.request_body.append_take(input.data);
- session.send_message(message);
-
- return (string)message.response_body.flatten().data;
- }
-
- public string getRequest(string path)
- {
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.authenticate.connect((msg, auth, retrying) => {
- auth.authenticate(m_utils.getUser(), m_utils.getPasswd());
- });
-
- var message = new Soup.Message("GET", BASE_URI+path);
- if(m_settingsTweaks.get_boolean("do-not-track"))
- message.request_headers.append("DNT", "1");
-
- session.send_message(message);
- return (string)message.response_body.data;
- }
-}
diff --git a/plugins/backend/feedbin/feedbinInterface.vala b/plugins/backend/feedbin/feedbinInterface.vala
index c25a35be..a1ee9d45 100644
--- a/plugins/backend/feedbin/feedbinInterface.vala
+++ b/plugins/backend/feedbin/feedbinInterface.vala
@@ -13,15 +13,144 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterface {
+public class FeedReader.FeedbinInterface : Peas.ExtensionBase, FeedServerInterface {
- private feedbinAPI m_api;
- private feedbinUtils m_utils;
+ private FeedbinAPI m_api;
+ private FeedbinUtils m_utils;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new feedbinAPI();
- m_utils = new feedbinUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new FeedbinUtils(settings_backend, secrets);
+ m_api = new FeedbinAPI(m_utils.getUser(), m_utils.getPassword(), Constants.USER_AGENT);
+ }
+
+ public string getWebsite()
+ {
+ return "https://feedbin.com/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID);
+ }
+
+ public string getID()
+ {
+ return "feedbin";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-feedbin";
+ }
+
+ public string serviceName()
+ {
+ return "Feedbin";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var user_label = new Gtk.Label(_("Username:"));
+ var password_label = new Gtk.Label(_("Password:"));
+
+ user_label.set_alignment(1.0f, 0.5f);
+ password_label.set_alignment(1.0f, 0.5f);
+
+ user_label.set_hexpand(true);
+ password_label.set_hexpand(true);
+
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+
+ m_userEntry.activate.connect(() => {
+ loginButton.activate();
+ });
+ m_passwordEntry.activate.connect(() => {
+ loginButton.activate();
+ });
+
+ m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ grid.attach(user_label, 0, 0, 1, 1);
+ grid.attach(m_userEntry, 1, 0, 1, 1);
+ grid.attach(password_label, 0, 1, 1, 1);
+ grid.attach(m_passwordEntry, 1, 1, 1, 1);
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-feedbin", Gtk.IconSize.MENU);
+
+ var loginLabel = new Gtk.Label(_("Please log in to Feedbin to enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => {
+ tryLogin();
+ });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPassword());
+
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+ return;
+ }
+
+ public void writeData()
+ {
+ m_api.username = m_userEntry.get_text().strip();
+ m_utils.setUser(m_api.username);
+
+ m_api.password = m_passwordEntry.get_text().strip();
+ m_utils.setPassword(m_api.password);
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
}
public bool supportTags()
@@ -61,10 +190,10 @@ public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterfa
public bool supportFeedManipulation()
{
- return false;
+ return true;
}
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
return false;
}
@@ -79,9 +208,14 @@ public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterfa
return false;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
- return false;
+ return true;
}
public void resetAccount()
@@ -96,7 +230,22 @@ public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterfa
public LoginResponse login()
{
- return m_api.login();
+ try
+ {
+ if(m_api.login())
+ return LoginResponse.SUCCESS;
+ else
+ return LoginResponse.WRONG_LOGIN;
+ }
+ catch(FeedbinError.NO_CONNECTION e)
+ {
+ return LoginResponse.NO_CONNECTION;
+ }
+ catch(Error e)
+ {
+ Logger.error("Feedbin login: " + e.message);
+ return LoginResponse.UNKNOWN_ERROR;
+ }
}
public bool logout()
@@ -106,92 +255,82 @@ public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterfa
public bool serverAvailable()
{
- return Utils.ping("https://feedbin.com/");
+ return login() != LoginResponse.NO_CONNECTION;
}
- public void setArticleIsRead(string articleIDs, ArticleStatus read)
+ public void setArticleIsRead(string article_id, ArticleStatus status)
{
- if(read == ArticleStatus.UNREAD)
- m_api.createUnreadEntries(articleIDs, false);
- else if(read == ArticleStatus.READ)
- m_api.createUnreadEntries(articleIDs, true);
+ var entry_id = int64.parse(article_id);
+ var entry_ids = ListUtils.single<int64?>(entry_id);
+ try
+ {
+ m_api.set_entries_read(entry_ids, status == ArticleStatus.READ);
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.setArticleIsRead: " + e.message);
+ }
}
- public void setArticleIsMarked(string articleID, ArticleStatus marked)
+ public void setArticleIsMarked(string article_id, ArticleStatus status)
{
- if(marked == ArticleStatus.MARKED)
- m_api.createStarredEntries(articleID, true);
- else if(marked == ArticleStatus.UNMARKED)
- m_api.createStarredEntries(articleID, false);
+ var entry_id = int64.parse(article_id);
+ var entry_ids = ListUtils.single<int64?>(entry_id);
+ try
+ {
+ m_api.set_entries_starred(entry_ids, status == ArticleStatus.MARKED);
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.setArticleIsMarked: " + e.message);
+ }
}
-
- public void setFeedRead(string feedID)
+ private void setRead(string id, FeedListType type)
{
- for(uint i = 0; i < 3; ++i)
+ const int count = 1000;
+ int num_articles = 1; // set to any value > 0
+ for(var offset = 0; num_articles > 0; offset += count)
{
- uint count = (i+1)*1000;
- uint offset = i*1000;
- var articles = dbDaemon.get_default().read_articles(feedID, FeedListType.FEED, ArticleListState.ALL, "", count, offset);
-
- string articleIDs = "";
-
- foreach(article a in articles)
+ var articles = m_db.read_articles(id, type, ArticleListState.ALL, "", count, offset);
+ var entry_ids = new Gee.ArrayList<int64?>();
+ foreach(var article in articles)
{
- articleIDs += a.getArticleID() + ",";
+ entry_ids.add(int64.parse(article.getArticleID()));
+ }
+ try
+ {
+ m_api.set_entries_read(entry_ids, true);
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.setRead: " + e.message);
+ break;
}
-
- articleIDs = articleIDs.substring(0, articleIDs.length-1);
- m_api.createUnreadEntries(articleIDs, true);
}
}
- public void setCategorieRead(string catID)
+ public void setFeedRead(string feed_id)
{
- for(uint i = 0; i < 3; ++i)
- {
- uint count = (i+1)*1000;
- uint offset = i*1000;
- var articles = dbDaemon.get_default().read_articles(catID, FeedListType.CATEGORY, ArticleListState.ALL, "", count, offset);
-
- string articleIDs = "";
-
- foreach(article a in articles)
- {
- articleIDs += a.getArticleID() + ",";
- }
+ setRead(feed_id, FeedListType.FEED);
+ }
- articleIDs = articleIDs.substring(0, articleIDs.length-1);
- m_api.createUnreadEntries(articleIDs, true);
- }
+ public void setCategoryRead(string category_id)
+ {
+ setRead(category_id, FeedListType.CATEGORY);
}
public void markAllItemsRead()
{
- for(uint i = 0; i < 5; ++i)
- {
- uint count = (i+1)*1000;
- uint offset = i*1000;
- var articles = dbDaemon.get_default().read_articles(FeedID.ALL.to_string(), FeedListType.FEED, ArticleListState.ALL, "", count, offset);
-
- string articleIDs = "";
-
- foreach(article a in articles)
- {
- articleIDs += a.getArticleID() + ",";
- }
-
- articleIDs = articleIDs.substring(0, articleIDs.length-1);
- m_api.createUnreadEntries(articleIDs, true);
- }
+ setRead(FeedID.ALL.to_string(), FeedListType.FEED);
}
- public void tagArticle(string articleID, string tagID)
+ public void tagArticle(string article_id, string tag_id)
{
return;
}
- public void removeArticleTag(string articleID, string tagID)
+ public void removeArticleTag(string article_id, string tag_id)
{
return;
}
@@ -201,7 +340,7 @@ public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterfa
return "";
}
- public void deleteTag(string tagID)
+ public void deleteTag(string tag_id)
{
return;
}
@@ -211,125 +350,406 @@ public class FeedReader.feedbinInterface : Peas.ExtensionBase, FeedServerInterfa
return;
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feed_url, string? cat_id, string? category_name, out string feed_id, out string errmsg)
{
- return "";
+ feed_id = "";
+ try
+ {
+ var subscription = m_api.add_subscription(feed_url);
+ if (subscription == null)
+ {
+ errmsg = @"Feedbin could not find a feed at $(feed_url)";
+ return false;
+ }
+ feed_id = subscription.feed_id.to_string();
+
+ if(category_name != null)
+ m_api.add_tagging(subscription.feed_id, category_name);
+
+ errmsg = "";
+ return true;
+ }
+ catch(Error e)
+ {
+ errmsg = e.message;
+ Logger.error(@"FeedbinInterface.addFeed: $errmsg");
+ return false;
+ }
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
return;
}
- public void removeFeed(string feedID)
+ private FeedbinAPI.Subscription subscription_for_feed(string feed_id_str) throws FeedbinError
{
- //m_api.deleteFeed(feedID);
+ var feed_id = int64.parse(feed_id_str);
+ var subscriptions = m_api.get_subscriptions();
+ foreach(var subscription in subscriptions)
+ {
+ if(subscription.feed_id == feed_id)
+ return subscription;
+ }
+ throw new FeedbinError.NOT_FOUND("No subscription found for feed $feed_id");
}
- public void renameFeed(string feedID, string title)
+ public void removeFeed(string feed_id_str)
{
- //m_api.renameFeed(feedID, title);
+ try
+ {
+ var subscription = subscription_for_feed(feed_id_str);
+ m_api.delete_subscription(subscription.id);
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.removeFeed: " + e.message);
+ }
}
- public void moveFeed(string feedID, string newCatID, string? currentCatID)
+ public void renameFeed(string feed_id_str, string title)
{
-
+ try
+ {
+ var subscription = subscription_for_feed(feed_id_str);
+ m_api.rename_subscription(subscription.id, title);
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.renameFeed: " + e.message);
+ }
}
- public string createCategory(string title, string? parentID)
+ public void moveFeed(string feed_id_str, string new_category, string? old_category)
{
- return "";
+ Logger.debug(@"moveFeed: $feed_id_str from $old_category to $new_category");
+ try
+ {
+ var subscription = subscription_for_feed(feed_id_str);
+ var feed_id = subscription.feed_id;
+ if(old_category != null)
+ {
+ var taggings = m_api.get_taggings();
+ foreach(var tagging in taggings)
+ {
+ if(tagging.name != old_category || tagging.feed_id != feed_id)
+ continue;
+ Logger.debug(@"moveFeed: Deleting tag $old_category from $feed_id");
+ m_api.delete_tagging(tagging.id);
+ break;
+ }
+ }
+ Logger.debug(@"moveFeed: Adding tag $new_category to $feed_id");
+ m_api.add_tagging(feed_id, new_category);
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.moveFeed: " + e.message);
+ }
}
- public void renameCategory(string catID, string title)
+ public void renameCategory(string old_category, string new_category)
{
-
+ Logger.debug(@"renameCategory: From $old_category to $new_category");
+ try
+ {
+ var taggings = m_api.get_taggings();
+ foreach(var tagging in taggings)
+ {
+ if(tagging.name != old_category)
+ continue;
+ var feed_id = tagging.feed_id;
+ Logger.debug(@"renameCategory: Tagging $feed_id with $new_category");
+ m_api.delete_tagging(tagging.id);
+ m_api.add_tagging(feed_id, new_category);
+ }
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.renameCategory: " + e.message);
+ }
}
- public void moveCategory(string catID, string newParentID)
+ public void moveCategory(string category_id, string new_parent_id)
{
+ // Feedbin doesn't have multi-level categories
return;
}
- public void deleteCategory(string catID)
+ public string createCategory(string title, string? parent_id)
{
+ // Categories are created and destroyed based on feeds having them.
+ // There are no empty categories in Feedbin
+ return "";
+ }
+ public void deleteCategory(string category)
+ {
+ Logger.debug(@"deleteCategory: $category");
+ try
+ {
+ var taggings = m_api.get_taggings();
+ foreach(var tagging in taggings)
+ {
+ if(tagging.name != category)
+ continue;
+ var feed_id = tagging.feed_id;
+ Logger.debug(@"deleteCategory: Deleting category $category from feed $feed_id");
+ m_api.delete_tagging(tagging.id);
+ }
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.deleteCategory: " + e.message);
+ }
}
- public void removeCatFromFeed(string feedID, string catID)
+ public void removeCatFromFeed(string feed_id_str, string category)
{
+ Logger.debug(@"removeCatFromFeed: Feed $feed_id_str, category $category");
+ try
+ {
+ var feed_id = int64.parse(feed_id_str);
+ var taggings = m_api.get_taggings();
+ foreach(var tagging in taggings)
+ {
+ if(tagging.feed_id != feed_id || tagging.name != category)
+ continue;
+ Logger.debug(@"removeCatFromFeed: Deleting category $category from feed $feed_id");
+ m_api.delete_tagging(tagging.id);
+ break;
+ }
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.removeCatFromFeed: " + e.message);
+ }
}
public void importOPML(string opml)
{
-
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- if(m_api.getSubscriptionList(feeds)
- && m_api.getTaggings(categories, feeds))
- return true;
+ try
+ {
+ var taggings = m_api.get_taggings();
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
- return false;
+ var favicons = m_api.get_favicons();
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ // It's easier to rebuild the category list than to update it
+ var category_names = new Gee.HashSet<string>();
+ foreach(var tagging in taggings)
+ {
+ category_names.add(tagging.name);
+ }
+ Logger.debug("getFeedsAndCats: Got %d categories: %s".printf(category_names.size, StringUtils.join(category_names, ", ")));
+
+ categories.clear();
+ var top_category = CategoryID.MASTER.to_string();
+ foreach(string name in category_names)
+ {
+ // Note: Feedbin categories *are* case sensitive, so we don't need
+ // to change the case here. "articles" and "Articles" are different
+ // tags.
+ categories.add(
+ new Category (
+ name,
+ name,
+ 0,
+ 0,
+ top_category,
+ 1
+ )
+ );
+ }
+
+ var tag_map = new Gee.HashMultiMap<string, string>();
+ foreach(var tagging in taggings)
+ {
+ tag_map.set(tagging.feed_id.to_string(), tagging.name);
+ }
+
+ var subscriptions = m_api.get_subscriptions();
+ feeds.clear();
+
+ foreach(var subscription in subscriptions)
+ {
+ var feed_id = subscription.feed_id.to_string();
+ Gee.List<string> feed_categories = new Gee.ArrayList<string>();
+
+ if(tag_map.contains(feed_id))
+ feed_categories.add_all(tag_map.get(feed_id));
+ else
+ feed_categories.add(uncategorizedID());
+
+ string? favicon_uri = null;
+ if(subscription.site_url != null)
+ {
+ var uri = new Soup.URI(subscription.site_url);
+ if(uri != null)
+ {
+ var favicon = favicons.get(uri.host);
+ if(favicon != null)
+ {
+ string base64 = Base64.encode(favicon.get_data());
+ favicon_uri = @"data:application/octet-stream;base64,$base64";
+ }
+ }
+ }
+
+ feeds.add(
+ new Feed(
+ feed_id,
+ subscription.title,
+ subscription.site_url,
+ 0,
+ feed_categories,
+ favicon_uri,
+ subscription.feed_url)
+ );
+ }
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.getFeedsAndCats: " + e.message);
+ return false;
+ }
+ return true;
}
public int getUnreadCount()
{
- return 0; // =( feedbin
+ try
+ {
+ return m_api.get_unread_entries().size;
+ }
+ catch(Error e)
+ {
+ Logger.error(@"FeedbinInterface.getUnreadCount: " + e.message);
+ return 0;
+ }
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus what_to_get, DateTime? since, string? feed_id_str, bool is_tag_id, GLib.Cancellable? cancellable = null)
{
- if(whatToGet == ArticleStatus.READ)
+ try
{
- return;
- }
+ int64? feed_id = null;
+ if(!is_tag_id && feed_id_str != null)
+ feed_id = int64.parse(feed_id_str);
+ bool only_starred = what_to_get == ArticleStatus.MARKED;
- var articles = new Gee.LinkedList<article>();
- var settings_state = new GLib.Settings("org.gnome.feedreader.saved-state");
- DateTime? time = null;
- if(!dbDaemon.get_default().isTableEmpty("articles"))
- time = new DateTime.from_unix_utc(settings_state.get_int("last-sync"));
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
- bool starred = false;
- string? fID = isTagID ? null : feedID;
+ // The Feedbin API doesn't include read/unread/starred status in the entries.json
+ // so look them up.
+ var unread_ids = m_api.get_unread_entries();
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+ var starred_ids = m_api.get_starred_entries();
- if(whatToGet == ArticleStatus.MARKED)
- {
- starred = true;
- }
-
- int articleCount = 0;
- int page = 1;
+ {
+ // Update read/unread status of existing entries
+ string search_feed_id;
+ FeedListType search_type;
+ if(feed_id == null)
+ {
+ search_feed_id = FeedID.ALL.to_string();
+ search_type = FeedListType.ALL_FEEDS;
+ }
+ else if(is_tag_id)
+ {
+ search_feed_id = feed_id_str;
+ search_type = FeedListType.TAG;
+ }
+ else
+ {
+ search_feed_id = feed_id_str;
+ search_type = FeedListType.FEED;
+ }
+
+ Logger.debug(@"Checking if any articles in $search_type $search_feed_id changed state");
+ for(var offset = 0, c = 1000; ; offset += c)
+ {
+ var articles = new Gee.ArrayList<Article>();
+ var existing_articles = m_db.read_articles(search_feed_id, search_type, ArticleListState.ALL, "", c, offset);
+ if(existing_articles.size == 0)
+ break;
+
+ foreach(var article in existing_articles)
+ {
+ var id = int64.parse(article.getArticleID());
+ var marked = starred_ids.contains(id) ? ArticleStatus.MARKED : ArticleStatus.UNMARKED;
+ var unread = unread_ids.contains(id) ? ArticleStatus.UNREAD : ArticleStatus.READ;
+ var changed = false;
+ if(article.getMarked() != marked)
+ {
+ article.setMarked(marked);
+ changed = true;
+ }
+ if(article.getUnread() != unread)
+ {
+ article.setUnread(unread);
+ changed = true;
+ }
+ articles.add(article);
+ }
+ writeArticles(articles);
+ }
+ }
- do
+ // Add new articles
+ for(int page = 1; ; ++page)
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ var entries = m_api.get_entries(page, only_starred, since, feed_id);
+ if(entries.size == 0)
+ break;
+
+ var articles = new Gee.ArrayList<Article>();
+ foreach(var entry in entries)
+ {
+ articles.add(
+ new Article(
+ entry.id.to_string(),
+ entry.title,
+ entry.url,
+ entry.feed_id.to_string(),
+ unread_ids.contains(entry.id) ? ArticleStatus.UNREAD : ArticleStatus.READ,
+ starred_ids.contains(entry.id) ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
+ entry.content,
+ entry.summary,
+ entry.author,
+ entry.published != null ? entry.published : entry.created_at,
+ -1,
+ null,
+ null)
+ );
+ }
+ writeArticles(articles);
+ }
+ }
+ catch(Error e)
{
- articleCount = m_api.getEntries(articles, page, starred, time, fID);
-
- if(articleCount == 0)
- break;
-
- page++;
+ Logger.error(@"FeedbinInterface.getArticles: " + e.message);
}
- while(articleCount == 100);
-
- writeArticles(articles);
-
- dbDaemon.get_default().updateArticlesByID(m_api.unreadEntries(), "unread");
- dbDaemon.get_default().updateArticlesByID(m_api.starredEntries(), "marked");
- updateArticleList();
- updateFeedList();
}
-
}
-
[ModuleInit]
public void peas_register_types(GLib.TypeModule module)
{
var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.FeedServerInterface), typeof(FeedReader.feedbinInterface));
+ objmodule.register_extension_type(typeof(FeedReader.FeedServerInterface), typeof(FeedReader.FeedbinInterface));
}
diff --git a/plugins/backend/feedbin/feedbinLoginWidget.vala b/plugins/backend/feedbin/feedbinLoginWidget.vala
deleted file mode 100644
index 8fafcee6..00000000
--- a/plugins/backend/feedbin/feedbinLoginWidget.vala
+++ /dev/null
@@ -1,154 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.feedbinLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- private Gtk.Entry m_userEntry;
- private Gtk.Entry m_passwordEntry;
- private feedbinUtils m_utils;
-
- public Logger m_logger { get; construct set; }
-
- public void init()
- {
- logger = m_logger;
- m_utils = new feedbinUtils();
- }
-
- public string getWebsite()
- {
- return "https://feedbin.com/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID);
- }
-
- public string getID()
- {
- return "feedbin";
- }
-
- public string iconName()
- {
- return "feed-service-feedbin";
- }
-
- public string serviceName()
- {
- return "Feedbin";
- }
-
- public bool needWebLogin()
- {
- return false;
- }
-
- public Gtk.Box? getWidget()
- {
- var user_label = new Gtk.Label(_("Username:"));
- var password_label = new Gtk.Label(_("Password:"));
-
- user_label.set_alignment(1.0f, 0.5f);
- password_label.set_alignment(1.0f, 0.5f);
-
- user_label.set_hexpand(true);
- password_label.set_hexpand(true);
-
- m_userEntry = new Gtk.Entry();
- m_passwordEntry = new Gtk.Entry();
-
- m_userEntry.activate.connect(() => { login(); });
- m_passwordEntry.activate.connect(() => { login(); });
-
- m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_passwordEntry.set_visibility(false);
-
- var grid = new Gtk.Grid();
- grid.set_column_spacing(10);
- grid.set_row_spacing(10);
- grid.set_valign(Gtk.Align.CENTER);
- grid.set_halign(Gtk.Align.CENTER);
-
- grid.attach(user_label, 0, 0, 1, 1);
- grid.attach(m_userEntry, 1, 0, 1, 1);
- grid.attach(password_label, 0, 1, 1, 1);
- grid.attach(m_passwordEntry, 1, 1, 1, 1);
-
- var logo = new Gtk.Image.from_icon_name("feed-service-feedbin", Gtk.IconSize.MENU);
-
- var loginLabel = new Gtk.Label(_("Please log in to Feedbin to enjoy using FeedReader"));
- loginLabel.get_style_context().add_class("h2");
- loginLabel.set_justify(Gtk.Justification.CENTER);
- loginLabel.set_lines(3);
-
- var loginButton = new Gtk.Button.with_label(_("Login"));
- loginButton.halign = Gtk.Align.END;
- loginButton.set_size_request(80, 30);
- loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginButton.clicked.connect(() => { login(); });
-
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
- box.valign = Gtk.Align.CENTER;
- box.halign = Gtk.Align.CENTER;
- box.pack_start(loginLabel, false, false, 10);
- box.pack_start(logo, false, false, 10);
- box.pack_start(grid, true, true, 10);
- box.pack_end(loginButton, false, false, 20);
-
- m_userEntry.set_text(m_utils.getUser());
- m_passwordEntry.set_text(m_utils.getPasswd());
-
- return box;
- }
-
- public void showHtAccess()
- {
- return;
- }
-
- public void writeData()
- {
- m_utils.setUser(m_userEntry.get_text().strip());
- m_utils.setPassword(m_passwordEntry.get_text().strip());
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public bool extractCode(string redirectURL)
- {
- return false;
- }
-
- public string buildLoginURL()
- {
- return "";
- }
-}
-
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.feedbinLoginWidget));
-}
diff --git a/plugins/backend/feedbin/feedbinUI.plugin b/plugins/backend/feedbin/feedbinUI.plugin
deleted file mode 100644
index 7c72f48a..00000000
--- a/plugins/backend/feedbin/feedbinUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=feedbinUI
-Loader=C
-Name=Feedbin
-Description=Add Feedbin backend to FeedReader
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/feedbin/feedbinUtils.vala b/plugins/backend/feedbin/feedbinUtils.vala
index ad4b6dbe..fb91b72b 100644
--- a/plugins/backend/feedbin/feedbinUtils.vala
+++ b/plugins/backend/feedbin/feedbinUtils.vala
@@ -13,129 +13,53 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.feedbinUtils : GLib.Object {
+public class FeedReader.FeedbinUtils : GLib.Object {
GLib.Settings m_settings;
+ Password m_password;
- public feedbinUtils()
+ public FeedbinUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
{
- m_settings = new GLib.Settings("org.gnome.feedreader.feedbin");
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.feedbin", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.feedbin");
+
+ var password_schema =
+ new Secret.Schema("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, password_schema, "FeedReader: feedbin login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = "feedbin.com";
+ attributes["Username"] = getUser();
+ return attributes;
+ });
}
public string getUser()
{
- return m_settings.get_string("username");
+ return Utils.gsettingReadString(m_settings, "username");
}
public void setUser(string user)
{
- m_settings.set_string("username", user);
+ Utils.gsettingWriteString(m_settings, "username", user);
}
- public string getPasswd()
+ public string getPassword(Cancellable? cancellable = null)
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = "feedbin.com";
- attributes["Username"] = getUser();
-
- string passwd = "";
-
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error(e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_password.get_password(cancellable);
}
- public void setPassword(string passwd)
+ public void setPassword(string password, Cancellable? cancellable = null)
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = "feedbin.com";
- attributes["Username"] = getUser();
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "FeedReader: feedbin login", passwd, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("feedbinUtils: setPassword: " + e.message);
- }
+ m_password.set_password(password, cancellable);
}
- public void resetAccount()
+ public void resetAccount(Cancellable? cancellable = null)
{
Utils.resetSettings(m_settings);
- deletePassword();
- }
-
- public bool deletePassword()
- {
- bool removed = false;
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = "feedbin.com";
- attributes["Username"] = getUser();
-
- Secret.password_clearv.begin (pwSchema, attributes, null, (obj, async_res) => {
- try
- {
- removed = Secret.password_clearv.end(async_res);
- }
- catch(GLib.Error e)
- {
- Logger.error("feedbinUtils.deletePassword: %s".printf(e.message));
- }
- });
- return removed;
- }
-
- public string? catExists(Gee.LinkedList<category> categories, string name)
- {
- foreach(category cat in categories)
- {
- if(cat.getTitle() == name)
- return cat.getCatID();
- }
-
- return null;
- }
-
- public void addFeedToCat(Gee.LinkedList<feed> feeds, string feedID, string catID)
- {
- foreach(feed f in feeds)
- {
- if(f.getFeedID() == feedID)
- {
- f.setCats( {catID} );
- }
- }
- }
-
- public bool isIDinArray(string[] arrayID, string id)
- {
- foreach(string i in arrayID)
- {
- if(i == id)
- return true;
- }
-
- return false;
+ m_password.delete_password(cancellable);
}
}
diff --git a/plugins/backend/feedbin/meson.build b/plugins/backend/feedbin/meson.build
new file mode 100644
index 00000000..fd6994af
--- /dev/null
+++ b/plugins/backend/feedbin/meson.build
@@ -0,0 +1,106 @@
+feedbin_resources = gnome.compile_resources(
+ 'feedbin_res',
+ 'feedbin.gresource.xml'
+)
+
+static_lib = static_library(
+ 'feedbin_static',
+ [
+ 'feedbinAPI.vala',
+ 'feedbinUtils.vala'
+ ],
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ include_directories: include_directories('../../..')
+)
+
+plugin_lib = shared_library(
+ 'feedbin',
+ [
+ 'feedbinInterface.vala',
+ ],
+ feedbin_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib,
+ static_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.feedbin.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'feedbin.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
+
+plugin_test = executable(
+ 'test_feedbin',
+ [
+ 'TestFeedbin.vala'
+ ],
+ c_args: c_args,
+ # The tests intentionally don't catch exceptions
+ vala_args: vala_args + ['--disable-warnings'],
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib,
+ static_lib
+ ],
+ include_directories: include_directories('../../..')
+)
+
+if gtester.found()
+ test('Feedbin plugin', gtester, args:['-k', '-o', meson.build_root() + '/feedbin.gtester.log', plugin_test])
+else
+ test('Feedbin plugin', plugin_test)
+endif
diff --git a/plugins/backend/feedbin/org.gnome.feedreader.feedbin.gschema.xml b/plugins/backend/feedbin/org.gnome.feedreader.feedbin.gschema.xml
index eab76ca8..deee3a4f 100644
--- a/plugins/backend/feedbin/org.gnome.feedreader.feedbin.gschema.xml
+++ b/plugins/backend/feedbin/org.gnome.feedreader.feedbin.gschema.xml
@@ -1,6 +1,6 @@
<schemalist>
- <schema id="org.gnome.feedreader.feedbin" path="/org/gnome/feedreader/feedbin/" gettext-domain="feedreader">
-
+ <schema id="org.gnome.feedreader.feedbin" path="/org/gnome/feedreader/feedbin/" gettext-domain="feedreader">
+
<key name="username" type="s">
<default>""</default>
<summary>Username for feedbin</summary>
@@ -8,6 +8,6 @@
Username for feedbin
</description>
</key>
-
+
</schema>
</schemalist>
diff --git a/plugins/backend/feedhq/feedhq.gresource.xml b/plugins/backend/feedhq/feedhq.gresource.xml
new file mode 100644
index 00000000..bd36a7bb
--- /dev/null
+++ b/plugins/backend/feedhq/feedhq.gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/FeedReader">
+ <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-feedhq.svg</file>
+ <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-feedhq-symbolic.svg</file>
+ </gresource>
+</gresources>
diff --git a/plugins/backend/feedhq/feedhq.plugin b/plugins/backend/feedhq/feedhq.plugin
new file mode 100644
index 00000000..a243cbb4
--- /dev/null
+++ b/plugins/backend/feedhq/feedhq.plugin
@@ -0,0 +1,9 @@
+[Plugin]
+Module=feedhq
+Loader=C
+Name=FeedHQ
+Version=0.1
+Description=Add FeedHQ backend to FeedReader
+Authors=Anwesh Reddy <kanishkablack@gmx.com>
+Copyright=Copyright © 2015-16 Anwesh Reddy
+Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/feedhq/feedhqAPI.vala b/plugins/backend/feedhq/feedhqAPI.vala
new file mode 100644
index 00000000..5651e23b
--- /dev/null
+++ b/plugins/backend/feedhq/feedhqAPI.vala
@@ -0,0 +1,472 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.FeedHQAPI : GLib.Object {
+
+ public enum FeedHQSubscriptionAction {
+ EDIT,
+ SUBSCRIBE,
+ UNSUBSCRIBE
+ }
+
+ private FeedHQConnection m_connection;
+ private FeedHQUtils m_utils;
+ private string m_userID;
+
+ public FeedHQAPI (FeedHQUtils utils)
+ {
+ m_utils = utils;
+ m_connection = new FeedHQConnection(m_utils);
+ }
+
+
+ public LoginResponse login()
+ {
+ Logger.debug("FeedHQ Login");
+
+ if(m_utils.getAccessToken() == "")
+ {
+ var result = m_connection.getToken();
+ if(m_connection.postToken() && getUserID())
+ return result;
+ }
+ else if(getUserID())
+ return LoginResponse.SUCCESS;
+
+ return LoginResponse.UNKNOWN_ERROR;
+ }
+
+ public bool ping()
+ {
+ return Utils.ping("https://feedhq.org");
+ }
+
+ private bool getUserID()
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("user-info?" + msg.get());
+
+ if(response.status != 200)
+ return false;
+
+ var parser = new Json.Parser();
+ try{
+ parser.load_from_data(response.data, -1);
+ }
+ catch (Error e) {
+ Logger.error("getUserID: Could not load message response");
+ Logger.error(e.message);
+ return false;
+ }
+ var root = parser.get_root().get_object();
+
+ if(root.has_member("userId"))
+ {
+ m_userID = root.get_string_member("userId");
+ m_utils.setUserID(m_userID);
+ Logger.info("FeedHQ: userID = " + m_userID);
+
+ if(root.has_member("userName"))
+ m_utils.setUser(root.get_string_member("userName"));
+ return true;
+ }
+
+ return false;
+ }
+
+ public bool getFeeds(Gee.List<Feed> feeds)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("subscription/list?" + msg.get());
+
+ if(response.status != 200)
+ return false;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getFeeds: Could not load message response");
+ Logger.error(e.message);
+ return false;
+ }
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("subscriptions");
+ uint length = array.get_length();
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+
+ string feedID = object.get_string_member("id");
+ string url = object.has_member("htmlUrl") ? object.get_string_member("htmlUrl") : object.get_string_member("url");
+ string? icon_url = object.has_member("iconUrl") ? "https:" + object.get_string_member("iconUrl") : null;
+
+ uint catCount = object.get_array_member("categories").get_length();
+
+ var categories = new Gee.ArrayList<string>();
+ for(uint j = 0; j < catCount; ++j)
+ {
+ categories.add(object.get_array_member("categories").get_object_element(j).get_string_member("id"));
+ }
+ feeds.add(
+ new Feed(
+ feedID,
+ object.get_string_member("title"),
+ url,
+ 0,
+ categories,
+ icon_url
+ )
+ );
+ }
+ return true;
+ }
+
+ public bool getCategoriesAndTags(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("tag/list?" + msg.get());
+
+ if(response.status != 200)
+ return false;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("getCategoriesAndTags: Could not load message response");
+ Logger.error(e.message);
+ return false;
+ }
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("tags");
+ uint length = array.get_length();
+ int orderID = 0;
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ string id = object.get_string_member("id");
+ int start = id.last_index_of_char('/') + 1;
+ string title = id.substring(start);
+
+ if(id.contains("/label/"))
+ {
+ categories.add(
+ new Category(
+ id,
+ title,
+ 0,
+ orderID,
+ CategoryID.MASTER.to_string(),
+ 1
+ )
+ );
+ ++orderID;
+ }
+ }
+ return true;
+ }
+
+
+ public int getTotalUnread()
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ var response = m_connection.send_get_request("unread-count?" + msg.get());
+
+ var parser = new Json.Parser();
+ try{
+ parser.load_from_data(response.data, -1);
+ }
+ catch (Error e) {
+ Logger.error("getTotalUnread: Could not load message response");
+ Logger.error(e.message);
+ }
+
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("unreadcounts");
+ uint length = array.get_length();
+ int count = 0;
+
+ for (uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ if(object.get_string_member("id").has_prefix("feed/"))
+ {
+ count += (int)object.get_int_member("count");
+ }
+
+ }
+
+ Logger.debug("getTotalUnread %i".printf(count));
+ return count;
+ }
+
+
+ public string? updateArticles(Gee.List<string> ids, int count, string? continuation = null)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ msg.add("n", count.to_string());
+ msg.add("s", "user/-/state/com.google/read");
+ if(continuation != null)
+ msg.add("c", continuation);
+
+ var response = m_connection.send_get_request("stream/items/ids?" + msg.get());
+
+ if(response.status != 200)
+ return null;
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(response.data, -1);
+ }
+ catch(Error e)
+ {
+ Logger.error("updateArticles: Could not load message response");
+ Logger.error(e.message);
+ }
+
+ var root = parser.get_root().get_object();
+
+ if(!root.has_member("itemRefs"))
+ {
+ Logger.error("updateArticles: wrong response?");
+ return null;
+ }
+
+ var array = root.get_array_member("itemRefs");
+ uint length = array.get_length();
+
+ for(uint i = 0; i < length; i++)
+ {
+ Json.Object object = array.get_object_element(i);
+ ids.add(object.get_string_member("id"));
+ }
+
+ if(root.has_member("continuation") && root.get_string_member("continuation") != "")
+ return root.get_string_member("continuation");
+
+ return null;
+ }
+
+ public string? getArticles(Gee.List<Article> articles, int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? continuation = null, string? tagID = null, string? feed_id = null)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ msg.add("n", count.to_string());
+
+ if(whatToGet == ArticleStatus.UNREAD)
+ msg.add("xt", "user/-/state/com.google/read");
+ if(whatToGet == ArticleStatus.READ)
+ msg.add("s", "user/-/state/com.google/read");
+ else if(whatToGet == ArticleStatus.MARKED)
+ msg.add("s", "user/-/state/com.google/starred");
+
+ if(continuation != null)
+ msg.add("c", continuation);
+
+ string api_endpoint = "stream/contents";
+ if(feed_id != null)
+ api_endpoint += "/" + feed_id;
+ else if(tagID != null)
+ api_endpoint += "/" + tagID;
+ var response = m_connection.send_get_request(api_endpoint + "?" + msg.get());
+
+ if(response.status != 200)
+ return null;
+
+ Logger.debug(api_endpoint + "?" + msg.get());
+
+ var parser = new Json.Parser();
+ try{
+ parser.load_from_data(response.data, -1);
+ }
+ catch (Error e) {
+ Logger.error("getCategoriesAndTags: Could not load message response");
+ Logger.error(e.message);
+ }
+
+ var root = parser.get_root().get_object();
+ var array = root.get_array_member("items");
+ uint length = array.get_length();
+
+ for (uint i = 0; i < length; i++)
+ {
+
+ Json.Object object = array.get_object_element(i);
+ string id = object.get_string_member("id");
+ bool marked = false;
+ bool read = false;
+ var cats = object.get_array_member("categories");
+ uint cat_length = cats.get_length();
+
+ var tags = new Gee.ArrayList<string>();
+ for (uint j = 0; j < cat_length; j++)
+ {
+ string cat = cats.get_string_element(j);
+ if(cat.has_suffix("com.google/starred"))
+ marked = true;
+ else if(cat.has_suffix("com.google/read"))
+ read = true;
+ else if(cat.contains("/label/"))
+ tags.add(cat);
+ }
+
+ var enclosures = new Gee.ArrayList<Enclosure>();
+ if(object.has_member("enclosure"))
+ {
+ var attachments = object.get_array_member("enclosure");
+
+ uint mediaCount = 0;
+ if(attachments != null)
+ mediaCount = attachments.get_length();
+
+ for(int j = 0; j < mediaCount; ++j)
+ {
+ var attachment = attachments.get_object_element(j);
+ enclosures.add(
+ new Enclosure(id, attachment.get_string_member("href"),
+ EnclosureType.from_string(attachment.get_string_member("type")))
+ );
+ }
+ }
+
+ articles.add(new Article(
+ id,
+ object.get_string_member("title"),
+ object.get_array_member("alternate").get_object_element(0).get_string_member("href"),
+ object.get_object_member("origin").get_string_member("streamId"),
+ read ? ArticleStatus.READ : ArticleStatus.UNREAD,
+ marked ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
+ null,
+ null,
+ null,
+ new DateTime.from_unix_local(object.get_int_member("published")),
+ -1,
+ tags,
+ enclosures
+ )
+ );
+ }
+
+ if(root.has_member("continuation") && root.get_string_member("continuation") != "")
+ return root.get_string_member("continuation");
+
+ return null;
+ }
+
+
+ public void edidTag(string articleID, string tagID, bool add = true)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+
+ if(add)
+ msg.add("a", tagID);
+ else
+ msg.add("r", tagID);
+
+ msg.add("i", articleID);
+ m_connection.send_post_request("edit-tag", msg.get());
+ }
+
+ public void markAsRead(string streamID)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ msg.add("s", streamID);
+ msg.add("ts", "%i000000".printf(Settings.state().get_int("last-sync")));
+ Logger.debug(msg.get());
+ m_connection.send_post_request("mark-all-as-read", msg.get());
+ }
+
+ public string composeTagID(string tagName)
+ {
+ return "user/%s/label/%s".printf(m_userID, tagName);
+ }
+
+ public void deleteTag(string tagID)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ msg.add("s", tagID);
+ m_connection.send_post_request("disable-tag", msg.get());
+ }
+
+ public void renameTag(string tagID, string title)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+ msg.add("s", tagID);
+ msg.add("dest", composeTagID(title));
+ m_connection.send_post_request("rename-tag", msg.get());
+ }
+
+ public bool editSubscription(FeedHQSubscriptionAction action, string[] feedID, string? title = null, string? add = null, string? remove = null)
+ {
+ var msg = new feedhqMessage();
+ msg.add("output", "json");
+
+ switch(action)
+ {
+ case FeedHQSubscriptionAction.EDIT:
+ msg.add("ac", "edit");
+ break;
+ case FeedHQSubscriptionAction.SUBSCRIBE:
+ msg.add("ac", "subscribe");
+ break;
+ case FeedHQSubscriptionAction.UNSUBSCRIBE:
+ msg.add("ac", "unsubscribe");
+ break;
+ }
+
+ foreach(string s in feedID)
+ msg.add("s", s);
+
+ if(title != null)
+ msg.add("t", title);
+
+ if(add != null && add != "")
+ msg.add("a", add);
+
+
+ if(remove != null && remove != "")
+ msg.add("r", remove);
+
+ Logger.debug(msg.get());
+ var response = m_connection.send_post_request("subscription/edit", msg.get());
+
+ return response.status == 200;
+ }
+
+ public void import(string opml)
+ {
+ var response = m_connection.send_post_request("subscription/import", opml);
+ Logger.debug("feedhq.import: " + response.data);
+ }
+}
diff --git a/plugins/backend/feedhq/feedhqConnection.vala b/plugins/backend/feedhq/feedhqConnection.vala
new file mode 100644
index 00000000..3b00bc43
--- /dev/null
+++ b/plugins/backend/feedhq/feedhqConnection.vala
@@ -0,0 +1,165 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.FeedHQConnection {
+ private string m_username;
+ private string m_api_code;
+ private string m_passwd;
+ private FeedHQUtils m_utils;
+ private Soup.Session m_session;
+
+ public FeedHQConnection(FeedHQUtils utils)
+ {
+ m_utils = utils;
+ m_username = m_utils.getUser();
+ m_api_code = m_utils.getAccessToken();
+ m_passwd = m_utils.getPasswd();
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ }
+
+ public LoginResponse getToken()
+ {
+ Logger.debug("FeedHQ Connection: getToken()");
+
+ if(m_username == "" && m_passwd == "")
+ return LoginResponse.ALL_EMPTY;
+ if(m_username == "")
+ return LoginResponse.MISSING_USER;
+ if(m_passwd == "")
+ return LoginResponse.MISSING_PASSWD;
+
+ var message = new Soup.Message("POST", "https://feedhq.org/accounts/ClientLogin");
+ string message_string = "Email=" + m_username + "&Passwd=" + m_passwd;
+ message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
+ m_session.send_message(message);
+ string response = (string)message.response_body.flatten().data;
+ try{
+
+ var regex = new Regex(".*\\w\\s.*\\w\\sAuth=");
+ if(regex.match(response))
+ {
+ string split = regex.replace(response, -1,0,"");
+ Logger.debug("FeedHQ Authcode : " + split);
+ m_utils.setAccessToken(split.strip());
+ return LoginResponse.SUCCESS;
+ }
+ else
+ {
+ Logger.debug(response);
+ return LoginResponse.WRONG_LOGIN;
+ }
+ }
+ catch(Error e)
+ {
+ Logger.error("FeedHQConnection - getToken: Could not load message response");
+ Logger.error(e.message);
+ return LoginResponse.UNKNOWN_ERROR;
+ }
+ }
+
+
+ public bool postToken()
+ {
+ Logger.debug("FeedHQ Connection: postToken()");
+
+ var message = new Soup.Message("GET", FeedHQSecret.base_uri + "token?output=json");
+
+ string oldauth = "GoogleLogin auth=" + m_utils.getAccessToken();
+ message.request_headers.append("Authorization", oldauth);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.debug("FeedHQ post token failed");
+ return false;
+ }
+
+ string response = (string)message.response_body.data;
+ Logger.debug("FeedHQ post token : " + response);
+ m_utils.setPostToken(response);
+
+ return true;
+
+ }
+ public Response send_get_request(string path, string? message_string = null)
+ {
+ return send_request(path, "GET", message_string);
+ }
+
+ public Response send_post_request(string path, string? message_string = null)
+ {
+ return send_request(path, "POST", message_string);
+ }
+
+
+
+ private Response send_request(string path, string type, string? message_string = null)
+ {
+ var message = new Soup.Message(type, FeedHQSecret.base_uri + path);
+
+ string oldauth = "GoogleLogin auth=" + m_utils.getAccessToken();
+ message.request_headers.append("Authorization", oldauth);
+ var message_string_post = message_string + "&T=" + m_utils.getPostToken();
+ if(message_string != null)
+ message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string_post.data);
+
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning(@"feedHQConnection: message unexpected response - $message_string");
+ }
+
+ if((uint)message.status_code == 401)
+ {
+ Logger.debug("FeedHQ Post Token Expired");
+ postToken();
+ return send_request(path, type, message_string);
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
+ }
+
+}
+
+
+public class FeedReader.feedhqMessage {
+
+ string request = "";
+
+ public feedhqMessage()
+ {
+
+ }
+
+ public void add(string parameter, string val)
+ {
+ if(request != "")
+ request += "&";
+
+ request += parameter;
+ request += "=";
+ request += GLib.Uri.escape_string(val);
+ }
+
+ public string get()
+ {
+ return request;
+ }
+}
diff --git a/plugins/backend/feedhq/feedhqInterface.vala b/plugins/backend/feedhq/feedhqInterface.vala
new file mode 100644
index 00000000..c30dc41e
--- /dev/null
+++ b/plugins/backend/feedhq/feedhqInterface.vala
@@ -0,0 +1,443 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.FeedHQInterface : Peas.ExtensionBase, FeedServerInterface {
+
+ private FeedHQAPI m_api;
+ private FeedHQUtils m_utils;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
+
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
+ {
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new FeedHQUtils(settings_backend, secrets);
+ m_api = new FeedHQAPI(m_utils);
+ }
+
+ public string getWebsite()
+ {
+ return "https://feedhq.org/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID);
+ }
+
+ public string getID()
+ {
+ return "feedhq";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-feedhq";
+ }
+
+ public string serviceName()
+ {
+ return "FeedHQ";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var user_label = new Gtk.Label(_("Username:"));
+ var password_label = new Gtk.Label(_("Password:"));
+
+ user_label.set_alignment(1.0f, 0.5f);
+ password_label.set_alignment(1.0f, 0.5f);
+
+ user_label.set_hexpand(true);
+ password_label.set_hexpand(true);
+
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+
+ m_userEntry.activate.connect(() => { tryLogin(); });
+ m_passwordEntry.activate.connect(() => { tryLogin(); });
+
+ m_passwordEntry.set_invisible_char('*');
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ grid.attach(user_label, 0, 0, 1, 1);
+ grid.attach(m_userEntry, 1, 0, 1, 1);
+ grid.attach(password_label, 0, 1, 1, 1);
+ grid.attach(m_passwordEntry, 1, 1, 1, 1);
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-feedhq", Gtk.IconSize.MENU);
+
+ var loginLabel = new Gtk.Label(_("Please log in to FeedHQ and enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => { tryLogin(); });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPasswd());
+
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+
+ }
+
+ public void writeData()
+ {
+ m_utils.setUser(m_userEntry.get_text());
+ m_utils.setPassword(m_passwordEntry.get_text());
+ }
+
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
+ }
+
+ public bool supportTags()
+ {
+ return false;
+ }
+
+ public bool supportFeedManipulation()
+ {
+ return true;
+ }
+
+ public bool doInitSync()
+ {
+ return true;
+ }
+
+ public string symbolicIcon()
+ {
+ return "feed-service-feedhq-symbolic";
+ }
+
+ public string accountName()
+ {
+ return m_utils.getUser();
+ }
+
+ public string getServerURL()
+ {
+ return "FeedHQ.org";
+ }
+
+ public string uncategorizedID()
+ {
+ return "";
+ }
+
+ public bool supportCategories()
+ {
+ return true;
+ }
+
+ public bool hideCategoryWhenEmpty(string cadID)
+ {
+ return false;
+ }
+
+ public bool supportMultiLevelCategories()
+ {
+ return false;
+ }
+
+ public bool supportMultiCategoriesPerFeed()
+ {
+ return false;
+ }
+
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
+ public bool tagIDaffectedByNameChange()
+ {
+ return true;
+ }
+
+ public void resetAccount()
+ {
+ m_utils.resetAccount();
+ }
+
+ public bool useMaxArticles()
+ {
+ return true;
+ }
+
+ public LoginResponse login()
+ {
+ return m_api.login();
+ }
+
+ public bool logout()
+ {
+ return true;
+ }
+
+ public void setArticleIsRead(string articleIDs, ArticleStatus read)
+ {
+ if(read == ArticleStatus.READ)
+ m_api.edidTag(articleIDs, "user/-/state/com.google/read");
+ else
+ m_api.edidTag(articleIDs, "user/-/state/com.google/read", false);
+ }
+
+ public void setArticleIsMarked(string articleID, ArticleStatus marked)
+ {
+ if(marked == ArticleStatus.MARKED)
+ m_api.edidTag(articleID, "user/-/state/com.google/starred");
+ else
+ m_api.edidTag(articleID, "user/-/state/com.google/starred", false);
+ }
+
+ public void setFeedRead(string feedID)
+ {
+ m_api.markAsRead(feedID);
+ }
+
+ public void setCategoryRead(string catID)
+ {
+ m_api.markAsRead(catID);
+ }
+
+ public void markAllItemsRead()
+ {
+ var categories = m_db.read_categories();
+ foreach(Category cat in categories)
+ {
+ m_api.markAsRead(cat.getCatID());
+ }
+
+ var feeds = m_db.read_feeds_without_cat();
+ foreach(Feed feed in feeds)
+ {
+ m_api.markAsRead(feed.getFeedID());
+ }
+ }
+
+ public void tagArticle(string articleID, string tagID)
+ {
+ return;
+ }
+
+ public void removeArticleTag(string articleID, string tagID)
+ {
+ return;
+ }
+
+ public string createTag(string caption)
+ {
+ return ":(";
+ }
+
+ public void deleteTag(string tagID)
+ {
+ return;
+ }
+
+ public void renameTag(string tagID, string title)
+ {
+ return;
+ }
+
+ public bool serverAvailable()
+ {
+ return m_api.ping();
+ }
+
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
+ {
+ feedID = "feed/" + feedURL;
+ bool success = false;
+
+ if(catID == null && newCatName != null)
+ {
+ string newCatID = m_api.composeTagID(newCatName);
+ Logger.debug(newCatID);
+ success = m_api.editSubscription(FeedHQAPI.FeedHQSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, newCatID);
+ }
+ else
+ {
+ success = m_api.editSubscription(FeedHQAPI.FeedHQSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, catID);
+ }
+
+ if(!success)
+ errmsg = @"feedHQ could not subscribe to $feedURL";
+ else
+ errmsg = "";
+
+ return success;
+ }
+
+ public void addFeeds(Gee.List<Feed> feeds)
+ {
+ return;
+ }
+
+ public void removeFeed(string feedID)
+ {
+ m_api.editSubscription(FeedHQAPI.FeedHQSubscriptionAction.UNSUBSCRIBE, {feedID});
+ }
+
+ public void renameFeed(string feedID, string title)
+ {
+ m_api.editSubscription(FeedHQAPI.FeedHQSubscriptionAction.EDIT, {feedID}, title);
+ }
+
+ public void moveFeed(string feedID, string newCatID, string? currentCatID)
+ {
+ m_api.editSubscription(FeedHQAPI.FeedHQSubscriptionAction.EDIT, {feedID}, null, newCatID, currentCatID);
+ }
+
+ public string createCategory(string title, string? parentID)
+ {
+ return m_api.composeTagID(title);
+ }
+
+ public void renameCategory(string catID, string title)
+ {
+ m_api.renameTag(catID, title);
+ }
+
+ public void moveCategory(string catID, string newParentID)
+ {
+ return;
+ }
+
+ public void deleteCategory(string catID)
+ {
+ m_api.deleteTag(catID);
+ }
+
+ public void removeCatFromFeed(string feedID, string catID)
+ {
+ return;
+ }
+
+ public void importOPML(string opml)
+ {
+ m_api.import(opml);
+ }
+
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
+ {
+ if(m_api.getFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getCategoriesAndTags(feeds, categories, tags))
+ return true;
+ }
+
+ return false;
+ }
+
+ public int getUnreadCount()
+ {
+ return m_api.getTotalUnread();
+ }
+
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
+ {
+ if(whatToGet == ArticleStatus.READ)
+ {
+ return;
+ }
+ else if(whatToGet == ArticleStatus.ALL)
+ {
+ var unreadIDs = new Gee.LinkedList<string>();
+ string? continuation = null;
+
+ do
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ continuation = m_api.updateArticles(unreadIDs, 1000, continuation);
+ }
+ while(continuation != null);
+ m_db_write.updateArticlesByID(unreadIDs, "unread");
+ }
+
+ var articles = new Gee.LinkedList<Article>();
+ string? continuation = null;
+ string? FeedHQ_feedID = (isTagID) ? null : feedID;
+ string? FeedHQ_tagID = (isTagID) ? feedID : null;
+
+ do
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ continuation = m_api.getArticles(articles, count, whatToGet, continuation, FeedHQ_tagID, FeedHQ_feedID);
+ }
+ while(continuation != null);
+
+ writeArticles(articles);
+ }
+
+}
+
+[ModuleInit]
+public void peas_register_types(GLib.TypeModule module)
+{
+ var objmodule = module as Peas.ObjectModule;
+ objmodule.register_extension_type(typeof(FeedReader.FeedServerInterface), typeof(FeedReader.FeedHQInterface));
+}
diff --git a/plugins/backend/feedhq/feedhqUtils.vala b/plugins/backend/feedhq/feedhqUtils.vala
new file mode 100644
index 00000000..483edd74
--- /dev/null
+++ b/plugins/backend/feedhq/feedhqUtils.vala
@@ -0,0 +1,119 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+namespace FeedReader.FeedHQSecret {
+ const string base_uri = "https://feedhq.org/reader/api/0/";
+}
+
+public class FeedReader.FeedHQUtils : GLib.Object {
+
+ private GLib.Settings m_settings;
+ private Password m_password;
+
+ public FeedHQUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
+ {
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.feedhq", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.feedhq");
+
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.feedhq", Secret.SchemaFlags.NONE,
+ "type", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, pwSchema, "Feedserver login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["type"] = "FeedHQ";
+ attributes["Username"] = getUser();
+ return attributes;
+ });
+ }
+
+ public string getUser()
+ {
+ return Utils.gsettingReadString(m_settings, "username");
+ }
+
+ public void setUser(string user)
+ {
+ Utils.gsettingWriteString(m_settings, "username", user);
+ }
+
+ public string getAccessToken()
+ {
+ return Utils.gsettingReadString(m_settings, "access-token");
+ }
+
+ public void setAccessToken(string token)
+ {
+ Utils.gsettingWriteString(m_settings, "access-token", token);
+ }
+
+ public string getPostToken()
+ {
+ return Utils.gsettingReadString(m_settings, "post-token");
+ }
+
+ public void setPostToken(string token)
+ {
+ Utils.gsettingWriteString(m_settings, "post-token", token);
+ }
+ public string getUserID()
+ {
+ return Utils.gsettingReadString(m_settings, "user-id");
+ }
+
+ public void setUserID(string id)
+ {
+ Utils.gsettingWriteString(m_settings, "user-id", id);
+ }
+
+ public string getEmail()
+ {
+ return Utils.gsettingReadString(m_settings, "user-email");
+ }
+
+ public void setEmail(string email)
+ {
+ Utils.gsettingWriteString(m_settings, "user-email", email);
+ }
+
+ public void resetAccount()
+ {
+ Utils.resetSettings(m_settings);
+ m_password.delete_password();
+ }
+
+ public bool tagIsCat(string tagID, Gee.List<Feed> feeds)
+ {
+ foreach(Feed feed in feeds)
+ {
+ if(feed.hasCat(tagID))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public string getPasswd()
+ {
+ return m_password.get_password();
+ }
+
+ public void setPassword(string passwd)
+ {
+ m_password.set_password(passwd);
+ }
+}
diff --git a/plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq-symbolic.svg b/plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq-symbolic.svg
new file mode 100644
index 00000000..7d5ac0ff
--- /dev/null
+++ b/plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq-symbolic.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 16.933333 16.933333"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="feed-service-feedhq-symbolic.svg">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="41.811658"
+ inkscape:cy="17.702943"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-280.06667)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.98608589px;line-height:5.6163063px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.22465223;"
+ x="0.19394419"
+ y="287.23932"
+ id="text3692"><tspan
+ sodipodi:role="line"
+ id="tspan3690"
+ x="0.19394419"
+ y="287.23932"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.98608589px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.22465223;fill:#bebebe;fill-opacity:1;">feed</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:6.61458302px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
+ x="1.0866816"
+ y="294.92114"
+ id="text3696"><tspan
+ sodipodi:role="line"
+ id="tspan3694"
+ x="1.0866816"
+ y="294.92114"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332;fill:#bebebe;fill-opacity:1;">HQ</tspan></text>
+ </g>
+</svg>
diff --git a/plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq.svg b/plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq.svg
new file mode 100644
index 00000000..cc74a95a
--- /dev/null
+++ b/plugins/backend/feedhq/icons/64x64/places/feed-service-feedhq.svg
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 16.933333 16.933333"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="feed-service-feedhq.svg">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="43.061658"
+ inkscape:cy="17.702943"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1920"
+ inkscape:window-height="1136"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-280.06667)">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.98608589px;line-height:5.6163063px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.22465223"
+ x="0.19394419"
+ y="287.23932"
+ id="text3692"><tspan
+ sodipodi:role="line"
+ id="tspan3690"
+ x="0.19394419"
+ y="287.23932"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.98608589px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.22465223">feed</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;line-height:6.61458302px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+ x="1.0866816"
+ y="294.92114"
+ id="text3696"><tspan
+ sodipodi:role="line"
+ id="tspan3694"
+ x="1.0866816"
+ y="294.92114"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.58333302px;font-family:'Abyssinica SIL';-inkscape-font-specification:'Abyssinica SIL, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">HQ</tspan></text>
+ </g>
+</svg>
diff --git a/plugins/backend/feedhq/meson.build b/plugins/backend/feedhq/meson.build
new file mode 100644
index 00000000..4d2cd83f
--- /dev/null
+++ b/plugins/backend/feedhq/meson.build
@@ -0,0 +1,49 @@
+feedhq_resources = gnome.compile_resources(
+ 'feedhq_res',
+ 'feedhq.gresource.xml'
+)
+
+shared_library(
+ 'feedhq',
+ [
+ 'feedhqAPI.vala',
+ 'feedhqInterface.vala',
+ 'feedhqUtils.vala',
+ 'feedhqConnection.vala'
+ ],
+ feedhq_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.feedhq.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'feedhq.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/feedhq/org.gnome.feedreader.feedhq.gschema.xml b/plugins/backend/feedhq/org.gnome.feedreader.feedhq.gschema.xml
new file mode 100644
index 00000000..3feebdd2
--- /dev/null
+++ b/plugins/backend/feedhq/org.gnome.feedreader.feedhq.gschema.xml
@@ -0,0 +1,30 @@
+<schemalist>
+ <schema id="org.gnome.feedreader.feedhq" path="/org/gnome/feedreader/feedhq/" gettext-domain="feedhq">
+
+ <key name="username" type="s">
+ <default>""</default>
+ <summary>apiCode</summary>
+ <description>Authenticated username to TheOldReader throught API</description>
+ </key>
+ <key name="access-token" type="s">
+ <default>""</default>
+ <description>Authorization code to TheOldreader throught API</description>
+ </key>
+
+ <key name="service" type="s">
+ <default>""</default>
+ <description>Service Name</description>
+ </key>
+
+ <key name="user-id" type="s">
+ <default>""</default>
+ <description>Interneal User ID</description>
+ </key>
+
+ <key name="post-token" type="s">
+ <default>""</default>
+ <description>Post Token</description>
+ </key>
+ </schema>
+
+</schemalist>
diff --git a/plugins/backend/feedly/CMakeLists.txt b/plugins/backend/feedly/CMakeLists.txt
deleted file mode 100644
index a0cdabd9..00000000
--- a/plugins/backend/feedly/CMakeLists.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-set (NAME feedly)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- feedlyAPI.vala
- feedlyInterface.vala
- feedlyUtils.vala
- feedlyConnection.vala
-
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- feedlyLoginWidget.vala
- feedlyUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
diff --git a/plugins/backend/feedly/feedly.plugin b/plugins/backend/feedly/feedly.plugin
index 613daaab..60536f2a 100644
--- a/plugins/backend/feedly/feedly.plugin
+++ b/plugins/backend/feedly/feedly.plugin
@@ -2,6 +2,7 @@
Module=feedly
Loader=C
Name=feedly
+Version=0.1
Description=Add feedly backend to FeedReader
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/feedly/feedlyAPI.vala b/plugins/backend/feedly/feedlyAPI.vala
index 93b70f9e..ba8b3873 100644
--- a/plugins/backend/feedly/feedlyAPI.vala
+++ b/plugins/backend/feedly/feedlyAPI.vala
@@ -19,10 +19,12 @@ public class FeedReader.FeedlyAPI : Object {
private string m_userID;
private Json.Array m_unreadcounts;
private FeedlyUtils m_utils;
+ private DataBaseReadOnly m_db;
- public FeedlyAPI() {
- m_connection = new FeedlyConnection();
- m_utils = new FeedlyUtils();
+ public FeedlyAPI(FeedlyUtils utils, DataBaseReadOnly db) {
+ m_db = db;
+ m_utils = utils;
+ m_connection = new FeedlyConnection(m_utils);
}
public string createCatID(string title)
@@ -68,12 +70,18 @@ public class FeedReader.FeedlyAPI : Object {
private bool getUserID()
{
- string response = m_connection.send_get_request_to_feedly ("/v3/profile/");
+ var response = m_connection.send_get_request_to_feedly ("/v3/profile/");
+
+ if(response.status != 200)
+ return false;
+
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getUserID: Could not load message response");
Logger.error(e.message);
return false;
@@ -110,14 +118,20 @@ public class FeedReader.FeedlyAPI : Object {
return false;
}
- private int tokenStillValid()
+ private ConnectionError tokenStillValid()
{
- string response = m_connection.send_get_request_to_feedly ("/v3/profile/");
+ var response = m_connection.send_get_request_to_feedly ("/v3/profile/");
+
+ if(response.status != 200)
+ return ConnectionError.NO_RESPONSE;
+
var parser = new Json.Parser ();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("tokenStillValid: Could not load message response");
Logger.error(e.message);
return ConnectionError.NO_RESPONSE;
@@ -133,17 +147,17 @@ public class FeedReader.FeedlyAPI : Object {
}
- public bool getCategories(Gee.LinkedList<category> categories)
+ public bool getCategories(Gee.List<Category> categories)
{
- string response = m_connection.send_get_request_to_feedly ("/v3/categories/");
+ var response = m_connection.send_get_request_to_feedly ("/v3/categories/");
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e)
{
@@ -163,7 +177,7 @@ public class FeedReader.FeedlyAPI : Object {
continue;
categories.add(
- new category (
+ new Category (
categorieID,
object.get_string_member("label"),
getUnreadCountforID(categorieID),
@@ -178,18 +192,20 @@ public class FeedReader.FeedlyAPI : Object {
}
- public bool getFeeds(Gee.LinkedList<feed> feeds)
+ public bool getFeeds(Gee.List<Feed> feeds)
{
- string response = m_connection.send_get_request_to_feedly("/v3/subscriptions/");
+ var response = m_connection.send_get_request_to_feedly("/v3/subscriptions/");
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getFeeds: Could not load message response");
Logger.error(e.message);
return false;
@@ -200,56 +216,36 @@ public class FeedReader.FeedlyAPI : Object {
for (uint i = 0; i < length; i++) {
Json.Object object = array.get_object_element(i);
-
string feedID = object.get_string_member("id");
- string url = object.has_member("website") ? object.get_string_member("website") : "";
- string icon_url = "";
+
+ string? icon_url = null;
if(object.has_member("iconUrl"))
- {
icon_url = object.get_string_member("iconUrl");
- }
else if(object.has_member("visualUrl"))
- {
icon_url = object.get_string_member("visualUrl");
- }
-
- if(icon_url != "" && !m_utils.downloadIcon(feedID, icon_url))
- {
- icon_url = "";
- }
-
- string title = "No Title";
- if(object.has_member("title"))
- {
- title = object.get_string_member("title");
- }
- else
- {
- title = Utils.URLtoFeedName(url);
- }
uint catCount = object.get_array_member("categories").get_length();
- string[] categories = {};
+ var categories = new Gee.ArrayList<string>();
for(uint j = 0; j < catCount; ++j)
{
- string categorieID = object.get_array_member("categories").get_object_element(j).get_string_member("id");
+ string categoryID = object.get_array_member("categories").get_object_element(j).get_string_member("id");
- if(categorieID.has_suffix("global.all")
- || categorieID.has_suffix("global.uncategorized"))
+ if(categoryID.has_suffix("global.all")
+ || categoryID.has_suffix("global.uncategorized"))
continue;
- categories += categorieID;
+ categories.add(categoryID);
}
feeds.add(
- new feed (
+ new Feed(
feedID,
- title,
- url,
- (icon_url == "") ? false : true,
+ object.get_string_member("title"),
+ object.get_string_member("website"),
getUnreadCountforID(object.get_string_member("id")),
- categories
+ categories,
+ icon_url
)
);
}
@@ -258,16 +254,16 @@ public class FeedReader.FeedlyAPI : Object {
}
- public bool getTags(Gee.LinkedList<tag> tags)
+ public bool getTags(Gee.List<Tag> tags)
{
- string response = m_connection.send_get_request_to_feedly("/v3/tags/");
+ var response = m_connection.send_get_request_to_feedly("/v3/tags/");
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
try{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e) {
Logger.error("getTags: Could not load message response");
@@ -281,10 +277,10 @@ public class FeedReader.FeedlyAPI : Object {
Json.Object object = array.get_object_element(i);
tags.add(
- new tag(
+ new Tag(
object.get_string_member("id"),
object.has_member("label") ? object.get_string_member("label") : "",
- dbDaemon.get_default().getTagColor()
+ m_db.getTagColor()
)
);
}
@@ -294,10 +290,9 @@ public class FeedReader.FeedlyAPI : Object {
- public string getArticles(Gee.LinkedList<article> articles, int count, string continuation = "", ArticleStatus whatToGet = ArticleStatus.ALL, string tagID = "", string feed_id = "")
+ public string? getArticles(Gee.List<Article> articles, int count, string? continuation = null, ArticleStatus whatToGet = ArticleStatus.ALL, string tagID = "", string feed_id = "")
{
string steamID = "user/" + m_userID + "/category/global.all";
- string cont = "";
string onlyUnread = "false";
string marked_tag = "user/" + m_userID + "/tag/global.saved";
@@ -315,42 +310,54 @@ public class FeedReader.FeedlyAPI : Object {
var parser = new Json.Parser();
- string streamCall = "/v3/streams/ids?streamId=%s&unreadOnly=%s&count=%i&ranked=newest&continuation=%s".printf(steamID, onlyUnread, count, continuation);
- string entry_id_response = m_connection.send_get_request_to_feedly(streamCall);
- try{
- parser.load_from_data(entry_id_response, -1);
+ string streamCall = "/v3/streams/ids?streamId=%s&unreadOnly=%s&count=%i&ranked=newest&continuation=%s".printf(steamID, onlyUnread, count, (continuation == null) ? "" : continuation);
+ var entry_id_response = m_connection.send_get_request_to_feedly(streamCall);
+
+ if(entry_id_response.status != 200)
+ return null;
+
+ try
+ {
+ parser.load_from_data(entry_id_response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getArticles: Could not load message response");
Logger.error(e.message);
}
+
var root = parser.get_root().get_object();
- if(root.has_member("continuation"))
- {
- cont = root.get_string_member("continuation");
- }
+ if(!root.has_member("continuation"))
+ return null;
- string response = m_connection.send_post_string_request_to_feedly("/v3/entries/.mget", entry_id_response,"application/json");
- //Logger.debug(response);
+ string cont = root.get_string_member("continuation");
- try{
- parser.load_from_data(response, -1);
+ var response = m_connection.send_post_string_request_to_feedly("/v3/entries/.mget", entry_id_response.data,"application/json");
+
+ if(response.status != 200)
+ return null;
+
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getArticles: Could not load message response");
Logger.error(e.message);
}
var array = parser.get_root().get_array();
- for(int i = 0; i < array.get_length(); i++) {
+ for(int i = 0; i < array.get_length(); i++)
+ {
Json.Object object = array.get_object_element(i);
string id = object.get_string_member("id");
- string title = object.has_member("title") ? object.get_string_member("title") : "No title specified";
- string? author = object.has_member("author") ? object.get_string_member("author") : null;
- string summaryContent = object.has_member("summary") ? object.get_object_member("summary").get_string_member("content") : "";
+ string title = object.get_string_member("title");
+ string? author = object.get_string_member("author");
+ string summaryContent = object.has_member("summary") ? object.get_object_member("summary").get_string_member("content") : null;
string content = object.has_member("content") ? object.get_object_member("content").get_string_member("content") : summaryContent;
bool unread = object.get_boolean_member("unread");
- string url = object.has_member("alternate") ? object.get_array_member("alternate").get_object_element(0).get_string_member("href") : "";
+ string url = object.has_member("alternate") ? object.get_array_member("alternate").get_object_element(0).get_string_member("href") : null;
string feedID = object.get_object_member("origin").get_string_member("streamId");
DateTime date = new DateTime.now_local();
@@ -367,28 +374,27 @@ public class FeedReader.FeedlyAPI : Object {
date = new DateTime.from_unix_local(object.get_int_member("crawled")/1000);
}
- string tagString = "";
- string tmpTag = "";
var marked = ArticleStatus.UNMARKED;
+ var tags = new Gee.ArrayList<string>();
if(object.has_member("tags"))
{
- var tags = object.get_array_member("tags");
- uint tagCount = tags.get_length();
+ var tag_array = object.get_array_member("tags");
+ uint tagCount = tag_array.get_length();
for(int j = 0; j < tagCount; ++j)
{
- tmpTag = tags.get_object_element(j).get_string_member("id");
- if(tmpTag == marked_tag)
+ var tag = tag_array.get_object_element(j).get_string_member("id");
+ if(tag == marked_tag)
marked = ArticleStatus.MARKED;
- else if(tmpTag.contains("global."))
+ else if(tag.contains("global."))
continue;
else
- tagString = tagString + tmpTag + ",";
+ tags.add(tag);
}
}
- string mediaString = "";
+ var enclosures = new Gee.ArrayList<Enclosure>();
if(object.has_member("enclosure"))
{
var attachments = object.get_array_member("enclosure");
@@ -400,29 +406,28 @@ public class FeedReader.FeedlyAPI : Object {
for(int j = 0; j < mediaCount; ++j)
{
var attachment = attachments.get_object_element(j);
- if(attachment.get_string_member("type").contains("audio")
- || attachment.get_string_member("type").contains("video"))
- {
- mediaString = mediaString + attachment.get_string_member("href") + ",";
- }
+ enclosures.add(
+ new Enclosure(id, attachment.get_string_member("href"),
+ EnclosureType.from_string(attachment.get_string_member("type")))
+ );
}
}
- var Article = new article(
+ var Article = new Article(
id,
title,
url,
feedID,
- (unread) ? ArticleStatus.UNREAD : ArticleStatus.READ,
+ unread ? ArticleStatus.UNREAD : ArticleStatus.READ,
marked,
content,
//summaryContent,
- "",
+ null,
author,
date, // timestamp includes msecs so divide by 1000 to get rid of them
-1,
- tagString,
- mediaString
+ tags,
+ enclosures
);
articles.add(Article);
}
@@ -433,13 +438,18 @@ public class FeedReader.FeedlyAPI : Object {
/** Returns the number of unread articles for an ID (may be a feed, subscription, category or tag */
public void getUnreadCounts()
{
- string response = m_connection.send_get_request_to_feedly ("/v3/markers/counts");
+ var response = m_connection.send_get_request_to_feedly ("/v3/markers/counts");
+
+ if(response.status != 200)
+ return;
var parser = new Json.Parser ();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getUnreadCounts: Could not load message response");
Logger.error(e.message);
}
@@ -453,13 +463,14 @@ public class FeedReader.FeedlyAPI : Object {
{
int unread_count = -1;
- for (int i = 0; i < m_unreadcounts.get_length (); i++) {
+ for(int i = 0; i < m_unreadcounts.get_length (); i++)
+ {
var unread = m_unreadcounts.get_object_element(i);
+ string unread_id = unread.get_string_member("id");
- string unread_id = unread.get_string_member ("id");
-
- if (id == unread_id) {
- unread_count = (int)unread.get_int_member ("count");
+ if(id == unread_id)
+ {
+ unread_count = (int)unread.get_int_member("count");
break;
}
}
@@ -492,7 +503,6 @@ public class FeedReader.FeedlyAPI : Object {
Json.Array ids = new Json.Array();
foreach(string id in id_array)
{
- //ids.add_string_element(GLib.Uri.escape_string(id));
ids.add_string_element(id);
}
@@ -572,7 +582,7 @@ public class FeedReader.FeedlyAPI : Object {
}
- public void addSubscription(string feedURL, string? title = null, string? catIDs = null)
+ public bool addSubscription(string feedURL, string? title = null, string? catIDs = null)
{
Json.Object object = new Json.Object();
object.set_string_member("id", "feed/" + feedURL);
@@ -589,7 +599,7 @@ public class FeedReader.FeedlyAPI : Object {
foreach(string catID in catArray)
{
- string catName = dbDaemon.get_default().getCategoryName(catID);
+ string catName = m_db.getCategoryName(catID);
Json.Object catObject = new Json.Object();
catObject.set_string_member("id", catID);
catObject.set_string_member("label", catName);
@@ -602,12 +612,14 @@ public class FeedReader.FeedlyAPI : Object {
var root = new Json.Node(Json.NodeType.OBJECT);
root.set_object(object);
- m_connection.send_post_request_to_feedly("/v3/subscriptions", root);
+ var response = m_connection.send_post_request_to_feedly("/v3/subscriptions", root);
+
+ return response.status == 200;
}
public void moveSubscription(string feedID, string newCatID, string? oldCatID = null)
{
- var Feed = dbDaemon.get_default().read_feed(feedID);
+ var Feed = m_db.read_feed(feedID);
Json.Object object = new Json.Object();
object.set_string_member("id", feedID);
@@ -621,7 +633,7 @@ public class FeedReader.FeedlyAPI : Object {
{
if(catID != oldCatID)
{
- string catName = dbDaemon.get_default().getCategoryName(catID);
+ string catName = m_db.getCategoryName(catID);
Json.Object catObject = new Json.Object();
catObject.set_string_member("id", catID);
catObject.set_string_member("label", catName);
@@ -629,7 +641,7 @@ public class FeedReader.FeedlyAPI : Object {
}
}
- string newCatName = dbDaemon.get_default().getCategoryName(newCatID);
+ string newCatName = m_db.getCategoryName(newCatID);
Json.Object catObject = new Json.Object();
catObject.set_string_member("id", newCatID);
catObject.set_string_member("label", newCatName);
diff --git a/plugins/backend/feedly/feedlyConnection.vala b/plugins/backend/feedly/feedlyConnection.vala
index d800e7e6..7f0123a5 100644
--- a/plugins/backend/feedly/feedlyConnection.vala
+++ b/plugins/backend/feedly/feedlyConnection.vala
@@ -17,17 +17,18 @@ public class FeedReader.FeedlyConnection {
private FeedlyUtils m_utils;
private GLib.Settings m_settingsTweaks;
+ private Soup.Session m_session;
- public FeedlyConnection()
+ public FeedlyConnection(FeedlyUtils utils)
{
- m_utils = new FeedlyUtils();
+ m_utils = utils;
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
m_settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
}
public LoginResponse getToken()
{
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", FeedlySecret.base_uri+"/v3/auth/token");
string message_string = "code=" + m_utils.getApiCode()
+ "&client_id=" + FeedlySecret.apiClientId
@@ -37,7 +38,10 @@ public class FeedReader.FeedlyConnection {
+ "&state=getting_token";
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ return LoginResponse.NO_CONNECTION;
try
{
@@ -79,8 +83,6 @@ public class FeedReader.FeedlyConnection {
public LoginResponse refreshToken()
{
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", FeedlySecret.base_uri+"/v3/auth/token");
if(m_settingsTweaks.get_boolean("do-not-track"))
@@ -92,7 +94,10 @@ public class FeedReader.FeedlyConnection {
+ "&grant_type=refresh_token";
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ return LoginResponse.NO_CONNECTION;
try
{
@@ -132,18 +137,16 @@ public class FeedReader.FeedlyConnection {
}
- public string send_get_request_to_feedly(string path)
+ public Response send_get_request_to_feedly(string path)
{
return send_request(path, "GET");
}
- public string send_put_request_to_feedly(string path, Json.Node root)
+ public Response send_put_request_to_feedly(string path, Json.Node root)
{
if(!m_utils.accessTokenValid())
refreshToken();
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("PUT", FeedlySecret.base_uri+path);
if(m_settingsTweaks.get_boolean("do-not-track"))
@@ -157,18 +160,24 @@ public class FeedReader.FeedlyConnection {
string json;
json = gen.to_data(out length);
message.request_body.append_take(json.data);
- session.send_message(message);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning(@"FeedlyConnection: message unexpected response");
+ }
- return (string)message.response_body.flatten().data;
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
}
- public string send_post_request_to_feedly(string path, Json.Node root)
+ public Response send_post_request_to_feedly(string path, Json.Node root)
{
if(!m_utils.accessTokenValid())
refreshToken();
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", FeedlySecret.base_uri+path);
if(m_settingsTweaks.get_boolean("do-not-track"))
@@ -183,18 +192,25 @@ public class FeedReader.FeedlyConnection {
json = gen.to_data(out length);
Logger.debug(json);
message.request_body.append_take(json.data);
- session.send_message(message);
- Logger.debug("Status Code: " + message.status_code.to_string());
- return (string)message.response_body.flatten().data;
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning(@"FeedlyConnection: message unexpected response");
+ Logger.debug("Status Code: " + message.status_code.to_string());
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
}
- public string send_post_string_request_to_feedly(string path, string input, string type)
+ public Response send_post_string_request_to_feedly(string path, string input, string type)
{
if(!m_utils.accessTokenValid())
refreshToken();
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", FeedlySecret.base_uri+path);
if(m_settingsTweaks.get_boolean("do-not-track"))
@@ -204,30 +220,45 @@ public class FeedReader.FeedlyConnection {
message.request_headers.append("Content-Type", type);
message.request_body.append_take(input.data);
- session.send_message(message);
+ m_session.send_message(message);
- return (string)message.response_body.flatten().data;
- }
+ if(message.status_code != 200)
+ {
+ Logger.warning(@"FeedlyConnection: message unexpected response - $input");
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
+ }
- public string send_delete_request_to_feedly(string path)
+ public Response send_delete_request_to_feedly(string path)
{
return send_request (path, "DELETE");
}
- private string send_request(string path, string type)
+ private Response send_request(string path, string type)
{
if(!m_utils.accessTokenValid())
refreshToken();
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message(type, FeedlySecret.base_uri+path);
message.request_headers.append("Authorization","OAuth %s".printf(m_utils.getAccessToken()));
if(m_settingsTweaks.get_boolean("do-not-track"))
message.request_headers.append("DNT", "1");
- session.send_message(message);
- return (string)message.response_body.data;
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning(@"FeedlyConnection: message unexpected response");
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
}
}
diff --git a/plugins/backend/feedly/feedlyInterface.vala b/plugins/backend/feedly/feedlyInterface.vala
index 99b3f6c4..10f9e83e 100644
--- a/plugins/backend/feedly/feedlyInterface.vala
+++ b/plugins/backend/feedly/feedlyInterface.vala
@@ -17,11 +17,87 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
private FeedlyAPI m_api;
private FeedlyUtils m_utils;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new FeedlyAPI();
- m_utils = new FeedlyUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new FeedlyUtils(settings_backend);
+ m_api = new FeedlyAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "http://feedly.com/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID_PREMIUM);
+ }
+
+ public string getID()
+ {
+ return "feedly";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-feedly";
+ }
+
+ public string serviceName()
+ {
+ return "feedly";
+ }
+
+ public bool needWebLogin()
+ {
+ return true;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ return null;
+ }
+
+ public void showHtAccess()
+ {
+ return;
+ }
+
+ public void writeData()
+ {
+ return;
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ if(redirectURL.has_prefix(FeedlySecret.apiRedirectUri))
+ {
+ int start = redirectURL.index_of("=")+1;
+ int end = redirectURL.index_of("&");
+ string code = redirectURL.substring(start, end-start);
+ m_utils.setApiCode(code);
+ Logger.debug("feedlyLoginWidget: set feedly-api-code: " + code);
+ GLib.Thread.usleep(500000);
+ return true;
+ }
+
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return FeedlySecret.base_uri + "/v3/auth/auth" + "?client_secret=" + FeedlySecret.apiClientSecret + "&client_id=" + FeedlySecret.apiClientId
+ + "&redirect_uri=" + FeedlySecret.apiRedirectUri + "&scope=" + FeedlySecret.apiAuthScope + "&response_type=code&state=getting_code";
}
public bool supportTags()
@@ -54,7 +130,7 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
return "";
}
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
return catID.has_suffix("global.must");
}
@@ -79,15 +155,20 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
return true;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
return false;
}
public void resetAccount()
- {
- m_utils.resetAccount();
- }
+ {
+ m_utils.resetAccount();
+ }
public bool useMaxArticles()
{
@@ -126,7 +207,7 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
m_api.mark_as_read(feedID, "feeds", ArticleStatus.READ);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
m_api.mark_as_read(catID, "categories", ArticleStatus.READ);
}
@@ -136,17 +217,17 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
string catArray = "";
string feedArray = "";
- var categories = dbDaemon.get_default().read_categories();
- var feeds = dbDaemon.get_default().read_feeds_without_cat();
+ var categories = m_db.read_categories();
+ var feeds = m_db.read_feeds_without_cat();
- foreach(category cat in categories)
+ foreach(Category cat in categories)
{
catArray += cat.getCatID() + ",";
}
- foreach(feed Feed in feeds)
+ foreach(Feed feed in feeds)
{
- feedArray += Feed.getFeedID() + ",";
+ feedArray += feed.getFeedID() + ",";
}
m_api.mark_as_read(catArray.substring(0, catArray.length-1), "categories", ArticleStatus.READ);
@@ -183,24 +264,31 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
return Utils.ping("http://feedly.com/");
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
+ feedID = "feed/" + feedURL;
+ bool success = false;
+ errmsg = "";
+
if(catID == null && newCatName != null)
{
string newCatID = m_api.createCatID(newCatName);
- m_api.addSubscription(feedURL, null, newCatID);
+ success = m_api.addSubscription(feedURL, null, newCatID);
}
else
{
- m_api.addSubscription(feedURL, null, catID);
+ success = m_api.addSubscription(feedURL, null, catID);
}
- return "feed/" + feedURL;
+ if(!success)
+ errmsg = @"feedly could not add $feedURL";
+
+ return success;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
- foreach(feed f in feeds)
+ foreach(Feed f in feeds)
{
m_api.addSubscription(f.getXmlUrl(), null, f.getCatIDs()[0]);
}
@@ -213,7 +301,7 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
public void renameFeed(string feedID, string title)
{
- var feed = dbDaemon.get_default().read_feed(feedID);
+ var feed = m_db.read_feed(feedID);
m_api.addSubscription(feed.getFeedID(), title, feed.getCatString());
}
@@ -244,7 +332,7 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
public void removeCatFromFeed(string feedID, string catID)
{
- var feed = dbDaemon.get_default().read_feed(feedID);
+ var feed = m_db.read_feed(feedID);
m_api.addSubscription(feed.getFeedID(), feed.getTitle(), feed.getCatString().replace(catID + ",", ""));
}
@@ -253,14 +341,24 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
m_api.importOPML(opml);
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
m_api.getUnreadCounts();
- if(m_api.getCategories(categories)
- && m_api.getFeeds(feeds)
- && m_api.getTags(tags))
- return true;
+ if(m_api.getCategories(categories))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getTags(tags))
+ return true;
+ }
+ }
return false;
}
@@ -270,9 +368,9 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
return m_api.getTotalUnread();
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
- string continuation = "";
+ string continuation = null;
string feedly_tagID = "";
string feedly_feedID = "";
if(feedID != null)
@@ -289,10 +387,13 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
int skip = count;
int amount = 200;
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
while(skip > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(skip >= amount)
{
skip -= amount;
@@ -305,7 +406,7 @@ public class FeedReader.feedlyInterface : Peas.ExtensionBase, FeedServerInterfac
continuation = m_api.getArticles(articles, amount, continuation, whatToGet, feedly_tagID, feedly_feedID);
- if(continuation == "")
+ if(continuation == null)
break;
}
diff --git a/plugins/backend/feedly/feedlyLoginWidget.vala b/plugins/backend/feedly/feedlyLoginWidget.vala
deleted file mode 100644
index 6f001bab..00000000
--- a/plugins/backend/feedly/feedlyLoginWidget.vala
+++ /dev/null
@@ -1,108 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.feedlyLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- private FeedlyUtils m_utils;
- public Logger m_logger { get; construct set; }
-
- public void init()
- {
- logger = m_logger;
- m_utils = new FeedlyUtils();
- }
-
- public string getWebsite()
- {
- return "http://feedly.com/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID_PREMIUM);
- }
-
- public string getID()
- {
- return "feedly";
- }
-
- public string iconName()
- {
- return "feed-service-feedly";
- }
-
- public string serviceName()
- {
- return "feedly";
- }
-
- public bool needWebLogin()
- {
- return true;
- }
-
- public Gtk.Box? getWidget()
- {
- return null;
- }
-
- public void showHtAccess()
- {
- return;
- }
-
- public void writeData()
- {
- return;
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public bool extractCode(string redirectURL)
- {
- if(redirectURL.has_prefix(FeedlySecret.apiRedirectUri))
- {
- Logger.debug(redirectURL);
- int start = redirectURL.index_of("=")+1;
- int end = redirectURL.index_of("&");
- string code = redirectURL.substring(start, end-start);
- m_utils.setApiCode(code);
- Logger.debug("feedlyLoginWidget: set feedly-api-code: " + code);
- GLib.Thread.usleep(500000);
- return true;
- }
-
- return false;
- }
-
- public string buildLoginURL()
- {
- return FeedlySecret.base_uri + "/v3/auth/auth" + "?client_secret=" + FeedlySecret.apiClientSecret + "&client_id=" + FeedlySecret.apiClientId
- + "&redirect_uri=" + FeedlySecret.apiRedirectUri + "&scope=" + FeedlySecret.apiAuthScope + "&response_type=code&state=getting_code";
- }
-}
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.feedlyLoginWidget));
-}
diff --git a/plugins/backend/feedly/feedlyUI.plugin b/plugins/backend/feedly/feedlyUI.plugin
deleted file mode 100644
index f77b5453..00000000
--- a/plugins/backend/feedly/feedlyUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=feedlyUI
-Loader=C
-Name=feedly
-Description=Add feedly backend to FeedReader
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/feedly/feedlyUtils.vala b/plugins/backend/feedly/feedlyUtils.vala
index 5962c620..651c5004 100644
--- a/plugins/backend/feedly/feedlyUtils.vala
+++ b/plugins/backend/feedly/feedlyUtils.vala
@@ -25,49 +25,52 @@ public class FeedReader.FeedlyUtils : Object {
private GLib.Settings m_settings;
- public FeedlyUtils()
+ public FeedlyUtils(GLib.SettingsBackend? settings_backend)
{
- m_settings = new GLib.Settings("org.gnome.feedreader.feedly");
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.feedly", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.feedly");
}
public string getRefreshToken()
{
- return m_settings.get_string("refresh-token");
+ return Utils.gsettingReadString(m_settings, "refresh-token");
}
public void setRefreshToken(string token)
{
- m_settings.set_string("refresh-token", token);
+ Utils.gsettingWriteString(m_settings, "refresh-token", token);
}
public string getAccessToken()
{
- return m_settings.get_string("access-token");
+ return Utils.gsettingReadString(m_settings, "access-token");
}
public void setAccessToken(string token)
{
- m_settings.set_string("access-token", token);
+ Utils.gsettingWriteString(m_settings, "access-token", token);
}
public string getApiCode()
{
- return m_settings.get_string("api-code");
+ return Utils.gsettingReadString(m_settings, "api-code");
}
public void setApiCode(string code)
{
- m_settings.set_string("api-code", code);
+ Utils.gsettingWriteString(m_settings, "api-code", code);
}
public string getEmail()
{
- return m_settings.get_string("email");
+ return Utils.gsettingReadString(m_settings, "email");
}
public void setEmail(string email)
{
- m_settings.set_string("email", email);
+ Utils.gsettingWriteString(m_settings, "email", email);
}
public int getExpiration()
@@ -97,54 +100,4 @@ public class FeedReader.FeedlyUtils : Object {
return true;
}
-
- public bool downloadIcon(string feed_id, string icon_url)
- {
- if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
- return false;
-
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e)
- {
- Logger.debug(e.message);
- }
- }
- string local_filename = icon_path + feed_id.replace("/", "_").replace(".", "_") + ".ico";
-
- if(!FileUtils.test (local_filename, GLib.FileTest.EXISTS))
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message ("GET", icon_url);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
- {
- try{
- FileUtils.set_contents(local_filename, (string)message_dlIcon.response_body.flatten().data, (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- return true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(feed_id));
- return false;
- }
- // file already exists
- return true;
- }
}
diff --git a/plugins/backend/feedly/meson.build b/plugins/backend/feedly/meson.build
new file mode 100644
index 00000000..c56f4856
--- /dev/null
+++ b/plugins/backend/feedly/meson.build
@@ -0,0 +1,49 @@
+feedly_resources = gnome.compile_resources(
+ 'feedly_res',
+ 'feedly.gresource.xml'
+)
+
+shared_library(
+ 'feedly',
+ [
+ 'feedlyAPI.vala',
+ 'feedlyInterface.vala',
+ 'feedlyUtils.vala',
+ 'feedlyConnection.vala'
+ ],
+ feedly_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.feedly.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'feedly.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/feedly/org.gnome.feedreader.feedly.gschema.xml b/plugins/backend/feedly/org.gnome.feedreader.feedly.gschema.xml
index 28791f77..bfeb448d 100644
--- a/plugins/backend/feedly/org.gnome.feedreader.feedly.gschema.xml
+++ b/plugins/backend/feedly/org.gnome.feedreader.feedly.gschema.xml
@@ -1,5 +1,5 @@
<schemalist>
- <schema id="org.gnome.feedreader.feedly" path="/org/gnome/feedreader/feedly/" gettext-domain="feedreader">
+ <schema id="org.gnome.feedreader.feedly" path="/org/gnome/feedreader/feedly/" gettext-domain="feedreader">
<key name="access-token" type="s">
<default>""</default>
<summary>Acces key to Feedly-API</summary>
@@ -24,14 +24,14 @@
</description>
</key>
- <key name="email" type="s">
+ <key name="email" type="s">
<default>""</default>
<summary>user-email</summary>
<description>
Email address of the current user.
</description>
</key>
-
+
<key name="access-token-expires" type="i">
<default>0</default>
</key>
diff --git a/plugins/backend/fresh/CMakeLists.txt b/plugins/backend/fresh/CMakeLists.txt
deleted file mode 100644
index 0ca55116..00000000
--- a/plugins/backend/fresh/CMakeLists.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-set (NAME fresh)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- freshInterface.vala
- freshAPI.vala
- freshConnection.vala
- freshUtils.vala
-
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- freshLoginWidget.vala
- freshUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
-
diff --git a/plugins/backend/fresh/fresh.plugin b/plugins/backend/fresh/fresh.plugin
index d3b68112..6b5c598c 100644
--- a/plugins/backend/fresh/fresh.plugin
+++ b/plugins/backend/fresh/fresh.plugin
@@ -2,6 +2,7 @@
Module=fresh
Loader=C
Name=freshRSS
+Version=0.1
Description=Add freshRSS backend to FeedReader
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/fresh/freshAPI.vala b/plugins/backend/fresh/freshAPI.vala
index 6b48c8fd..2921e1ec 100644
--- a/plugins/backend/fresh/freshAPI.vala
+++ b/plugins/backend/fresh/freshAPI.vala
@@ -17,11 +17,13 @@ public class FeedReader.freshAPI : Object {
private freshConnection m_connection;
private freshUtils m_utils;
+ private DataBaseReadOnly m_db;
- public freshAPI()
+ public freshAPI(freshUtils utils, DataBaseReadOnly db)
{
- m_connection = new freshConnection();
- m_utils = new freshUtils();
+ m_db = db;
+ m_utils = utils;
+ m_connection = new freshConnection(m_utils);
}
public LoginResponse login()
@@ -34,17 +36,17 @@ public class FeedReader.freshAPI : Object {
return m_connection.getSID();
}
- public bool getSubscriptionList(Gee.LinkedList<feed> feeds)
+ public bool getSubscriptionList(Gee.List<Feed> feeds)
{
- string response = m_connection.getRequest("reader/api/0/subscription/list?output=json");
+ var response = m_connection.getRequest("reader/api/0/subscription/list?output=json");
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e)
{
@@ -63,36 +65,14 @@ public class FeedReader.freshAPI : Object {
string catID = object.get_array_member("categories").get_object_element(0).get_string_member("id");
string xmlURL = object.get_string_member("url");
- string title = "No Title";
- if(object.has_member("title"))
- {
- title = object.get_string_member("title");
- }
- else
- {
- title = Utils.URLtoFeedName(url);
- }
-
- string icon_url = "";
- if(object.has_member("iconUrl"))
- {
- icon_url = object.get_string_member("iconUrl");
- }
- if(icon_url != "" && !m_utils.downloadIcon(id, icon_url))
- {
- icon_url = "";
- }
-
- bool hasIcon = (icon_url == "") ? false : true;
-
feeds.add(
- new feed(
+ new Feed(
id,
- title,
+ object.get_string_member("title"),
url,
- hasIcon,
0,
- { catID },
+ ListUtils.single(catID),
+ object.get_string_member("iconUrl"),
xmlURL)
);
}
@@ -100,18 +80,18 @@ public class FeedReader.freshAPI : Object {
return true;
}
- public bool getTagList(Gee.LinkedList<category> categories)
+ public bool getTagList(Gee.List<Category> categories)
{
- string response = m_connection.getRequest("reader/api/0/tag/list?output=json");
+ var response = m_connection.getRequest("reader/api/0/tag/list?output=json");
string prefix = "user/-/label/";
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e)
{
@@ -131,7 +111,7 @@ public class FeedReader.freshAPI : Object {
continue;
categories.add(
- new category (
+ new Category (
categorieID,
categorieID.substring(prefix.length),
0,
@@ -147,13 +127,17 @@ public class FeedReader.freshAPI : Object {
public int getUnreadCounts()
{
+ var response = m_connection.getRequest("reader/api/0/unread-count?output=json");
+
+ if(response.status != 200)
+ return 0;
+
int count = 0;
- string response = m_connection.getRequest("reader/api/0/unread-count?output=json");
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e)
{
@@ -175,7 +159,7 @@ public class FeedReader.freshAPI : Object {
}
public string? getStreamContents(
- Gee.LinkedList<article> articles,
+ Gee.List<Article> articles,
string? feedID = null,
string? labelID = null,
string? exclude = null,
@@ -208,12 +192,15 @@ public class FeedReader.freshAPI : Object {
Logger.debug("getStreamContents: %s".printf(msg.get()));
- string response = m_connection.getRequest(path + "?" + msg.get());
+ var response = m_connection.getRequest(path + "?" + msg.get());
+
+ if(response.status != 200)
+ return null;
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch(Error e)
{
@@ -243,7 +230,7 @@ public class FeedReader.freshAPI : Object {
read = true;
}
- string mediaString = "";
+ var enclosures = new Gee.ArrayList<Enclosure>();
if(object.has_member("enclosure"))
{
var attachments = object.get_array_member("enclosure");
@@ -255,25 +242,16 @@ public class FeedReader.freshAPI : Object {
for(int j = 0; j < mediaCount; ++j)
{
var attachment = attachments.get_object_element(j);
- if(attachment.has_member("type"))
- {
- if(attachment.get_string_member("type").contains("audio")
- || attachment.get_string_member("type").contains("video"))
- {
- mediaString = mediaString + attachment.get_string_member("href") + ",";
- }
- }
- }
- }
+ string type = attachment.has_member("type") ? attachment.get_string_member("type") : "";
- string? author = null;
- if(object.has_member("author"))
- {
- author = (object.get_string_member("author") == "") ? null : object.get_string_member("author");
+ enclosures.add(
+ new Enclosure(id, attachment.get_string_member("href"),
+ EnclosureType.from_string(type))
+ );
+ }
}
-
- articles.add(new article(
+ articles.add(new Article(
id,
object.get_string_member("title"),
object.get_array_member("alternate").get_object_element(0).get_string_member("href"),
@@ -281,12 +259,12 @@ public class FeedReader.freshAPI : Object {
read ? ArticleStatus.READ : ArticleStatus.UNREAD,
marked ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
object.get_object_member("summary").get_string_member("content"),
- "",
- author,
+ null,
+ object.get_string_member("author"),
new DateTime.from_unix_local(object.get_int_member("published")),
-1,
- "",
- mediaString
+ null,
+ enclosures
)
);
}
@@ -317,10 +295,13 @@ public class FeedReader.freshAPI : Object {
msg.add("r", "-/" + id);
}
- string response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
+ var response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
- Logger.debug(path + " " + msg.get());
- Logger.debug(response);
+ if(response.status != 200)
+ {
+ Logger.debug(path + " " + msg.get());
+ Logger.debug(response.status.to_string());
+ }
}
public void markAllAsRead(string streamID)
@@ -330,15 +311,18 @@ public class FeedReader.freshAPI : Object {
var msg = new freshMessage();
msg.add("T", m_connection.getToken());
msg.add("s", streamID);
- msg.add("ts", dbDaemon.get_default().getNewestArticle());
+ msg.add("ts", m_db.getNewestArticle());
- string response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
+ var response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
- Logger.debug(path + " " + msg.get());
- Logger.debug(response);
+ if(response.status != 200)
+ {
+ Logger.debug(path + " " + msg.get());
+ Logger.debug(response.status.to_string());
+ }
}
- public string editStream(
+ public Response editStream(
string action,
string[]? streamID = null,
string? title = null,
@@ -367,10 +351,14 @@ public class FeedReader.freshAPI : Object {
if(remove != null)
msg.add("r", remove);
- string response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
+ var response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
+
+ if(response.status != 200)
+ {
+ Logger.debug(path + " " + msg.get());
+ Logger.debug(response.status.to_string());
+ }
- Logger.debug(path + " " + msg.get());
- Logger.debug(response);
return response;
}
@@ -388,10 +376,14 @@ public class FeedReader.freshAPI : Object {
msg.add("s", tagID);
msg.add("dest", composeTagID(title));
- string response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
+ var response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
- Logger.debug(path + " " + msg.get());
- Logger.debug(response);
+
+ if(response.status != 200)
+ {
+ Logger.debug(path + " " + msg.get());
+ Logger.debug(response.status.to_string());
+ }
}
public void deleteTag(string tagID)
@@ -402,10 +394,13 @@ public class FeedReader.freshAPI : Object {
msg.add("T", m_connection.getToken());
msg.add("s", tagID);
- string response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
+ var response = m_connection.postRequest(path, msg.get(), "application/x-www-form-urlencoded");
- Logger.debug(path + " " + msg.get());
- Logger.debug(response);
+ if(response.status != 200)
+ {
+ Logger.debug(path + " " + msg.get());
+ Logger.debug(response.status.to_string());
+ }
}
}
diff --git a/plugins/backend/fresh/freshConnection.vala b/plugins/backend/fresh/freshConnection.vala
index 851bb917..a6b4ff1a 100644
--- a/plugins/backend/fresh/freshConnection.vala
+++ b/plugins/backend/fresh/freshConnection.vala
@@ -17,17 +17,28 @@ public class FeedReader.freshConnection {
private freshUtils m_utils;
private GLib.Settings m_settingsTweaks;
+ private Soup.Session m_session;
- public freshConnection()
+ public freshConnection(freshUtils utils)
{
- m_utils = new freshUtils();
+ m_utils = utils;
m_settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ m_session.authenticate.connect((msg, auth, retrying) => {
+ if(m_utils.getHtaccessUser() == "")
+ {
+ Logger.error("fresh Session: need Authentication");
+ }
+ else if(!retrying)
+ {
+ auth.authenticate(m_utils.getHtaccessUser(), m_utils.getHtaccessPasswd());
+ }
+ });
}
public LoginResponse getSID()
{
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", m_utils.getURL()+"accounts/ClientLogin");
var msg = new freshMessage();
@@ -35,10 +46,9 @@ public class FeedReader.freshConnection {
msg.add("Passwd", m_utils.getPasswd());
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, msg.get().data);
- session.send_message(message);
+ m_session.send_message(message);
- if((string)message.response_body.flatten().data == null
- || (string)message.response_body.flatten().data == "")
+ if(message.status_code != 200)
{
Logger.error("No response from freshRSS to message getSID()");
return LoginResponse.NO_CONNECTION;
@@ -66,13 +76,11 @@ public class FeedReader.freshConnection {
public string getToken()
{
- return getRequest("reader/api/0/token").replace("\n", "");
+ return getRequest("reader/api/0/token").data.replace("\n", "");
}
- public string postRequest(string path, string input, string type)
+ public Response postRequest(string path, string input, string type)
{
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", m_utils.getURL()+path);
if(m_settingsTweaks.get_boolean("do-not-track"))
@@ -82,23 +90,38 @@ public class FeedReader.freshConnection {
message.request_headers.append("Content-Type", type);
message.request_body.append_take(input.data);
- session.send_message(message);
+ m_session.send_message(message);
- return (string)message.response_body.flatten().data;
- }
+ if(message.status_code != 200)
+ {
+ Logger.warning("freshConnection: message unexpected response %u".printf(message.status_code));
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
+ }
- public string getRequest(string path)
+ public Response getRequest(string path)
{
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("GET", m_utils.getURL()+path);
message.request_headers.append("Authorization","GoogleLogin auth=%s".printf(m_utils.getToken()));
if(m_settingsTweaks.get_boolean("do-not-track"))
message.request_headers.append("DNT", "1");
- session.send_message(message);
- return (string)message.response_body.data;
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning("freshConnection: message unexpected response %u".printf(message.status_code));
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
}
}
@@ -119,7 +142,7 @@ public class FeedReader.freshMessage {
request += parameter;
request += "=";
- request += GLib.Uri.escape_string(val);
+ request += GLib.Uri.escape_string(val, "/");
}
public string get()
diff --git a/plugins/backend/fresh/freshInterface.vala b/plugins/backend/fresh/freshInterface.vala
index 75ba1671..9631f859 100644
--- a/plugins/backend/fresh/freshInterface.vala
+++ b/plugins/backend/fresh/freshInterface.vala
@@ -17,11 +17,189 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
private freshAPI m_api;
private freshUtils m_utils;
+ private Gtk.Entry m_urlEntry;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private Gtk.Entry m_authPasswordEntry;
+ private Gtk.Entry m_authUserEntry;
+ private Gtk.Revealer m_revealer;
+ private bool m_need_htaccess = false;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new freshAPI();
- m_utils = new freshUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new freshUtils(settings_backend, secrets);
+ m_api = new freshAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "https://freshrss.org/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.SELF_HOSTED | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
+ }
+
+ public string getID()
+ {
+ return "fresh";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-fresh";
+ }
+
+ public string serviceName()
+ {
+ return "freshRSS";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var url_label = new Gtk.Label(_("freshRSS URL:"));
+ var user_label = new Gtk.Label(_("Username:"));
+ var password_label = new Gtk.Label(_("Password:"));
+
+ url_label.set_alignment(1.0f, 0.5f);
+ user_label.set_alignment(1.0f, 0.5f);
+ password_label.set_alignment(1.0f, 0.5f);
+
+ url_label.set_hexpand(true);
+ user_label.set_hexpand(true);
+ password_label.set_hexpand(true);
+
+ m_urlEntry = new Gtk.Entry();
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+
+ m_urlEntry.activate.connect(() => { tryLogin(); });
+ m_userEntry.activate.connect(() => { tryLogin(); });
+ m_passwordEntry.activate.connect(() => { tryLogin(); });
+
+ m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ grid.attach(url_label, 0, 0, 1, 1);
+ grid.attach(m_urlEntry, 1, 0, 1, 1);
+ grid.attach(user_label, 0, 1, 1, 1);
+ grid.attach(m_userEntry, 1, 1, 1, 1);
+ grid.attach(password_label, 0, 2, 1, 1);
+ grid.attach(m_passwordEntry, 1, 2, 1, 1);
+
+
+ // http auth stuff ----------------------------------------------------
+ var auth_user_label = new Gtk.Label(_("Username:"));
+ var auth_password_label = new Gtk.Label(_("Password:"));
+
+ auth_user_label.set_alignment(1.0f, 0.5f);
+ auth_password_label.set_alignment(1.0f, 0.5f);
+
+ auth_user_label.set_hexpand(true);
+ auth_password_label.set_hexpand(true);
+
+ m_authUserEntry = new Gtk.Entry();
+ m_authPasswordEntry = new Gtk.Entry();
+ m_authPasswordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_authPasswordEntry.set_visibility(false);
+
+ m_authUserEntry.activate.connect(() => { tryLogin(); });
+ m_authPasswordEntry.activate.connect(() => { tryLogin(); });
+
+ var authGrid = new Gtk.Grid();
+ authGrid.margin = 10;
+ authGrid.set_column_spacing(10);
+ authGrid.set_row_spacing(10);
+ authGrid.set_valign(Gtk.Align.CENTER);
+ authGrid.set_halign(Gtk.Align.CENTER);
+
+ authGrid.attach(auth_user_label, 0, 0, 1, 1);
+ authGrid.attach(m_authUserEntry, 1, 0, 1, 1);
+ authGrid.attach(auth_password_label, 0, 1, 1, 1);
+ authGrid.attach(m_authPasswordEntry, 1, 1, 1, 1);
+
+ var frame = new Gtk.Frame(_("HTTP Authorization"));
+ frame.set_halign(Gtk.Align.CENTER);
+ frame.add(authGrid);
+ m_revealer = new Gtk.Revealer();
+ m_revealer.add(frame);
+ //---------------------------------------------------------------------
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-fresh", Gtk.IconSize.MENU);
+
+ var loginLabel = new Gtk.Label(_("Please log in to your freshRSS server and enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => { tryLogin(); });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_start(m_revealer, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+ m_urlEntry.set_text(m_utils.getUnmodifiedURL());
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPasswd());
+
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+ m_revealer.set_reveal_child(true);
+ }
+
+ public void writeData()
+ {
+ m_utils.setURL(m_urlEntry.get_text());
+ m_utils.setUser(m_userEntry.get_text().strip());
+ m_utils.setPassword(m_passwordEntry.get_text().strip());
+ if(m_need_htaccess)
+ {
+ m_utils.setHtaccessUser(m_authUserEntry.get_text().strip());
+ m_utils.setHtAccessPassword(m_authPasswordEntry.get_text().strip());
+ }
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
}
public bool supportTags()
@@ -54,7 +232,7 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
return "1";
}
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
return false;
}
@@ -79,6 +257,11 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
return false;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
return true;
@@ -130,7 +313,7 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
m_api.markAllAsRead(feedID);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
m_api.markAllAsRead(catID);
}
@@ -165,7 +348,7 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
string? cat = null;
if(catID != null)
@@ -175,15 +358,25 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
cat = m_api.composeTagID(cat);
- return m_api.editStream("subscribe", {"feed/" + feedURL}, null, cat, null);
+ var response = m_api.editStream("subscribe", {"feed/" + feedURL}, null, cat, null);
+ if(response.status != 200)
+ {
+ feedID = "";
+ errmsg = response.data;
+ return false;
+ }
+
+ errmsg = "";
+ feedID = response.data;
+ return true;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
string cat = "";
string[] urls = {};
- foreach(feed f in feeds)
+ foreach(Feed f in feeds)
{
if(f.getCatIDs()[0] != cat)
{
@@ -244,11 +437,16 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
parser.parse();
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- if(m_api.getSubscriptionList(feeds)
- && m_api.getTagList(categories))
- return true;
+ if(m_api.getSubscriptionList(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getTagList(categories))
+ return true;
+ }
return false;
}
@@ -258,14 +456,14 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
return m_api.getUnreadCounts();
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
if(whatToGet == ArticleStatus.READ)
{
return;
}
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
string? continuation = null;
string? exclude = null;
string? labelID = null;
@@ -287,6 +485,9 @@ public class FeedReader.freshInterface : Peas.ExtensionBase, FeedServerInterface
while(left > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(left > 1000)
{
continuation = m_api.getStreamContents(articles, null, labelID, exclude, 1000, "d");
diff --git a/plugins/backend/fresh/freshLoginWidget.vala b/plugins/backend/fresh/freshLoginWidget.vala
deleted file mode 100644
index 829c6c04..00000000
--- a/plugins/backend/fresh/freshLoginWidget.vala
+++ /dev/null
@@ -1,211 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.freshLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- private Gtk.Entry m_urlEntry;
- private Gtk.Entry m_userEntry;
- private Gtk.Entry m_passwordEntry;
- private Gtk.Entry m_authPasswordEntry;
- private Gtk.Entry m_authUserEntry;
- private Gtk.Revealer m_revealer;
- private bool m_need_htaccess = false;
- private freshUtils m_utils;
-
- public Logger m_logger { get; construct set; }
-
- public void init()
- {
- logger = m_logger;
- m_utils = new freshUtils();
- }
-
- public string getWebsite()
- {
- return "https://freshrss.org/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.SELF_HOSTED | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
- }
-
- public string getID()
- {
- return "fresh";
- }
-
- public string iconName()
- {
- return "feed-service-fresh";
- }
-
- public string serviceName()
- {
- return "freshRSS";
- }
-
- public bool needWebLogin()
- {
- return false;
- }
-
- public Gtk.Box? getWidget()
- {
- var url_label = new Gtk.Label(_("freshRSS URL:"));
- var user_label = new Gtk.Label(_("Username:"));
- var password_label = new Gtk.Label(_("Password:"));
-
- url_label.set_alignment(1.0f, 0.5f);
- user_label.set_alignment(1.0f, 0.5f);
- password_label.set_alignment(1.0f, 0.5f);
-
- url_label.set_hexpand(true);
- user_label.set_hexpand(true);
- password_label.set_hexpand(true);
-
- m_urlEntry = new Gtk.Entry();
- m_userEntry = new Gtk.Entry();
- m_passwordEntry = new Gtk.Entry();
-
- m_urlEntry.activate.connect(() => { login(); });
- m_userEntry.activate.connect(() => { login(); });
- m_passwordEntry.activate.connect(() => { login(); });
-
- m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_passwordEntry.set_visibility(false);
-
- var grid = new Gtk.Grid();
- grid.set_column_spacing(10);
- grid.set_row_spacing(10);
- grid.set_valign(Gtk.Align.CENTER);
- grid.set_halign(Gtk.Align.CENTER);
-
- grid.attach(url_label, 0, 0, 1, 1);
- grid.attach(m_urlEntry, 1, 0, 1, 1);
- grid.attach(user_label, 0, 1, 1, 1);
- grid.attach(m_userEntry, 1, 1, 1, 1);
- grid.attach(password_label, 0, 2, 1, 1);
- grid.attach(m_passwordEntry, 1, 2, 1, 1);
-
-
- // http auth stuff ----------------------------------------------------
- var auth_user_label = new Gtk.Label(_("Username:"));
- var auth_password_label = new Gtk.Label(_("Password:"));
-
- auth_user_label.set_alignment(1.0f, 0.5f);
- auth_password_label.set_alignment(1.0f, 0.5f);
-
- auth_user_label.set_hexpand(true);
- auth_password_label.set_hexpand(true);
-
- m_authUserEntry = new Gtk.Entry();
- m_authPasswordEntry = new Gtk.Entry();
- m_authPasswordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_authPasswordEntry.set_visibility(false);
-
- m_authUserEntry.activate.connect(() => { login(); });
- m_authPasswordEntry.activate.connect(() => { login(); });
-
- var authGrid = new Gtk.Grid();
- authGrid.margin = 10;
- authGrid.set_column_spacing(10);
- authGrid.set_row_spacing(10);
- authGrid.set_valign(Gtk.Align.CENTER);
- authGrid.set_halign(Gtk.Align.CENTER);
-
- authGrid.attach(auth_user_label, 0, 0, 1, 1);
- authGrid.attach(m_authUserEntry, 1, 0, 1, 1);
- authGrid.attach(auth_password_label, 0, 1, 1, 1);
- authGrid.attach(m_authPasswordEntry, 1, 1, 1, 1);
-
- var frame = new Gtk.Frame(_("HTTP Authorization"));
- frame.set_halign(Gtk.Align.CENTER);
- frame.add(authGrid);
- m_revealer = new Gtk.Revealer();
- m_revealer.add(frame);
- //---------------------------------------------------------------------
-
- var logo = new Gtk.Image.from_icon_name("feed-service-fresh", Gtk.IconSize.MENU);
-
- var loginLabel = new Gtk.Label(_("Please log in to your freshRSS server and enjoy using FeedReader"));
- loginLabel.get_style_context().add_class("h2");
- loginLabel.set_justify(Gtk.Justification.CENTER);
- loginLabel.set_lines(3);
-
- var loginButton = new Gtk.Button.with_label(_("Login"));
- loginButton.halign = Gtk.Align.END;
- loginButton.set_size_request(80, 30);
- loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginButton.clicked.connect(() => { login(); });
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
- box.valign = Gtk.Align.CENTER;
- box.halign = Gtk.Align.CENTER;
- box.pack_start(loginLabel, false, false, 10);
- box.pack_start(logo, false, false, 10);
- box.pack_start(grid, true, true, 10);
- box.pack_start(m_revealer, true, true, 10);
- box.pack_end(loginButton, false, false, 20);
-
- m_urlEntry.set_text(m_utils.getUnmodifiedURL());
- m_userEntry.set_text(m_utils.getUser());
- m_passwordEntry.set_text(m_utils.getPasswd());
-
- return box;
- }
-
- public void showHtAccess()
- {
- m_revealer.set_reveal_child(true);
- }
-
- public void writeData()
- {
- m_utils.setURL(m_urlEntry.get_text());
- m_utils.setUser(m_userEntry.get_text().strip());
- m_utils.setPassword(m_passwordEntry.get_text().strip());
- if(m_need_htaccess)
- {
- m_utils.setHtaccessUser(m_authUserEntry.get_text().strip());
- m_utils.setHtAccessPassword(m_authPasswordEntry.get_text().strip());
- }
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public bool extractCode(string redirectURL)
- {
- return false;
- }
-
- public string buildLoginURL()
- {
- return "";
- }
-}
-
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.freshLoginWidget));
-}
diff --git a/plugins/backend/fresh/freshUI.plugin b/plugins/backend/fresh/freshUI.plugin
deleted file mode 100644
index a304bcb9..00000000
--- a/plugins/backend/fresh/freshUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=freshUI
-Loader=C
-Name=freshRSS
-Description=Add freshRSS backend to FeedReader
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/fresh/freshUtils.vala b/plugins/backend/fresh/freshUtils.vala
index b314aea8..343d801a 100644
--- a/plugins/backend/fresh/freshUtils.vala
+++ b/plugins/backend/fresh/freshUtils.vala
@@ -16,15 +16,42 @@
public class FeedReader.freshUtils : GLib.Object {
GLib.Settings m_settings;
+ Password m_password;
+ Password m_htaccess_password;
- public freshUtils()
+ public freshUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
{
- m_settings = new GLib.Settings("org.gnome.feedreader.fresh");
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.fresh", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.fresh");
+
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, pwSchema, "FeedReader: freshRSS login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = getURL();
+ attributes["Username"] = getUser();
+ return attributes;
+ });
+
+ var htAccessSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING,
+ "htaccess", Secret.SchemaAttributeType.BOOLEAN);
+ m_htaccess_password = new Password(secrets, htAccessSchema, "FeedReader: freshRSS htaccess Authentication", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = getURL();
+ attributes["Username"] = getHtaccessUser();
+ attributes["htaccess"] = "true";
+ return attributes;
+ });
}
public string getURL()
{
- string tmp_url = m_settings.get_string("url");
+ string tmp_url = Utils.gsettingReadString(m_settings, "url");
if(tmp_url != "")
{
if(!tmp_url.has_suffix("/"))
@@ -42,218 +69,68 @@ public class FeedReader.freshUtils : GLib.Object {
public void setURL(string url)
{
- m_settings.set_string("url", url);
+ Utils.gsettingWriteString(m_settings, "url", url);
}
public string getUser()
{
- return m_settings.get_string("username");
+ return Utils.gsettingReadString(m_settings, "username");
}
public void setToken(string token)
{
- m_settings.set_string("token", token);
+ Utils.gsettingWriteString(m_settings, "token", token);
}
public string getToken()
{
- return m_settings.get_string("token");
+ return Utils.gsettingReadString(m_settings, "token");
}
public void setUser(string user)
{
- m_settings.set_string("username", user);
+ Utils.gsettingWriteString(m_settings, "username", user);
}
public string getHtaccessUser()
{
- return m_settings.get_string("htaccess-username");
+ return Utils.gsettingReadString(m_settings, "htaccess-username");
}
public void setHtaccessUser(string ht_user)
{
- m_settings.set_string("htaccess-username", ht_user);
+ Utils.gsettingWriteString(m_settings, "htaccess-username", ht_user);
}
public string getUnmodifiedURL()
{
- return m_settings.get_string("url");
+ return Utils.gsettingReadString(m_settings, "url");
}
public string getPasswd()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
-
- string passwd = "";
-
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error(e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_password.get_password();
}
public void setPassword(string passwd)
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "FeedReader: freshRSS login", passwd, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("freshUtils: setPassword: " + e.message);
- }
+ m_password.set_password(passwd);
}
public void resetAccount()
{
Utils.resetSettings(m_settings);
- deletePassword();
- }
-
- public bool deletePassword()
- {
- bool removed = false;
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
-
- Secret.password_clearv.begin (pwSchema, attributes, null, (obj, async_res) => {
- try
- {
- removed = Secret.password_clearv.end(async_res);
- }
- catch(GLib.Error e)
- {
- Logger.error("freshUtils.deletePassword: %s".printf(e.message));
- }
- });
- return removed;
+ m_password.delete_password();
+ m_htaccess_password.delete_password();
}
public string getHtaccessPasswd()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING,
- "htaccess", Secret.SchemaAttributeType.BOOLEAN);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getHtaccessUser();
- attributes["htaccess"] = "true";
-
- string passwd = "";
-
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error("freshUtils: getHtaccessPasswd: " + e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_htaccess_password.get_password();
}
public void setHtAccessPassword(string passwd)
{
- var pwAuthSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING,
- "htaccess", Secret.SchemaAttributeType.BOOLEAN);
- var authAttributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- authAttributes["URL"] = getURL();
- authAttributes["Username"] = getHtaccessUser();
- authAttributes["htaccess"] = "true";
- try
- {
- Secret.password_storev_sync(pwAuthSchema,
- authAttributes,
- Secret.COLLECTION_DEFAULT,
- "FeedReader: freshRSS htaccess Authentication",
- passwd,
- null);
- }
- catch(GLib.Error e)
- {
- Logger.error("freshUtils: setHtAccessPassword: " + e.message);
- }
- }
-
- public bool downloadIcon(string feed_id, string icon_url)
- {
- if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
- return false;
-
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e){
- Logger.debug(e.message);
- }
- }
- string local_filename = icon_path + feed_id.replace("/", "_").replace(".", "_") + ".ico";
-
- if(!FileUtils.test (local_filename, GLib.FileTest.EXISTS))
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message ("GET", icon_url);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session ();
- session.user_agent = Constants.USER_AGENT;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
- {
- try{
- FileUtils.set_contents(local_filename, (string)message_dlIcon.response_body.flatten().data, (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- return true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(feed_id));
- return false;
- }
- // file already exists
- return true;
+ m_htaccess_password.set_password(passwd);
}
}
diff --git a/plugins/backend/fresh/meson.build b/plugins/backend/fresh/meson.build
new file mode 100644
index 00000000..a4090ba7
--- /dev/null
+++ b/plugins/backend/fresh/meson.build
@@ -0,0 +1,49 @@
+fresh_resources = gnome.compile_resources(
+ 'fresh_res',
+ 'fresh.gresource.xml'
+)
+
+shared_library(
+ 'fresh',
+ [
+ 'freshAPI.vala',
+ 'freshInterface.vala',
+ 'freshUtils.vala',
+ 'freshConnection.vala'
+ ],
+ fresh_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.fresh.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'fresh.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/fresh/org.gnome.feedreader.fresh.gschema.xml b/plugins/backend/fresh/org.gnome.feedreader.fresh.gschema.xml
index cb4ff737..2e7653a4 100644
--- a/plugins/backend/fresh/org.gnome.feedreader.fresh.gschema.xml
+++ b/plugins/backend/fresh/org.gnome.feedreader.fresh.gschema.xml
@@ -1,5 +1,5 @@
<schemalist>
- <schema id="org.gnome.feedreader.fresh" path="/org/gnome/feedreader/fresh/" gettext-domain="feedreader">
+ <schema id="org.gnome.feedreader.fresh" path="/org/gnome/feedreader/fresh/" gettext-domain="feedreader">
<key name="url" type="s">
<default>""</default>
<summary>Link to your fresh instance</summary>
@@ -15,7 +15,7 @@
access token for freshRSS
</description>
</key>
-
+
<key name="username" type="s">
<default>""</default>
<summary>Username for freshRSS</summary>
@@ -23,7 +23,7 @@
Username for freshRSS
</description>
</key>
-
+
<key name="htaccess-username" type="s">
<default>""</default>
<summary>Username to grant http access</summary>
diff --git a/plugins/backend/inoreader/CMakeLists.txt b/plugins/backend/inoreader/CMakeLists.txt
deleted file mode 100644
index ff2d8efc..00000000
--- a/plugins/backend/inoreader/CMakeLists.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-set (NAME inoreader)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- InoReaderAPI.vala
- InoReaderInterface.vala
- InoReaderUtils.vala
- InoReaderConnection.vala
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C2 ${UITARGET}
- InoReaderLoginWidget.vala
- InoReaderUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- json-glib-1.0
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
-
diff --git a/plugins/backend/inoreader/InoReaderAPI.vala b/plugins/backend/inoreader/InoReaderAPI.vala
index 0ebba3d1..f5e8bf56 100644
--- a/plugins/backend/inoreader/InoReaderAPI.vala
+++ b/plugins/backend/inoreader/InoReaderAPI.vala
@@ -24,11 +24,13 @@ public class FeedReader.InoReaderAPI : GLib.Object {
private InoReaderConnection m_connection;
private InoReaderUtils m_utils;
private string m_userID;
+ private DataBaseReadOnly m_db;
- public InoReaderAPI ()
+ public InoReaderAPI (InoReaderUtils utils, DataBaseReadOnly db)
{
- m_connection = new InoReaderConnection();
- m_utils = new InoReaderUtils();
+ m_db = db;
+ m_utils = utils;
+ m_connection = new InoReaderConnection(m_utils);
}
@@ -53,12 +55,18 @@ public class FeedReader.InoReaderAPI : GLib.Object {
private bool getUserID()
{
- string response = m_connection.send_request("user-info");
+ var response = m_connection.send_request("user-info");
+
+ if(response.status != 200)
+ return false;
+
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getUserID: Could not load message response");
Logger.error(e.message);
return false;
@@ -83,18 +91,20 @@ public class FeedReader.InoReaderAPI : GLib.Object {
return false;
}
- public bool getFeeds(Gee.LinkedList<feed> feeds)
+ public bool getFeeds(Gee.List<Feed> feeds)
{
- string response = m_connection.send_request("subscription/list");
+ var response = m_connection.send_request("subscription/list");
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getFeeds: Could not load message response");
Logger.error(e.message);
return false;
@@ -109,39 +119,23 @@ public class FeedReader.InoReaderAPI : GLib.Object {
string feedID = object.get_string_member("id");
string url = object.has_member("htmlUrl") ? object.get_string_member("htmlUrl") : object.get_string_member("url");
- string icon_url = object.has_member("iconUrl") ? object.get_string_member("iconUrl") : "";
-
- if(icon_url != "" && !m_utils.downloadIcon(feedID, icon_url))
- {
- icon_url = "";
- }
-
- string title = "No Title";
- if(object.has_member("title"))
- {
- title = object.get_string_member("title");
- }
- else
- {
- title = Utils.URLtoFeedName(url);
- }
uint catCount = object.get_array_member("categories").get_length();
- string[] categories = {};
+ var categories = new Gee.ArrayList<string>();
for(uint j = 0; j < catCount; ++j)
{
- categories += object.get_array_member("categories").get_object_element(j).get_string_member("id");
+ categories.add(object.get_array_member("categories").get_object_element(j).get_string_member("id"));
}
feeds.add(
- new feed (
+ new Feed(
feedID,
- title,
+ object.get_string_member("title"),
url,
- (icon_url == "") ? false : true,
0,
- categories
+ categories,
+ object.get_string_member("iconUrl")
)
);
}
@@ -149,16 +143,16 @@ public class FeedReader.InoReaderAPI : GLib.Object {
return true;
}
- public bool getCategoriesAndTags(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getCategoriesAndTags(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags)
{
- string response = m_connection.send_request("tag/list");
+ var response = m_connection.send_request("tag/list");
- if(response == "" || response == null)
+ if(response.status != 200)
return false;
var parser = new Json.Parser();
try{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e) {
Logger.error("getCategoriesAndTags: Could not load message response");
@@ -182,7 +176,7 @@ public class FeedReader.InoReaderAPI : GLib.Object {
if(m_utils.tagIsCat(id, feeds))
{
categories.add(
- new category(
+ new Category(
id,
title,
0,
@@ -195,10 +189,10 @@ public class FeedReader.InoReaderAPI : GLib.Object {
else
{
tags.add(
- new tag(
+ new Tag(
id,
title,
- dbDaemon.get_default().getTagColor()
+ m_db.getTagColor()
)
);
}
@@ -212,11 +206,14 @@ public class FeedReader.InoReaderAPI : GLib.Object {
public int getTotalUnread()
{
- string response = m_connection.send_request("unread-count");
+ var response = m_connection.send_request("unread-count");
+
+ if(response.status != 200)
+ return 0;
var parser = new Json.Parser();
try{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch (Error e) {
Logger.error("getTotalUnread: Could not load message response");
@@ -243,20 +240,25 @@ public class FeedReader.InoReaderAPI : GLib.Object {
}
- public string? updateArticles(Gee.LinkedList<string> ids, int count, string? continuation = null)
+ public string? updateArticles(Gee.List<string> ids, int count, string? continuation = null)
{
var message_string = "n=" + count.to_string();
message_string += "&xt=user/-/state/com.google/read";
if(continuation != null)
message_string += "&c=" + continuation;
- string response = m_connection.send_request("stream/items/ids", message_string);
+ var response = m_connection.send_request("stream/items/ids", message_string);
+
+ if(response.status != 200)
+ return null;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
- Logger.error("getCategoriesAndTags: Could not load message response");
+ catch(Error e)
+ {
+ Logger.error("updateArticles: Could not load message response");
Logger.error(e.message);
}
@@ -278,7 +280,7 @@ public class FeedReader.InoReaderAPI : GLib.Object {
return null;
}
- public string? getArticles(Gee.LinkedList<article> articles, int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? continuation = null, string? tagID = null, string? feed_id = null)
+ public string? getArticles(Gee.List<Article> articles, int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? continuation = null, string? tagID = null, string? feed_id = null)
{
var message_string = "n=" + count.to_string();
@@ -298,14 +300,19 @@ public class FeedReader.InoReaderAPI : GLib.Object {
api_endpoint += "/" + GLib.Uri.escape_string(feed_id);
else if(tagID != null)
api_endpoint += "/" + GLib.Uri.escape_string(tagID);
- string response = m_connection.send_request(api_endpoint, message_string);
+ var response = m_connection.send_request(api_endpoint, message_string);
+
+ if(response.status != 200)
+ return null;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
- Logger.error("getCategoriesAndTags: Could not load message response");
+ catch(Error e)
+ {
+ Logger.error("getArticles: Could not load message response");
Logger.error(e.message);
}
@@ -318,7 +325,7 @@ public class FeedReader.InoReaderAPI : GLib.Object {
Json.Object object = array.get_object_element(i);
string id = object.get_string_member("id");
id = id.substring(id.last_index_of_char('/')+1);
- string tagString = "";
+ var tags = new Gee.ArrayList<string>();
bool marked = false;
bool read = false;
var cats = object.get_array_member("categories");
@@ -331,11 +338,11 @@ public class FeedReader.InoReaderAPI : GLib.Object {
marked = true;
else if(cat.has_suffix("com.google/read"))
read = true;
- else if(cat.contains("/label/") && dbDaemon.get_default().getTagName(cat) != null)
- tagString += cat;
+ else if(cat.contains("/label/") && m_db.getTagName(cat) != null)
+ tags.add(cat);
}
- string mediaString = "";
+ var enclosures = new Gee.ArrayList<Enclosure>();
if(object.has_member("enclosure"))
{
var attachments = object.get_array_member("enclosure");
@@ -347,15 +354,14 @@ public class FeedReader.InoReaderAPI : GLib.Object {
for(int j = 0; j < mediaCount; ++j)
{
var attachment = attachments.get_object_element(j);
- if(attachment.get_string_member("type").contains("audio")
- || attachment.get_string_member("type").contains("video"))
- {
- mediaString = mediaString + attachment.get_string_member("href") + ",";
- }
+ enclosures.add(
+ new Enclosure(id, attachment.get_string_member("href"),
+ EnclosureType.from_string(attachment.get_string_member("type")))
+ );
}
}
- articles.add(new article(
+ articles.add(new Article(
id,
object.get_string_member("title"),
object.get_array_member("alternate").get_object_element(0).get_string_member("href"),
@@ -363,12 +369,12 @@ public class FeedReader.InoReaderAPI : GLib.Object {
read ? ArticleStatus.READ : ArticleStatus.UNREAD,
marked ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
object.get_object_member("summary").get_string_member("content"),
- "",
- (object.get_string_member("author") == "") ? null : object.get_string_member("author"),
+ null,
+ object.get_string_member("author"),
new DateTime.from_unix_local(object.get_int_member("published")),
-1,
- tagString,
- mediaString
+ tags,
+ enclosures
)
);
}
@@ -424,7 +430,7 @@ public class FeedReader.InoReaderAPI : GLib.Object {
m_connection.send_request("rename-tag", message_string);
}
- public void editSubscription(InoSubscriptionAction action, string[] feedID, string? title = null, string? add = null, string? remove = null)
+ public bool editSubscription(InoSubscriptionAction action, string[] feedID, string? title, string? add, string? remove)
{
var message_string = "ac=";
@@ -454,6 +460,6 @@ public class FeedReader.InoReaderAPI : GLib.Object {
message_string += "&r=" + remove;
- m_connection.send_request("subscription/edit", message_string);
+ return m_connection.send_request("subscription/edit", message_string).status == 200;
}
}
diff --git a/plugins/backend/inoreader/InoReaderConnection.vala b/plugins/backend/inoreader/InoReaderConnection.vala
index 739611c8..f0ec2349 100644
--- a/plugins/backend/inoreader/InoReaderConnection.vala
+++ b/plugins/backend/inoreader/InoReaderConnection.vala
@@ -17,20 +17,21 @@ public class FeedReader.InoReaderConnection {
private string m_api_username;
private string m_api_code;
private InoReaderUtils m_utils;
+ private Soup.Session m_session;
- public InoReaderConnection()
+ public InoReaderConnection(InoReaderUtils utils)
{
- m_utils = new InoReaderUtils();
+ m_utils = utils;
m_api_username = m_utils.getUser();
m_api_code = m_utils.getAccessToken();
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
}
public LoginResponse getToken()
{
Logger.debug("InoReaderConnection: getToken()");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", "https://www.inoreader.com/oauth2/token");
string message_string = "code=" + m_utils.getApiCode()
+ "&redirect_uri=" + InoReaderSecret.apiRedirectUri
@@ -39,7 +40,11 @@ public class FeedReader.InoReaderConnection {
+ "&scope="
+ "&grant_type=authorization_code";
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ return LoginResponse.NO_CONNECTION;
+
string response = (string)message.response_body.flatten().data;
try
@@ -76,8 +81,6 @@ public class FeedReader.InoReaderConnection {
{
Logger.debug("InoReaderConnection: refreshToken()");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", "https://www.inoreader.com/oauth2/token");
string message_string = "client_id=" + InoReaderSecret.apiClientId
+ "&client_secret=" + InoReaderSecret.apiClientSecret
@@ -85,7 +88,11 @@ public class FeedReader.InoReaderConnection {
+ "&refresh_token=" + m_utils.getRefreshToken();
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ return LoginResponse.NO_CONNECTION;
+
string response = (string)message.response_body.flatten().data;
try
@@ -121,18 +128,16 @@ public class FeedReader.InoReaderConnection {
return LoginResponse.SUCCESS;
}
- public string send_request(string path, string? message_string = null)
+ public Response send_request(string path, string? message_string = null)
{
return send_post_request(path, "POST", message_string);
}
- private string send_post_request(string path, string type, string? message_string = null)
+ private Response send_post_request(string path, string type, string? message_string = null)
{
if(!m_utils.accessTokenValid())
refreshToken();
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message(type, InoReaderSecret.base_uri + path);
string inoauth = "Bearer " + m_utils.getAccessToken();
@@ -141,8 +146,18 @@ public class FeedReader.InoReaderConnection {
if(message_string != null)
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
- return (string)message.response_body.data;
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning("InoReaderConnection: unexpected response");
+ Logger.debug(message.status_code.to_string());
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
}
}
diff --git a/plugins/backend/inoreader/InoReaderInterface.vala b/plugins/backend/inoreader/InoReaderInterface.vala
index 130a6e65..2c288e36 100644
--- a/plugins/backend/inoreader/InoReaderInterface.vala
+++ b/plugins/backend/inoreader/InoReaderInterface.vala
@@ -17,11 +17,105 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
private InoReaderAPI m_api;
private InoReaderUtils m_utils;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new InoReaderAPI();
- m_utils = new InoReaderUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new InoReaderUtils(settings_backend);
+ m_api = new InoReaderAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "http://www.inoreader.com/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID_PREMIUM);
+ }
+
+ public string getID()
+ {
+ return "inoreader";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-inoreader";
+ }
+
+ public string serviceName()
+ {
+ return "InoReader";
+ }
+
+ public void writeData()
+ {
+ return;
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ if(redirectURL.has_prefix(InoReaderSecret.apiRedirectUri))
+ {
+ Logger.debug(redirectURL);
+ int csrf_start = redirectURL.index_of("state=")+6;
+ string csrf_code = redirectURL.substring(csrf_start);
+ Logger.debug("InoReaderLoginWidget: csrf_code: " + csrf_code);
+
+ if(csrf_code == InoReaderSecret.csrf_protection)
+ {
+ int start = redirectURL.index_of("code=")+5;
+ int end = redirectURL.index_of("&", start);
+ string code = redirectURL.substring(start, end-start);
+ m_utils.setApiCode(code);
+ Logger.debug("InoReaderLoginWidget: set inoreader-api-code: " + code);
+ GLib.Thread.usleep(500000);
+ return true;
+ }
+
+ Logger.error("InoReaderLoginWidget: csrf_code mismatch");
+ }
+ else
+ {
+ Logger.warning("InoReaderLoginWidget: wrong redirect_uri");
+ }
+
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return "https://www.inoreader.com/oauth2/auth"
+ + "?client_id=" + InoReaderSecret.apiClientId
+ + "&redirect_uri=" + InoReaderSecret.apiRedirectUri
+ + "&response_type=code"
+ + "&scope=read+write"
+ + "&state=" + InoReaderSecret.csrf_protection;
+ }
+
+ public bool needWebLogin()
+ {
+ return true;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ return null;
+ }
+
+ public void showHtAccess()
+ {
+ return;
}
public bool supportTags()
@@ -54,7 +148,7 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
return "";
}
- public bool hideCagetoryWhenEmtpy(string cadID)
+ public bool hideCategoryWhenEmpty(string cadID)
{
return false;
}
@@ -79,15 +173,20 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
return true;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
return true;
}
public void resetAccount()
- {
- m_utils.resetAccount();
- }
+ {
+ m_utils.resetAccount();
+ }
public bool useMaxArticles()
{
@@ -125,23 +224,23 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
m_api.markAsRead(feedID);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
m_api.markAsRead(catID);
}
public void markAllItemsRead()
{
- var categories = dbDaemon.get_default().read_categories();
- foreach(category cat in categories)
+ var categories = m_db.read_categories();
+ foreach(Category cat in categories)
{
m_api.markAsRead(cat.getCatID());
}
- var feeds = dbDaemon.get_default().read_feeds_without_cat();
- foreach(feed Feed in feeds)
+ var feeds = m_db.read_feeds_without_cat();
+ foreach(Feed feed in feeds)
{
- m_api.markAsRead(Feed.getFeedID());
+ m_api.markAsRead(feed.getFeedID());
}
m_api.markAsRead();
}
@@ -176,30 +275,38 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
return m_api.ping();
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
+ bool success = false;
+ feedID = "feed/" + feedURL;
+ errmsg = "";
+
if(catID == null && newCatName != null)
{
string newCatID = m_api.composeTagID(newCatName);
- m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, newCatID);
+ success = m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, newCatID, null);
}
else
{
- m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, catID);
+ success = m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, catID, null);
}
- return "feed/" + feedURL;
+
+ if(!success)
+ errmsg = "Inoreader could not add %s";
+
+ return success;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
string cat = "";
string[] urls = {};
- foreach(feed f in feeds)
+ foreach(Feed f in feeds)
{
if(f.getCatIDs()[0] != cat)
{
- m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, urls, null, cat);
+ m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, urls, null, cat, null);
urls = {};
cat = f.getCatIDs()[0];
}
@@ -207,17 +314,17 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
urls += "feed/" + f.getXmlUrl();
}
- m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, urls, null, cat);
+ m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.SUBSCRIBE, urls, null, cat, null);
}
public void removeFeed(string feedID)
{
- m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.UNSUBSCRIBE, {feedID});
+ m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.UNSUBSCRIBE, {feedID}, null, null, null);
}
public void renameFeed(string feedID, string title)
{
- m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.EDIT, {feedID}, title);
+ m_api.editSubscription(InoReaderAPI.InoSubscriptionAction.EDIT, {feedID}, title, null, null);
}
public void moveFeed(string feedID, string newCatID, string? currentCatID)
@@ -256,11 +363,16 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
parser.parse();
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- if(m_api.getFeeds(feeds)
- && m_api.getCategoriesAndTags(feeds, categories, tags))
- return true;
+ if(m_api.getFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getCategoriesAndTags(feeds, categories, tags))
+ return true;
+ }
return false;
}
@@ -270,7 +382,7 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
return m_api.getTotalUnread();
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
if(whatToGet == ArticleStatus.READ)
{
@@ -284,6 +396,9 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
while(left > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(left > 1000)
{
continuation = m_api.updateArticles(unreadIDs, 1000, continuation);
@@ -295,11 +410,11 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
left = 0;
}
}
- dbDaemon.get_default().updateArticlesByID(unreadIDs, "unread");
+ m_db_write.updateArticlesByID(unreadIDs, "unread");
updateArticleList();
}
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
string? continuation = null;
int left = count;
string? inoreader_feedID = (isTagID) ? null : feedID;
@@ -307,6 +422,9 @@ public class FeedReader.InoReaderInterface : Peas.ExtensionBase, FeedServerInter
while(left > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(left > 1000)
{
continuation = m_api.getArticles(articles, 1000, whatToGet, continuation, inoreader_tagID, inoreader_feedID);
diff --git a/plugins/backend/inoreader/InoReaderLoginWidget.vala b/plugins/backend/inoreader/InoReaderLoginWidget.vala
deleted file mode 100644
index 80b3d517..00000000
--- a/plugins/backend/inoreader/InoReaderLoginWidget.vala
+++ /dev/null
@@ -1,126 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.InoReaderLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- private InoReaderUtils m_utils;
-
- public Logger m_logger { get; construct set; }
-
- public void init()
- {
- logger = m_logger;
- m_utils = new InoReaderUtils();
- }
-
- public string getWebsite()
- {
- return "http://www.inoreader.com/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID_PREMIUM);
- }
-
- public string getID()
- {
- return "inoreader";
- }
-
- public string iconName()
- {
- return "feed-service-inoreader";
- }
-
- public string serviceName()
- {
- return "InoReader";
- }
-
- public void writeData()
- {
- return;
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public bool extractCode(string redirectURL)
- {
- if(redirectURL.has_prefix(InoReaderSecret.apiRedirectUri))
- {
- Logger.debug(redirectURL);
- int csrf_start = redirectURL.index_of("state=")+6;
- string csrf_code = redirectURL.substring(csrf_start);
- Logger.debug("InoReaderLoginWidget: csrf_code: " + csrf_code);
-
- if(csrf_code == InoReaderSecret.csrf_protection)
- {
- int start = redirectURL.index_of("code=")+5;
- int end = redirectURL.index_of("&", start);
- string code = redirectURL.substring(start, end-start);
- m_utils.setApiCode(code);
- Logger.debug("InoReaderLoginWidget: set inoreader-api-code: " + code);
- GLib.Thread.usleep(500000);
- return true;
- }
-
- Logger.error("InoReaderLoginWidget: csrf_code mismatch");
- }
- else
- {
- Logger.warning("InoReaderLoginWidget: wrong redirect_uri: " + redirectURL);
- }
-
- return false;
- }
-
- public string buildLoginURL()
- {
- return "https://www.inoreader.com/oauth2/auth"
- + "?client_id=" + InoReaderSecret.apiClientId
- + "&redirect_uri=" + InoReaderSecret.apiRedirectUri
- + "&response_type=code"
- + "&scope=read+write"
- + "&state=" + InoReaderSecret.csrf_protection;
- }
-
- public bool needWebLogin()
- {
- return true;
- }
-
- public Gtk.Box? getWidget()
- {
- return null;
- }
-
- public void showHtAccess()
- {
- return;
- }
-}
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.InoReaderLoginWidget));
-}
diff --git a/plugins/backend/inoreader/InoReaderUtils.vala b/plugins/backend/inoreader/InoReaderUtils.vala
index b925f684..407ab7f1 100644
--- a/plugins/backend/inoreader/InoReaderUtils.vala
+++ b/plugins/backend/inoreader/InoReaderUtils.vala
@@ -25,49 +25,52 @@ public class FeedReader.InoReaderUtils : GLib.Object {
private GLib.Settings m_settings;
- public InoReaderUtils()
+ public InoReaderUtils(GLib.SettingsBackend? settings_backend)
{
- m_settings = new GLib.Settings("org.gnome.feedreader.inoreader");
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.inoreader", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.inoreader");
}
public string getUser()
{
- return m_settings.get_string("username");
+ return Utils.gsettingReadString(m_settings, "username");
}
public void setUser(string user)
{
- m_settings.set_string("username", user);
+ Utils.gsettingWriteString(m_settings, "username", user);
}
public string getRefreshToken()
{
- return m_settings.get_string("refresh-token");
+ return Utils.gsettingReadString(m_settings, "refresh-token");
}
public void setRefreshToken(string token)
{
- m_settings.set_string("refresh-token", token);
+ Utils.gsettingWriteString(m_settings, "refresh-token", token);
}
public string getAccessToken()
{
- return m_settings.get_string("access-token");
+ return Utils.gsettingReadString(m_settings, "access-token");
}
public void setAccessToken(string token)
{
- m_settings.set_string("access-token", token);
+ Utils.gsettingWriteString(m_settings, "access-token", token);
}
public string getApiCode()
{
- return m_settings.get_string("api-code");
+ return Utils.gsettingReadString(m_settings, "api-code");
}
public void setApiCode(string code)
{
- m_settings.set_string("api-code", code);
+ Utils.gsettingWriteString(m_settings, "api-code", code);
}
public int getExpiration()
@@ -82,22 +85,22 @@ public class FeedReader.InoReaderUtils : GLib.Object {
public string getUserID()
{
- return m_settings.get_string("user-id");
+ return Utils.gsettingReadString(m_settings, "user-id");
}
public void setUserID(string id)
{
- m_settings.set_string("user-id", id);
+ Utils.gsettingWriteString(m_settings, "user-id", id);
}
public string getEmail()
{
- return m_settings.get_string("user-email");
+ return Utils.gsettingReadString(m_settings, "user-email");
}
public void setEmail(string email)
{
- m_settings.set_string("user-email", email);
+ Utils.gsettingWriteString(m_settings, "user-email", email);
}
public void resetAccount()
@@ -118,66 +121,11 @@ public class FeedReader.InoReaderUtils : GLib.Object {
return true;
}
- public bool downloadIcon(string feed_id, string icon_url)
+ public bool tagIsCat(string tagID, Gee.List<Feed> feeds)
{
- if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
- return false;
-
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e){
- Logger.debug(e.message);
- }
- }
-
- string local_filename = icon_path + feed_id.replace("/", "_").replace(".", "_") + ".ico";
-
- if(!FileUtils.test(local_filename, GLib.FileTest.EXISTS))
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message("GET", icon_url);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.ssl_strict = false;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
- {
- try{
- FileUtils.set_contents( local_filename,
- (string)message_dlIcon.response_body.flatten().data,
- (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- return true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(feed_id));
- return false;
- }
-
- // file already exists
- return true;
- }
-
-
- public bool tagIsCat(string tagID, Gee.LinkedList<feed> feeds)
- {
- foreach(feed Feed in feeds)
+ foreach(Feed feed in feeds)
{
- if(Feed.hasCat(tagID))
+ if(feed.hasCat(tagID))
{
return true;
}
diff --git a/plugins/backend/inoreader/inoreader.plugin b/plugins/backend/inoreader/inoreader.plugin
index 9b34ec97..daefb9c1 100644
--- a/plugins/backend/inoreader/inoreader.plugin
+++ b/plugins/backend/inoreader/inoreader.plugin
@@ -2,6 +2,7 @@
Module=inoreader
Loader=C
Name=InoReader
+Version=0.1
Description=Add InoReader backend to FeedReader
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/inoreader/inoreaderUI.plugin b/plugins/backend/inoreader/inoreaderUI.plugin
deleted file mode 100644
index 4c143d25..00000000
--- a/plugins/backend/inoreader/inoreaderUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=inoreaderUI
-Loader=C
-Name=InoReader
-Description=Add InoReader backend to FeedReader
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/inoreader/meson.build b/plugins/backend/inoreader/meson.build
new file mode 100644
index 00000000..dab34ce8
--- /dev/null
+++ b/plugins/backend/inoreader/meson.build
@@ -0,0 +1,49 @@
+inoreader_resources = gnome.compile_resources(
+ 'inoreader_res',
+ 'inoreader.gresource.xml'
+)
+
+shared_library(
+ 'inoreader',
+ [
+ 'InoReaderAPI.vala',
+ 'InoReaderInterface.vala',
+ 'InoReaderUtils.vala',
+ 'InoReaderConnection.vala'
+ ],
+ inoreader_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.inoreader.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'inoreader.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/inoreader/org.gnome.feedreader.inoreader.gschema.xml b/plugins/backend/inoreader/org.gnome.feedreader.inoreader.gschema.xml
index 154c374c..4cae696e 100644
--- a/plugins/backend/inoreader/org.gnome.feedreader.inoreader.gschema.xml
+++ b/plugins/backend/inoreader/org.gnome.feedreader.inoreader.gschema.xml
@@ -6,7 +6,7 @@
<summary>apiCode</summary>
<description>Authenticated username to InoReader throught API</description>
</key>
-
+
<key name="access-token" type="s">
<default>""</default>
<summary>Acces key to InoReader-API</summary>
@@ -14,7 +14,7 @@
Acces key to InoReader-API. Will time out at some point.
</description>
</key>
-
+
<key name="access-token-expires" type="i">
<default>0</default>
</key>
@@ -26,7 +26,7 @@
Token to generate new access key to InoReader-API.
</description>
</key>
-
+
<key name="api-code" type="s">
<default>""</default>
<summary>apiCode</summary>
@@ -34,12 +34,12 @@
Code to get access token for the first time. Gets returned after logging in via google/facebook.
</description>
</key>
-
+
<key name="user-id" type="s">
<default>""</default>
<description>Interneal User ID</description>
</key>
-
+
<key name="user-email" type="s">
<default>""</default>
</key>
diff --git a/plugins/backend/local/CMakeLists.txt b/plugins/backend/local/CMakeLists.txt
deleted file mode 100644
index 3ec5a7a4..00000000
--- a/plugins/backend/local/CMakeLists.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-set (NAME local)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-find_package(GLIB REQUIRED)
-find_package(Curl REQUIRED)
-include_directories(${GLIB_INCLUDE_DIRS})
-include_directories(rss-glib)
-
-add_subdirectory(libnxml)
-add_subdirectory(libmrss)
-add_subdirectory(rss-glib)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- localInterface.vala
- localUtils.vala
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- rss-glib/rss-glib-1.0.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-target_link_libraries(${NAME} gobject-2.0 glib-2.0 curl rss-glib mrss nxml)
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- localLoginWidget.vala
- SuggestedFeedRow.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- json-glib-1.0
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
- posix
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
- rss-glib/rss-glib-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-target_link_libraries(${UINAME} gobject-2.0 glib-2.0 curl rss-glib mrss nxml)
-
-
-# ----------------------------------------------------------
-
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
-
diff --git a/plugins/backend/local/Rfc822.vala b/plugins/backend/local/Rfc822.vala
new file mode 100644
index 00000000..368c6987
--- /dev/null
+++ b/plugins/backend/local/Rfc822.vala
@@ -0,0 +1,144 @@
+namespace FeedReader.Rfc822 {
+
+ /**
+ * Parse a date string in RFC 822 format
+ * Note that we don't use Time.strptime because it uses the current locale
+ * to parse month names, but RFC 822 specifically requires months to be
+ * written in English.
+ * See: https://www.w3.org/Protocols/rfc822/#z28
+ * And: https://groups.yahoo.com/neo/groups/rss-public/conversations/topics/536
+ * */
+ public static DateTime? parseDate(string? str)
+ {
+ if (str == null)
+ return null;
+
+ Regex re;
+ try {
+ re = new Regex("""
+ # We don't care about the day of the week
+ \s*(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s*)?
+ (?<day>\d{1,2})\s+
+ (?<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
+ # The standard specifies 2-digit years but 4 digit years are
+ # recommended now.
+ # This pattern will also accept 3-digit years, so we'll have to
+ # check for that separately
+ (?<year>\d{2,4})\s+
+ (?<hour>\d{2})
+ :(?<minute>\d{2})
+ (?::(?<second>\d{2}))?\s+
+ (?<zone>UT|GMT|EST|EDT|MST|MDT|PST|PDT|[A-Z]|(?:[+-]\d{4}))
+ """,
+ RegexCompileFlags.CASELESS | RegexCompileFlags.EXTENDED,
+ RegexMatchFlags.ANCHORED);
+ } catch (RegexError e) {
+ stderr.printf("RFC822 regex failed to parse: %s\n", e.message);
+ assert(false);
+ return null;
+ }
+
+ MatchInfo info;
+ if (!re.match(str, 0, out info))
+ return null;
+
+ var dayStr = info.fetch_named("day");
+ var day = int.parse(dayStr);
+
+ var monthStr = info.fetch_named("month").ascii_down();
+ int month;
+ switch(monthStr) {
+ case "jan":
+ month = 1;
+ break;
+ case "feb":
+ month = 2;
+ break;
+ case "mar":
+ month = 3;
+ break;
+ case "apr":
+ month = 4;
+ break;
+ case "may":
+ month = 5;
+ break;
+ case "jun":
+ month = 6;
+ break;
+ case "jul":
+ month = 7;
+ break;
+ case "aug":
+ month = 8;
+ break;
+ case "sep":
+ month = 9;
+ break;
+ case "oct":
+ month = 10;
+ break;
+ case "nov":
+ month = 11;
+ break;
+ case "dec":
+ month = 12;
+ break;
+ default:
+ // The regex should make this impossible
+ assert(false);
+ return null;
+ }
+
+ var yearStr = info.fetch_named("year");
+ var year = int.parse(yearStr);
+ // Two-digit years from 00 to 49 should be interpreted as 2000 to 2049
+ if (year >= 0 && year <= 49)
+ year += 2000;
+ // Two-digit years from 50 to 99 should be interpreted as 1950 to 1999
+ else if (year >= 50 && year < 100)
+ year += 1900;
+ var hourStr = info.fetch_named("hour");
+ var hour = int.parse(hourStr);
+ var minuteStr = info.fetch_named("minute");
+ var minute = int.parse(minuteStr);
+ var secondStr = info.fetch_named("second");
+ var second = secondStr == null || secondStr == "" ? 0 : int.parse(secondStr);
+
+ var zoneStr = info.fetch_named("zone");
+ TimeZone zone;
+ switch(zoneStr.ascii_up()) {
+ // Note sure if new TimeZone(zoneStr) would always work for these,
+ // so specifically handle the cases the spec requires
+ case "EDT":
+ zone = new TimeZone("-04");
+ break;
+ case "CDT":
+ case "EST":
+ zone = new TimeZone("-05");
+ break;
+ case "CST":
+ case "MDT":
+ zone = new TimeZone("-06");
+ break;
+ case "MST":
+ case "PDT":
+ zone = new TimeZone("-07");
+ break;
+ case "PST":
+ zone = new TimeZone("-08");
+ break;
+
+ case "GMT":
+ case "UT":
+ case "Z":
+ zone = new TimeZone.utc();
+ break;
+ default:
+ zone = new TimeZone(zoneStr);
+ break;
+ }
+
+ return new DateTime(zone, year, month, day, hour, minute, second);
+ }
+}
diff --git a/plugins/backend/local/SuggestedFeedRow.vala b/plugins/backend/local/SuggestedFeedRow.vala
index c8f28fe2..882cea5f 100644
--- a/plugins/backend/local/SuggestedFeedRow.vala
+++ b/plugins/backend/local/SuggestedFeedRow.vala
@@ -21,7 +21,7 @@ public class FeedReader.SuggestedFeedRow : Gtk.ListBoxRow {
private string m_desc;
private Gtk.CheckButton m_check;
- public SuggestedFeedRow(string url, string category, string name, string desc, string lang)
+ public SuggestedFeedRow(string url, string iconURL, string category, string name, string desc, string lang)
{
m_name = name;
m_url = url;
@@ -61,104 +61,25 @@ public class FeedReader.SuggestedFeedRow : Gtk.ListBoxRow {
this.set_tooltip_text(m_desc);
show_all();
- downloadIcon.begin("/tmp/",m_url, (obj, res) => {
- bool success = downloadIcon.end(res);
- Gtk.Image? icon = null;
-
- if(success)
- {
- try
- {
- string filename = "/tmp/" + m_url.replace("/", "_").replace(".", "_") + ".ico";
- Logger.debug("load icon %s".printf(filename));
- var tmp_icon = new Gdk.Pixbuf.from_file_at_scale(filename, 24, 24, true);
- icon = new Gtk.Image.from_pixbuf(tmp_icon);
- }
- catch(GLib.Error e)
- {
- Logger.error("SuggestedFeedRow.constructor: %s".printf(e.message));
- }
- }
- else
- {
- icon = new Gtk.Image.from_icon_name("feed-rss-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
- }
-
- iconStack.add_named(icon, "icon");
- show_all();
- iconStack.set_visible_child_name("icon");
+ var uri = new Soup.URI(url);
+ var fakeFeed = new Feed(uri.get_host(), null, null, 0);
+ load_favicon.begin(iconStack, fakeFeed, iconURL, (obj, res) => {
+ load_favicon.end(res);
});
}
- private async bool downloadIcon(string path, string url)
+ private async void load_favicon(Gtk.Stack iconStack, Feed feed, string iconURL)
{
- if(url == "" || url == null || GLib.Uri.parse_scheme(url) == null)
- return false;
-
- SourceFunc callback = downloadIcon.callback;
- bool success = false;
- string filename = "/tmp/" + m_url.replace("/", "_").replace(".", "_") + ".ico";
-
- new GLib.Thread<void*>(null, () => {
-
- if(FileUtils.test(filename, GLib.FileTest.EXISTS))
- {
- success = true;
- Idle.add((owned) callback, GLib.Priority.HIGH_IDLE);
- return null;
- }
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.timeout = 5;
- var msg = new Soup.Message("GET", m_url.escape(""));
- session.send_message(msg);
- string xml = (string)msg.response_body.flatten().data;
-
- Rss.Parser parser = new Rss.Parser();
- try
- {
- parser.load_from_data(xml, xml.length);
- }
- catch(GLib.Error e)
- {
- Logger.error("SuggestedFeedRow.downloadIcon: %s".printf(e.message));
- }
- var doc = parser.get_document();
-
- if(doc.image_url != ""
- && doc.image_url != null
- && GLib.Uri.parse_scheme(doc.image_url) != null)
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message("GET", doc.image_url);
- var status = session.send_message(message_dlIcon);
- if(status == 200)
- {
- try{
- FileUtils.set_contents( filename,
- (string)message_dlIcon.response_body.flatten().data,
- (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- success = true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(m_url));
- }
- else
- {
- if(Utils.downloadIcon(url, url, path))
- success = true;
- }
- Idle.add((owned) callback, GLib.Priority.HIGH_IDLE);
- return null;
- });
- yield;
-
- return success;
+ Gtk.Image? icon = null;
+ var surface = yield FavIcon.for_feed(feed).get_surface();
+ if(surface != null)
+ icon = new Gtk.Image.from_surface(surface);
+ else
+ icon = new Gtk.Image.from_icon_name("feed-rss-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
+
+ iconStack.add_named(icon, "icon");
+ show_all();
+ iconStack.set_visible_child_name("icon");
}
public bool checked()
diff --git a/plugins/backend/local/TestLocalRSS.vala b/plugins/backend/local/TestLocalRSS.vala
new file mode 100644
index 00000000..9430972c
--- /dev/null
+++ b/plugins/backend/local/TestLocalRSS.vala
@@ -0,0 +1,109 @@
+using FeedReader;
+
+void main(string[] args)
+{
+ Test.init(ref args);
+
+ Test.add_data_func ("/Rfc822/parseDate/Basic", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 2006 23:59:45 +0000");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/LowerCase", () => {
+ var date = Rfc822.parseDate("thu, 09 feb 2006 16:59:45 mst");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/UpperCase", () => {
+ var date = Rfc822.parseDate("THU, 09 FEB 2006 16:59:45 MST");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/LotsOfWhiteSpace", () => {
+ var date = Rfc822.parseDate(" \t\n Thu, \t\n 09 \t\n Feb \t\n 2006 \t\n 23:59:45 \t\n +0000 \t\n");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/TwoDigitYear2000", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 00 23:59:45 +0000");
+ assert(new DateTime.utc(2000, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/TwoDigitYear2006", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 06 23:59:45 +0000");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/TwoDigitYear2049", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 49 23:59:45 +0000");
+ assert(new DateTime.utc(2049, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/TwoDigitYear1950", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 50 23:59:45 +0000");
+ assert(new DateTime.utc(1950, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/TwoDigitYear1956", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 56 23:59:45 +0000");
+ assert(new DateTime.utc(1956, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/TwoDigitYear1999", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 99 23:59:45 +0000");
+ assert(new DateTime.utc(1999, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ // Just in case we get RSS feeds made by Romans
+ Test.add_data_func ("/Rfc822/parseDate/ThreeDigitYear", () => {
+ var date = Rfc822.parseDate("Thu, 09 Feb 156 23:59:45 +0000");
+ assert(new DateTime.utc(156, 2, 9, 23, 59, 45).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/OnlyRequired", () => {
+ var date = Rfc822.parseDate("09 Feb 2006 23:59 +0000");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 0).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/OneDigitDay", () => {
+ var date = Rfc822.parseDate("9 Feb 2006 23:59 +0000");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 0).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/UnsupportedZone", () => {
+ var date = Rfc822.parseDate("09 Feb 2006 23:59 X");
+ assert(new DateTime.utc(2006, 2, 9, 23, 59, 0).equal(date));
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/MissingDay", () => {
+ var date = Rfc822.parseDate("Feb 2006 23:59 +0000");
+ assert(date == null);
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/MissingMonth", () => {
+ var date = Rfc822.parseDate("09 2006 23:59 +0000");
+ assert(date == null);
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/MissingYear", () => {
+ var date = Rfc822.parseDate("09 Feb 23:59 +0000");
+ assert(date == null);
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/MissingHour", () => {
+ var date = Rfc822.parseDate("09 Feb 2006 59 +0000");
+ assert(date == null);
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/MissingMinute", () => {
+ var date = Rfc822.parseDate("09 Feb 2006 23 +0000");
+ assert(date == null);
+ });
+
+ Test.add_data_func ("/Rfc822/parseDate/MissingZone", () => {
+ var date = Rfc822.parseDate("09 Feb 2006 23:59");
+ assert(date == null);
+ });
+
+ Test.run ();
+}
diff --git a/plugins/backend/local/libmrss/CMakeLists.txt b/plugins/backend/local/libmrss/CMakeLists.txt
deleted file mode 100644
index 3eb99684..00000000
--- a/plugins/backend/local/libmrss/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
-include_directories(../libnxml)
-
-add_library(mrss STATIC
- mrss.h
- mrss_download.c
- mrss_edit.c
- mrss_free.c
- mrss_generic.c
- mrss_internal.h
- mrss_options.c
- mrss_parser.c
- mrss_search.c
- mrss_write.c)
diff --git a/plugins/backend/local/libmrss/meson.build b/plugins/backend/local/libmrss/meson.build
new file mode 100644
index 00000000..595dab82
--- /dev/null
+++ b/plugins/backend/local/libmrss/meson.build
@@ -0,0 +1,16 @@
+mrss_inc = include_directories(['.', '../libnxml'])
+mrss_lib = static_library(
+ 'mrss',
+ [
+ 'mrss_download.c',
+ 'mrss_edit.c',
+ 'mrss_free.c',
+ 'mrss_generic.c',
+ 'mrss_options.c',
+ 'mrss_parser.c',
+ 'mrss_search.c',
+ 'mrss_write.c'
+ ],
+ c_args: ['-Wno-comment', '-Wno-pointer-to-int-cast'],
+ include_directories: mrss_inc
+)
diff --git a/plugins/backend/local/libmrss/mrss_parser.c b/plugins/backend/local/libmrss/mrss_parser.c
index 9a49c8dd..200cd8dd 100644
--- a/plugins/backend/local/libmrss/mrss_parser.c
+++ b/plugins/backend/local/libmrss/mrss_parser.c
@@ -1,16 +1,16 @@
-/* mRss - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* mRss - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -235,6 +235,7 @@ __mrss_parser_atom_string (nxml_t * doc, nxml_data_t * cur, char **what,
*what = total;
*type = c;
+ free(c1);
return;
}
@@ -360,9 +361,17 @@ __mrss_parser_atom_entry (nxml_t * doc, nxml_data_t * cur, mrss_t * data)
item->link = c;
/* content -> description */
- else if (!item->description && !strcmp (cur->value, "content"))
+ /* Note: We intentionally override summary with content */
+ else if (!strcmp (cur->value, "content"))
+ {
+ if (item->description)
+ {
+ free(item->description);
+ item->description = NULL;
+ }
__mrss_parser_atom_string (doc, cur, &item->description,
&item->description_type);
+ }
/* summary -> description */
else if (!item->description && !strcmp (cur->value, "summary"))
@@ -634,6 +643,17 @@ __mrss_parser_rss_item (nxml_t * doc, nxml_data_t * cur, mrss_t * data)
&& (c = nxmle_get_string (cur, NULL)))
item->link = c;
+ /* content:encoded
+ * FIXME: We are ignoring the namespace.
+ /* Note: We intentionally override description with content:encoded */
+ else if (!strcmp (cur->value, "encoded")
+ && (c = nxmle_get_string (cur, NULL)))
+ {
+ if (item->description)
+ free(item->description);
+ item->description = c;
+ }
+
/* description */
else if (!strcmp (cur->value, "description") && !item->description
&& (c = nxmle_get_string (cur, NULL)))
diff --git a/plugins/backend/local/libnxml/CMakeLists.txt b/plugins/backend/local/libnxml/CMakeLists.txt
deleted file mode 100644
index da8057d9..00000000
--- a/plugins/backend/local/libnxml/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
-
-add_library(nxml STATIC
- nxml.h
- nxml_download.c
- nxml_easy.c
- nxml_edit.c
- nxml_error.c
- nxml_free.c
- nxml_init.c
- nxml_internal.h
- nxml_namespace.c
- nxml_parser.c
- nxml_string.c
- nxml_tools.c
- nxml_utf.c
- nxml_write.c)
diff --git a/plugins/backend/local/libnxml/meson.build b/plugins/backend/local/libnxml/meson.build
new file mode 100644
index 00000000..1eaa8ed8
--- /dev/null
+++ b/plugins/backend/local/libnxml/meson.build
@@ -0,0 +1,19 @@
+nxml_inc = include_directories('.')
+nxml_lib = static_library(
+ 'nxml',
+ [
+ 'nxml_download.c',
+ 'nxml_easy.c',
+ 'nxml_edit.c',
+ 'nxml_error.c',
+ 'nxml_free.c',
+ 'nxml_init.c',
+ 'nxml_namespace.c',
+ 'nxml_parser.c',
+ 'nxml_string.c',
+ 'nxml_tools.c',
+ 'nxml_utf.c',
+ 'nxml_write.c'
+ ],
+ include_directories: nxml_inc
+)
diff --git a/plugins/backend/local/libnxml/nxml.h b/plugins/backend/local/libnxml/nxml.h
index a4461e62..0406038b 100644
--- a/plugins/backend/local/libnxml/nxml.h
+++ b/plugins/backend/local/libnxml/nxml.h
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -29,11 +29,11 @@
#include <string.h>
#include <errno.h>
-#define LIBNXML_VERSION_STRING "0.18.3"
+#define LIBNXML_VERSION_STRING "0.18.3"
-#define LIBNXML_MAJOR_VERSION 0
-#define LIBNXML_MINOR_VERSION 18
-#define LIBNXML_MICRO_VERSION 3
+#define LIBNXML_MAJOR_VERSION 0
+#define LIBNXML_MINOR_VERSION 18
+#define LIBNXML_MICRO_VERSION 3
typedef struct nxml_t nxml_t;
typedef struct nxml_data_t nxml_data_t;
@@ -45,46 +45,42 @@ typedef struct __nxml_private_t __nxml_private_t;
typedef struct __nxml_entity_t __nxml_entity_t;
/** This enum describes the error type of libnxml */
-typedef enum
-{
- NXML_OK = 0, /**< No error */
- NXML_ERR_POSIX, /**< For the correct error, use errno */
- NXML_ERR_PARSER, /**< Parser error */
- NXML_ERR_DOWNLOAD, /**< Download error */
- NXML_ERR_DATA /**< The parameters are incorrect */
+typedef enum {
+ NXML_OK = 0, /**< No error */
+ NXML_ERR_POSIX, /**< For the correct error, use errno */
+ NXML_ERR_PARSER, /**< Parser error */
+ NXML_ERR_DOWNLOAD, /**< Download error */
+ NXML_ERR_DATA /**< The parameters are incorrect */
} nxml_error_t;
/** This enum describes the type of data element of libnxml */
-typedef enum
-{
- NXML_TYPE_TEXT, /**< Text element */
- NXML_TYPE_COMMENT, /**< Comment element */
- NXML_TYPE_ELEMENT, /**< Data element */
- NXML_TYPE_PI, /**< PI element */
- NXML_TYPE_ELEMENT_CLOSE /**< Data element - For internal use only */
+typedef enum {
+ NXML_TYPE_TEXT, /**< Text element */
+ NXML_TYPE_COMMENT, /**< Comment element */
+ NXML_TYPE_ELEMENT, /**< Data element */
+ NXML_TYPE_PI, /**< PI element */
+ NXML_TYPE_ELEMENT_CLOSE /**< Data element - For internal use only */
} nxml_type_t;
/** This enum describes the supported XML version */
-typedef enum
-{
- NXML_VERSION_1_1, /**< XML 1.1 */
- NXML_VERSION_1_0 /**< XML 1.0 */
+typedef enum {
+ NXML_VERSION_1_1, /**< XML 1.1 */
+ NXML_VERSION_1_0 /**< XML 1.0 */
} nxml_version_t;
/** This enum describes the CharSet of XML document */
-typedef enum
-{
- NXML_CHARSET_UTF8, /**< UTF8 chatset detected */
- NXML_CHARSET_UTF16LE, /**< UTF 16 Little Endian detected */
- NXML_CHARSET_UTF16BE, /**< UTF 16 Big Endian detected */
- NXML_CHARSET_UCS4_1234, /**< UCS 4byte order 1234 detected */
- NXML_CHARSET_UCS4_4321, /**< UCS 3byte order 4321 detected */
- NXML_CHARSET_UCS4_2143, /**< UCS 3byte order 2143 detected */
- NXML_CHARSET_UCS4_3412, /**< UCS 3byte order 3412 detected */
- NXML_CHARSET_UNKNOWN /**< Unknown format */
+typedef enum {
+ NXML_CHARSET_UTF8, /**< UTF8 chatset detected */
+ NXML_CHARSET_UTF16LE, /**< UTF 16 Little Endian detected */
+ NXML_CHARSET_UTF16BE, /**< UTF 16 Big Endian detected */
+ NXML_CHARSET_UCS4_1234, /**< UCS 4byte order 1234 detected */
+ NXML_CHARSET_UCS4_4321, /**< UCS 3byte order 4321 detected */
+ NXML_CHARSET_UCS4_2143, /**< UCS 3byte order 2143 detected */
+ NXML_CHARSET_UCS4_3412, /**< UCS 3byte order 3412 detected */
+ NXML_CHARSET_UNKNOWN /**< Unknown format */
} nxml_charset_t;
-/**
+/**
* Data struct for any element of XML stream/files
*
* \brief
@@ -92,41 +88,41 @@ typedef enum
*/
struct nxml_data_t
{
- nxml_type_t type; /**< type of this nxml_data_t struct */
+ nxml_type_t type; /**< type of this nxml_data_t struct */
- char *value; /**< The value of this data struct */
+ char *value; /**< The value of this data struct */
- nxml_attr_t *attributes; /**< List of attributes of this struct.
- This list exists only if
+ nxml_attr_t *attributes; /**< List of attributes of this struct.
+ This list exists only if
type == NXML_TYPE_ELEMENT */
- nxml_namespace_t *ns; /**< Pointer to the correct namespace */
- nxml_namespace_t *ns_list; /**< The namespaces in this element */
+ nxml_namespace_t *ns; /**< Pointer to the correct namespace */
+ nxml_namespace_t *ns_list; /**< The namespaces in this element */
- nxml_data_t *children; /**< The children of this data struct */
- nxml_data_t *next; /**< The next element */
+ nxml_data_t *children; /**< The children of this data struct */
+ nxml_data_t *next; /**< The next element */
- nxml_data_t *parent; /**< The parent */
- nxml_t *doc; /**< The nxml_t */
+ nxml_data_t *parent; /**< The parent */
+ nxml_t *doc; /**< The nxml_t */
};
-/**
- * Data struct for any element of attribute of xml element
+/**
+ * Data struct for any element of attribute of xml element
*
* \brief
* Data struct for any element of attribute of xml element
*/
struct nxml_attr_t
{
- char *name;
- char *value;
+ char *name;
+ char *value;
- nxml_namespace_t *ns;
+ nxml_namespace_t *ns;
- nxml_attr_t *next;
+ nxml_attr_t *next;
};
-/**
+/**
* Data struct for doctype elements
*
* \brief
@@ -134,14 +130,14 @@ struct nxml_attr_t
*/
struct nxml_doctype_t
{
- char *value; /**< The string no parsers */
- char *name; /**< The name of current doctype */
+ char *value; /**< The string no parsers */
+ char *name; /**< The name of current doctype */
- nxml_t *doc; /**< The nxml_t */
- nxml_doctype_t *next;
+ nxml_t *doc; /**< The nxml_t */
+ nxml_doctype_t *next;
};
-/**
+/**
* Data struct for namespace
*
* \brief
@@ -149,9 +145,9 @@ struct nxml_doctype_t
*/
struct nxml_namespace_t
{
- char *prefix;
- char *ns;
- nxml_namespace_t *next;
+ char *prefix;
+ char *ns;
+ nxml_namespace_t *next;
};
/** Data struct private about entities for internal use only
@@ -161,10 +157,10 @@ struct nxml_namespace_t
*/
struct __nxml_entity_t
{
- char *name;
- char *entity;
+ char *name;
+ char *entity;
- __nxml_entity_t *next;
+ __nxml_entity_t *next;
};
/** Data struct private for internal use only
@@ -174,49 +170,49 @@ struct __nxml_entity_t
*/
struct __nxml_private_t
{
- void (*func) (char *, ...);
- int line;
- int timeout;
- char *proxy;
- char *proxy_authentication;
- char *cacert;
- char *certfile;
- char *password;
- int verifypeer;
- char *authentication;
- char *user_agent;
- char textindent;
-
- CURLcode curl_error;
-
- __nxml_entity_t *entities;
+ void (*func)(char *, ...);
+ int line;
+ int timeout;
+ char *proxy;
+ char *proxy_authentication;
+ char *cacert;
+ char *certfile;
+ char *password;
+ int verifypeer;
+ char *authentication;
+ char *user_agent;
+ char textindent;
+
+ CURLcode curl_error;
+
+ __nxml_entity_t *entities;
};
-/**
+/**
* Principal data struct. It describes a XML document and it contains pointers
* to any other structures.
*
- * \brief
+ * \brief
* Principal data struct. It describes a XML document and it contains pointers
* to any other structures */
struct nxml_t
{
- char *file; /**< XML document filename or url */
- size_t size; /**< Size of XML document in byte */
+ char *file; /**< XML document filename or url */
+ size_t size; /**< Size of XML document in byte */
- nxml_version_t version; /**< XML document version */
- int standalone; /**< This document is standalone ? */
- char *encoding; /**< Encoding type */
+ nxml_version_t version; /**< XML document version */
+ int standalone; /**< This document is standalone ? */
+ char *encoding; /**< Encoding type */
- nxml_charset_t charset_detected; /**< charset detected when the a
+ nxml_charset_t charset_detected; /**< charset detected when the a
XML document is parsed. The document
will be convert to UTF-8 */
- nxml_data_t *data; /**< The data of XML document */
- nxml_doctype_t *doctype; /**< The doctype of XML document */
+ nxml_data_t *data; /**< The data of XML document */
+ nxml_doctype_t *doctype; /**< The doctype of XML document */
- __nxml_private_t priv; /**< For internal use only */
+ __nxml_private_t priv; /**< For internal use only */
};
/* INIT FUNCTIONS ************************************************************/
@@ -227,10 +223,10 @@ struct nxml_t
* \param nxml Pointer to a nxml_t data struct. It will be allocated.
* \return the error code
*/
-nxml_error_t nxml_new (nxml_t ** nxml);
+nxml_error_t nxml_new(nxml_t **nxml);
-/**
- * This function creates a new nxml_data_t child of a parent in the data
+/**
+ * This function creates a new nxml_data_t child of a parent in the data
* struct. If parent is NULL the child will be created in the root level
* of XML document.
*
@@ -250,15 +246,15 @@ nxml_error_t nxml_new (nxml_t ** nxml);
* nxml_add(nxml, NULL, &data2);
* \endcode
*/
-nxml_error_t nxml_add (nxml_t * nxml,
- nxml_data_t *parent,
- nxml_data_t **child);
+nxml_error_t nxml_add(nxml_t *nxml,
+ nxml_data_t *parent,
+ nxml_data_t **child);
-/**
- * This function removes a nxml_data_t child from a parent in the data
+/**
+ * This function removes a nxml_data_t child from a parent in the data
* struct. If parent is NULL the child will be removed in the root level of
* XML document. This function doesn't free the child. If you want you can
- * reinsert the child in another parent tree or use the nxml_free_data
+ * reinsert the child in another parent tree or use the nxml_free_data
* function.
*
* \param nxml Pointer to a nxml_t data struct.
@@ -267,12 +263,12 @@ nxml_error_t nxml_add (nxml_t * nxml,
* \param child It is the pointer to the child that you want remove
* \return the error code
*/
-nxml_error_t nxml_remove (nxml_t * nxml,
- nxml_data_t *parent,
- nxml_data_t *child);
+nxml_error_t nxml_remove(nxml_t *nxml,
+ nxml_data_t *parent,
+ nxml_data_t *child);
-/**
- * This function creates a new nxml_attr_t data of a element in the data
+/**
+ * This function creates a new nxml_attr_t data of a element in the data
* struct.
*
* \param nxml Pointer to a nxml_t data struct.
@@ -281,9 +277,9 @@ nxml_error_t nxml_remove (nxml_t * nxml,
* be allocated, else no.
* \return the error code
*/
-nxml_error_t nxml_add_attribute (nxml_t *nxml,
- nxml_data_t *element,
- nxml_attr_t **attribute);
+nxml_error_t nxml_add_attribute(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_attr_t **attribute);
/**
* This function removes a nxml_attr_t data of a element. It does not free it
@@ -294,9 +290,9 @@ nxml_error_t nxml_add_attribute (nxml_t *nxml,
* \param attribute The attribute that you want remove.
* \return the error code
*/
-nxml_error_t nxml_remove_attribute (nxml_t *nxml,
- nxml_data_t *element,
- nxml_attr_t *attribute);
+nxml_error_t nxml_remove_attribute(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_attr_t *attribute);
/**
* This function adds a nxml_namespace_t data in a nxml document.
@@ -306,9 +302,9 @@ nxml_error_t nxml_remove_attribute (nxml_t *nxml,
* \param ns The namespace that you want add
* \return the error code
*/
-nxml_error_t nxml_add_namespace (nxml_t *nxml,
- nxml_data_t *element,
- nxml_namespace_t **ns);
+nxml_error_t nxml_add_namespace(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_namespace_t **ns);
/**
* This function removes a nxml_namespace_t data from a nxml document.
@@ -318,9 +314,9 @@ nxml_error_t nxml_add_namespace (nxml_t *nxml,
* \param ns The namespace that you want remove
* \return the error code
*/
-nxml_error_t nxml_remove_namespace (nxml_t *nxml,
- nxml_data_t *element,
- nxml_namespace_t *ns);
+nxml_error_t nxml_remove_namespace(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_namespace_t *ns);
/**
* This function sets the output function. If you set your function, the
@@ -333,58 +329,58 @@ nxml_error_t nxml_remove_namespace (nxml_t *nxml,
* As default a nxml_t element has not a output function.
* \return the error code
*/
-nxml_error_t nxml_set_func (nxml_t * nxml,
- void (*func) (char *, ...));
+nxml_error_t nxml_set_func(nxml_t *nxml,
+ void (*func)(char *, ...));
-void nxml_print_generic (char *, ...);
+void nxml_print_generic(char *, ...);
/**
* This function sets the timeout in seconds for the download of a remote
* XML document. Default is 0 and 0 is no timeout.
- *
+ *
* \param nxml The struct create with nxml_new.
* \param seconds the timeout in seconds
* \return the error code
*/
-nxml_error_t nxml_set_timeout (nxml_t * nxml,
- int seconds);
+nxml_error_t nxml_set_timeout(nxml_t *nxml,
+ int seconds);
/**
* This functions sets a proxy server for the downloading procedure.
- *
+ *
* \param nxml The struct create with nxml_new.
* \param proxy the proxy as a string
* \param userpwd the user and password in this format user:password
* \return the error code
*/
-nxml_error_t nxml_set_proxy (nxml_t * nxml,
- char *proxy,
- char *userpwd);
+nxml_error_t nxml_set_proxy(nxml_t *nxml,
+ char *proxy,
+ char *userpwd);
/**
* This functions sets a user/password for a for the download procedure.
- *
+ *
* \param nxml The struct create with nxml_new.
* \param userpwd the user and password in this format user:password
* \return the error code
*/
-nxml_error_t nxml_set_authentication (nxml_t * nxml,
- char *userpwd);
+nxml_error_t nxml_set_authentication(nxml_t *nxml,
+ char *userpwd);
/**
* This functions sets an user agent for a for the download procedure.
- *
+ *
* \param nxml The struct create with nxml_new.
* \param user_agent The agent
* \return the error code
*/
-nxml_error_t nxml_set_user_agent (nxml_t * nxml,
- char *user_agent);
+nxml_error_t nxml_set_user_agent(nxml_t *nxml,
+ char *user_agent);
/**
* This functions sets a certificate in the http request. You can set a
* certificate file and a password.
- *
+ *
* \param nxml The struct create with nxml_new.
* \param certfile the certfile for the ssl connection (can be NULL)
* \param password the password of your certifcate (can be NULL)
@@ -392,12 +388,11 @@ nxml_error_t nxml_set_user_agent (nxml_t * nxml,
* \param verifypeer active/deactive the peer validation
* \return the error code
*/
-nxml_error_t nxml_set_certificate (nxml_t * nxml,
- char *certfile,
- char *password,
- char *cacert,
- int verifypeer);
-
+nxml_error_t nxml_set_certificate(nxml_t *nxml,
+ char *certfile,
+ char *password,
+ char *cacert,
+ int verifypeer);
/**
* This function (de)actives the indent of the TEXT elements. Default it is
@@ -407,24 +402,24 @@ nxml_error_t nxml_set_certificate (nxml_t * nxml,
* \param textindent If it is != 0, the indent will be activated
* \return the error code
*/
-nxml_error_t nxml_set_textindent (nxml_t *nxml,
- char textindent);
+nxml_error_t nxml_set_textindent(nxml_t *nxml,
+ char textindent);
/* DOWNLOAD *****************************************************************/
/**
* This function downloads a stream from a http/https/ftp server.
- *
+ *
* \param nxml The struct create with nxml_new.
* \param url the http file
* \param buffer a string for the buffer
* \param size The function sets here the length of the file if it's not NULL.
* \return a buffer or NULL
*/
-nxml_error_t nxml_download_file (nxml_t *nxml,
- char *url,
- char ** buffer,
- size_t *size);
+nxml_error_t nxml_download_file(nxml_t *nxml,
+ char *url,
+ char **buffer,
+ size_t *size);
/* PARSER FUNCTIONS *********************************************************/
@@ -436,31 +431,31 @@ nxml_error_t nxml_download_file (nxml_t *nxml,
* \param url the url that you want parse.
* \return the error code
*/
-nxml_error_t nxml_parse_url (nxml_t * nxml,
- char *url);
+nxml_error_t nxml_parse_url(nxml_t *nxml,
+ char *url);
-/**
+/**
* This function parses a file.
*
* \param nxml the struct create with nxml_new.
* \param file the file that you want parse.
* \return the error code
*/
-nxml_error_t nxml_parse_file (nxml_t * nxml,
- char *file);
+nxml_error_t nxml_parse_file(nxml_t *nxml,
+ char *file);
-/**
+/**
* This function parses a buffer in memory.
*
* \param nxml the struct create with nxml_new.
* \param buffer the buffer that you want parse.
- * \param size the size of buffer. If size is 0, the function checks the
+ * \param size the size of buffer. If size is 0, the function checks the
* length of your buffer searching a '\\0'.
* \return the error code
*/
-nxml_error_t nxml_parse_buffer (nxml_t * nxml,
- char *buffer,
- size_t size);
+nxml_error_t nxml_parse_buffer(nxml_t *nxml,
+ char *buffer,
+ size_t size);
/* WRITE FUNCTIONS **********************************************************/
@@ -471,8 +466,8 @@ nxml_error_t nxml_parse_buffer (nxml_t * nxml,
* \param file the local file
* \return the error code
*/
-nxml_error_t nxml_write_file (nxml_t *nxml,
- char *file);
+nxml_error_t nxml_write_file(nxml_t *nxml,
+ char *file);
/**
* This function writes the data struct in a buffer.
@@ -489,8 +484,8 @@ nxml_error_t nxml_write_file (nxml_t *nxml,
* \param buffer the memory buffer
* \return the error code
*/
-nxml_error_t nxml_write_buffer (nxml_t *nxml,
- char **buffer);
+nxml_error_t nxml_write_buffer(nxml_t *nxml,
+ char **buffer);
/* FREE FUNCTIONS ************************************************************/
@@ -501,9 +496,9 @@ nxml_error_t nxml_write_buffer (nxml_t *nxml,
* \param nxml the pointer to you data struct.
* \return the error code.
*/
-nxml_error_t nxml_empty (nxml_t * nxml);
+nxml_error_t nxml_empty(nxml_t *nxml);
-/**
+/**
* This function frees the memory of a nxml_t *element. After the free,
* your data struct is not useful. If you want erase the internal data, use
* nxml_empty function
@@ -511,7 +506,7 @@ nxml_error_t nxml_empty (nxml_t * nxml);
* \param nxml the pointer to your data struct.
* \return the error code.
*/
-nxml_error_t nxml_free (nxml_t * nxml);
+nxml_error_t nxml_free(nxml_t *nxml);
/**
* This function frees the memory of a nxml_data_t *element and any its
@@ -520,7 +515,7 @@ nxml_error_t nxml_free (nxml_t * nxml);
* \param data the pointer to you data struct.
* \return the error code
*/
-nxml_error_t nxml_free_data (nxml_data_t *data);
+nxml_error_t nxml_free_data(nxml_data_t *data);
/**
* This function frees the memory of a nxml_attr_t *element.
@@ -528,7 +523,7 @@ nxml_error_t nxml_free_data (nxml_data_t *data);
* \param data the pointer to you data struct.
* \return the error code
*/
-nxml_error_t nxml_free_attribute (nxml_attr_t *data);
+nxml_error_t nxml_free_attribute(nxml_attr_t *data);
/**
* This function frees the memory of a nxml_namespace_t *element.
@@ -536,7 +531,7 @@ nxml_error_t nxml_free_attribute (nxml_attr_t *data);
* \param data the pointer to you data struct.
* \return the error code
*/
-nxml_error_t nxml_free_namespace (nxml_namespace_t *data);
+nxml_error_t nxml_free_namespace(nxml_namespace_t *data);
/* EDIT FUNCTIONS ***********************************************************/
@@ -558,8 +553,8 @@ nxml_error_t nxml_free_namespace (nxml_namespace_t *data);
* \param element the pointer to your nxml_data_t struct
* \return the error code
*/
-nxml_error_t nxml_root_element (nxml_t *nxml,
- nxml_data_t **element);
+nxml_error_t nxml_root_element(nxml_t *nxml,
+ nxml_data_t **element);
/**
* This function searchs the request element in the children of the data struct.
@@ -576,17 +571,17 @@ nxml_error_t nxml_root_element (nxml_t *nxml,
* \endcode
*
* \param nxml the data struct
- * \param parent the data struct nxml_data_t of parent. If it is NULL, this
+ * \param parent the data struct nxml_data_t of parent. If it is NULL, this
* function searchs in the root element level.
* \param name the name of the node that you want.
* \param element the pointer to your nxml_data_t struct. If element will be
* NULL, the item that you want does not exist.
* \return the error code
*/
-nxml_error_t nxml_find_element (nxml_t *nxml,
- nxml_data_t *parent,
- char *name,
- nxml_data_t **element);
+nxml_error_t nxml_find_element(nxml_t *nxml,
+ nxml_data_t *parent,
+ char *name,
+ nxml_data_t **element);
/**
* This function searchs the first doctype element in the nxml_t document.
@@ -596,8 +591,8 @@ nxml_error_t nxml_find_element (nxml_t *nxml,
* NULL, the item that you want does not exist.
* \return the error code
*/
-nxml_error_t nxml_doctype_element (nxml_t *nxml,
- nxml_doctype_t **doctype);
+nxml_error_t nxml_doctype_element(nxml_t *nxml,
+ nxml_doctype_t **doctype);
/**
* This function searchs the request attribute and returns its values.
@@ -626,9 +621,9 @@ nxml_error_t nxml_doctype_element (nxml_t *nxml,
* does not exist.
* \return the error code
*/
-nxml_error_t nxml_find_attribute (nxml_data_t *data,
- char *name,
- nxml_attr_t **attribute);
+nxml_error_t nxml_find_attribute(nxml_data_t *data,
+ char *name,
+ nxml_attr_t **attribute);
/**
* This function searchs the request namespaceibute and returns its values.
@@ -640,9 +635,9 @@ nxml_error_t nxml_find_attribute (nxml_data_t *data,
* does not exist.
* \return the error code
*/
-nxml_error_t nxml_find_namespace (nxml_data_t *data,
- char *name,
- nxml_namespace_t **ns);
+nxml_error_t nxml_find_namespace(nxml_data_t *data,
+ char *name,
+ nxml_namespace_t **ns);
/**
* This function returns the string of a XML element.
@@ -668,8 +663,8 @@ nxml_error_t nxml_find_namespace (nxml_data_t *data,
* \param string the pointer to you char *. You must free it after usage.
* \return the error code
*/
-nxml_error_t nxml_get_string (nxml_data_t *element,
- char **string);
+nxml_error_t nxml_get_string(nxml_data_t *element,
+ char **string);
/* ERROR FUNCTIONS **********************************************************/
@@ -680,8 +675,8 @@ nxml_error_t nxml_get_string (nxml_data_t *element,
* \param err the error code that you need as string
* \return a string. Don't free this string!
*/
-char * nxml_strerror (nxml_t * nxml,
- nxml_error_t err);
+char *nxml_strerror(nxml_t *nxml,
+ nxml_error_t err);
/**
* This function returns the CURLcode error if there was a problem about the
@@ -691,8 +686,8 @@ char * nxml_strerror (nxml_t * nxml,
* \param err the error code that you need as string
* \return the CURLcode
*/
-CURLcode nxml_curl_error (nxml_t * nxml,
- nxml_error_t err);
+CURLcode nxml_curl_error(nxml_t *nxml,
+ nxml_error_t err);
/**
* This function return the line of a error of parse.
@@ -701,8 +696,8 @@ CURLcode nxml_curl_error (nxml_t * nxml,
* \param line pointer to your integer. In this pointer will be set the line.
* \return the error code
*/
-nxml_error_t nxml_line_error (nxml_t * nxml,
- int *line);
+nxml_error_t nxml_line_error(nxml_t *nxml,
+ int *line);
/* EASY FUNCTIONS ***********************************************************/
@@ -714,22 +709,22 @@ nxml_error_t nxml_line_error (nxml_t * nxml,
* code. This function use nxml_set_func with nxml_print_generic so the
* error will be write in the standard output.
*/
-nxml_t * nxmle_new_data (nxml_error_t *err);
+nxml_t *nxmle_new_data(nxml_error_t *err);
/**
* This function returns a new nxml_t data and parses a remote url document
- * from http or ftp protocol. This function use nxml_set_func with
+ * from http or ftp protocol. This function use nxml_set_func with
* nxml_print_generic so the error will be write in the standard output.
*
* \param url the url that you want parse.
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_t data.
*/
-nxml_t * nxmle_new_data_from_url (char *url,
- nxml_error_t *err);
+nxml_t *nxmle_new_data_from_url(char *url,
+ nxml_error_t *err);
/**
- * This function returns a new nxml_t data and parses a local file. This
+ * This function returns a new nxml_t data and parses a local file. This
* function use nxml_set_func with nxml_print_generic so the error will be
* write in the standard output.
*
@@ -737,9 +732,8 @@ nxml_t * nxmle_new_data_from_url (char *url,
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_t data.
*/
-nxml_t * nxmle_new_data_from_file
- (char *file,
- nxml_error_t *err);
+nxml_t *nxmle_new_data_from_file(char *file,
+ nxml_error_t *err);
/**
* This function returns a new nxml_t data and parses a buffer. This
@@ -747,17 +741,16 @@ nxml_t * nxmle_new_data_from_file
* write in the standard output.
*
* \param buffer the buffer that you want parse.
- * \param size the size of buffer. If size is 0, the function checks the
+ * \param size the size of buffer. If size is 0, the function checks the
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_t data.
*/
-nxml_t * nxmle_new_data_from_buffer
- (char *buffer,
- size_t size,
- nxml_error_t *err);
+nxml_t *nxmle_new_data_from_buffer(char *buffer,
+ size_t size,
+ nxml_error_t *err);
/**
- * This function creates and adds a child nxml_data_t to a parent in your
+ * This function creates and adds a child nxml_data_t to a parent in your
* nxml data struct.
*
* \param nxml Pointer to your nxml data.
@@ -766,9 +759,9 @@ nxml_t * nxmle_new_data_from_buffer
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_data_t data child.
*/
-nxml_data_t * nxmle_add_new (nxml_t * nxml,
- nxml_data_t *parent,
- nxml_error_t *err);
+nxml_data_t *nxmle_add_new(nxml_t *nxml,
+ nxml_data_t *parent,
+ nxml_error_t *err);
/**
* This function adds a your nxml_data_t to a parent in your nxml
@@ -781,10 +774,10 @@ nxml_data_t * nxmle_add_new (nxml_t * nxml,
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_data_t data child.
*/
-nxml_data_t * nxmle_add_data (nxml_t * nxml,
- nxml_data_t *parent,
- nxml_data_t *child,
- nxml_error_t *err);
+nxml_data_t *nxmle_add_data(nxml_t *nxml,
+ nxml_data_t *parent,
+ nxml_data_t *child,
+ nxml_error_t *err);
/**
* This function creates and adds an attribute nxml_attr_t data to a
@@ -795,9 +788,9 @@ nxml_data_t * nxmle_add_data (nxml_t * nxml,
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_data_t data child.
*/
-nxml_attr_t * nxmle_add_attribute_new (nxml_t *nxml,
- nxml_data_t *element,
- nxml_error_t *err);
+nxml_attr_t *nxmle_add_attribute_new(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_error_t *err);
/**
* This function adds an attribute nxml_attr_t data to a
@@ -809,11 +802,10 @@ nxml_attr_t * nxmle_add_attribute_new (nxml_t *nxml,
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_data_t data child.
*/
-nxml_attr_t * nxmle_add_attribute_data
- (nxml_t *nxml,
- nxml_data_t *element,
- nxml_attr_t *attribute,
- nxml_error_t *err);
+nxml_attr_t *nxmle_add_attribute_data(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_attr_t *attribute,
+ nxml_error_t *err);
/**
* This function creates and adds a namespace nxml_namespace_t data to a
@@ -824,10 +816,9 @@ nxml_attr_t * nxmle_add_attribute_data
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_data_t data child.
*/
-nxml_namespace_t * nxmle_add_namespace_new
- (nxml_t *nxml,
- nxml_data_t *element,
- nxml_error_t *err);
+nxml_namespace_t *nxmle_add_namespace_new(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_error_t *err);
/**
* This function adds an namespace nxml_namespace-t data to a nxml data struct.
@@ -838,11 +829,10 @@ nxml_namespace_t * nxmle_add_namespace_new
* \param err If err is not NULL, err will be set to the error flag.
* \return the pointer to a new nxml_data_t data child.
*/
-nxml_namespace_t * nxmle_add_namespace_data
- (nxml_t *nxml,
- nxml_data_t *element,
- nxml_namespace_t *ns,
- nxml_error_t *err);
+nxml_namespace_t *nxmle_add_namespace_data(nxml_t *nxml,
+ nxml_data_t *element,
+ nxml_namespace_t *ns,
+ nxml_error_t *err);
/**
* This function returns the root element of a nxml_t.
@@ -852,8 +842,8 @@ nxml_namespace_t * nxmle_add_namespace_data
* \return the pointer to the root element. If NULL the element does not
* exist.
*/
-nxml_data_t * nxmle_root_element (nxml_t *nxml,
- nxml_error_t *err);
+nxml_data_t *nxmle_root_element(nxml_t *nxml,
+ nxml_error_t *err);
/**
* This function returns the first doctype element of a nxml_t.
@@ -863,8 +853,8 @@ nxml_data_t * nxmle_root_element (nxml_t *nxml,
* \return the pointer to the doctype element. If NULL the element does not
* exist.
*/
-nxml_doctype_t *nxmle_doctype_element (nxml_t *nxml,
- nxml_error_t *err);
+nxml_doctype_t *nxmle_doctype_element(nxml_t *nxml,
+ nxml_error_t *err);
/**
* This function returns the nxml_data_t pointer to a element by
@@ -878,10 +868,10 @@ nxml_doctype_t *nxmle_doctype_element (nxml_t *nxml,
* \return the pointer to the root element. If NULL the element does not
* exist.
*/
-nxml_data_t * nxmle_find_element (nxml_t *nxml,
- nxml_data_t *parent,
- char *name,
- nxml_error_t *err);
+nxml_data_t *nxmle_find_element(nxml_t *nxml,
+ nxml_data_t *parent,
+ char *name,
+ nxml_error_t *err);
/**
* This function returns the value of a attribute by a name.
@@ -892,9 +882,9 @@ nxml_data_t * nxmle_find_element (nxml_t *nxml,
* \return a pointer to a char allocated so you must free it after usage. If
* it is NULL, the attribute does not exist.
*/
-char * nxmle_find_attribute (nxml_data_t *element,
- char *name,
- nxml_error_t *err);
+char *nxmle_find_attribute(nxml_data_t *element,
+ char *name,
+ nxml_error_t *err);
/**
* This function returns the value of a namespace by a name.
@@ -905,9 +895,9 @@ char * nxmle_find_attribute (nxml_data_t *element,
* \return a pointer to a char allocated so you must free it after usage. If
* it is NULL, the namespace does not exist.
*/
-char * nxmle_find_namespace (nxml_data_t *element,
- char *name,
- nxml_error_t *err);
+char *nxmle_find_namespace(nxml_data_t *element,
+ char *name,
+ nxml_error_t *err);
/**
* This function returns the contain of a element.
@@ -917,8 +907,8 @@ char * nxmle_find_namespace (nxml_data_t *element,
* \return a pointer to a char allocated so you must free it after usage. If
* it is NULL, the attribute does not exist.
*/
-char * nxmle_get_string (nxml_data_t *element,
- nxml_error_t *err);
+char *nxmle_get_string(nxml_data_t *element,
+ nxml_error_t *err);
/**
* This function writes the data struct in a buffer.
@@ -927,7 +917,7 @@ char * nxmle_get_string (nxml_data_t *element,
* \param err If err is not NULL, err will be set to the error flag.
* \return a pointer to a char allocated so you must free it after usage.
*/
-char * nxmle_write_buffer (nxml_t *nxml, nxml_error_t *err);
+char *nxmle_write_buffer(nxml_t *nxml, nxml_error_t *err);
/**
* This function return the line of a error of parse.
@@ -935,22 +925,22 @@ char * nxmle_write_buffer (nxml_t *nxml, nxml_error_t *err);
* \param err If err is not NULL, err will be set to the error flag.
* \return the line with the error.
*/
-int nxmle_line_error (nxml_t * nxml, nxml_error_t *err);
+int nxmle_line_error(nxml_t *nxml, nxml_error_t *err);
/* Easy functions defined: */
-#define nxmle_remove nxml_remove
-#define nxmle_remove_attribute nxml_remove_attribute
-#define nxmle_remove_namespace nxml_remove_namespace
-#define nxmle_write_file nxml_write_file
+#define nxmle_remove nxml_remove
+#define nxmle_remove_attribute nxml_remove_attribute
+#define nxmle_remove_namespace nxml_remove_namespace
+#define nxmle_write_file nxml_write_file
-#define nxmle_empty nxml_empty
-#define nxmle_free nxml_free
-#define nxmle_free_data nxml_free_data
-#define nxmle_free_attribute nxml_free_attribute
+#define nxmle_empty nxml_empty
+#define nxmle_free nxml_free
+#define nxmle_free_data nxml_free_data
+#define nxmle_free_attribute nxml_free_attribute
-#define nxmle_strerror nxml_strerror
+#define nxmle_strerror nxml_strerror
-# include "nxml_internal.h"
+#include "nxml_internal.h"
#endif
diff --git a/plugins/backend/local/libnxml/nxml_download.c b/plugins/backend/local/libnxml/nxml_download.c
index c037cd4c..9f079bd3 100644
--- a/plugins/backend/local/libnxml/nxml_download.c
+++ b/plugins/backend/local/libnxml/nxml_download.c
@@ -1,140 +1,139 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "nxml.h"
typedef struct __nxml_download_t__ __nxml_download_t;
struct __nxml_download_t__
{
- char *mm;
- size_t size;
+ char *mm;
+ size_t size;
};
static size_t
-__nxml_memorize_file (void *ptr, size_t size, size_t nmemb, void *data)
+__nxml_memorize_file(void *ptr, size_t size, size_t nmemb, void *data)
{
- register int realsize = size * nmemb;
- __nxml_download_t *mem = (__nxml_download_t *) data;
-
- if (!mem->mm)
- {
- if (!(mem->mm = (char *) malloc (realsize + 1)))
- return -1;
- }
- else
- {
- if (!(mem->mm = (char *) realloc (mem->mm, mem->size + realsize + 1)))
- return -1;
- }
-
- memcpy (&(mem->mm[mem->size]), ptr, realsize);
- mem->size += realsize;
- mem->mm[mem->size] = 0;
-
- return realsize;
+ register int realsize = size * nmemb;
+ __nxml_download_t *mem = (__nxml_download_t *)data;
+
+ if (!mem->mm)
+ {
+ if (!(mem->mm = (char *)malloc(realsize + 1)))
+ return -1;
+ }
+ else
+ {
+ if (!(mem->mm = (char *)realloc(mem->mm, mem->size + realsize + 1)))
+ return -1;
+ }
+
+ memcpy(&(mem->mm[mem->size]), ptr, realsize);
+ mem->size += realsize;
+ mem->mm[mem->size] = 0;
+
+ return realsize;
}
nxml_error_t
-nxml_download_file (nxml_t * nxml, char *fl, char **buffer, size_t * size)
+nxml_download_file(nxml_t *nxml, char *fl, char **buffer, size_t *size)
{
- __nxml_download_t *chunk;
- CURL *curl;
- CURLcode ret;
+ __nxml_download_t *chunk;
+ CURL *curl;
+ CURLcode ret;
- if (!fl || !buffer || !nxml)
- return NXML_ERR_DATA;
+ if (!fl || !buffer || !nxml)
+ return NXML_ERR_DATA;
- if (!(chunk = (__nxml_download_t *) malloc (sizeof (__nxml_download_t))))
- return NXML_ERR_POSIX;
+ if (!(chunk = (__nxml_download_t *)malloc(sizeof(__nxml_download_t))))
+ return NXML_ERR_POSIX;
- chunk->mm = NULL;
- chunk->size = 0;
+ chunk->mm = NULL;
+ chunk->size = 0;
- curl_global_init (CURL_GLOBAL_DEFAULT);
- if (!(curl = curl_easy_init ()))
- {
- free (chunk);
- return NXML_ERR_POSIX;
- }
+ curl_global_init(CURL_GLOBAL_DEFAULT);
+ if (!(curl = curl_easy_init()))
+ {
+ free(chunk);
+ return NXML_ERR_POSIX;
+ }
- curl_easy_setopt (curl, CURLOPT_URL, fl);
- curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, __nxml_memorize_file);
- curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt (curl, CURLOPT_FILE, (void *) chunk);
- curl_easy_setopt (curl, CURLOPT_ENCODING, "gzip, deflate");
+ curl_easy_setopt(curl, CURLOPT_URL, fl);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, __nxml_memorize_file);
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt(curl, CURLOPT_FILE, (void *)chunk);
+ curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip, deflate");
- if (nxml->priv.timeout)
- curl_easy_setopt (curl, CURLOPT_TIMEOUT, nxml->priv.timeout);
+ if (nxml->priv.timeout)
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT, nxml->priv.timeout);
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, !nxml->priv.verifypeer);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, !nxml->priv.verifypeer);
- if (nxml->priv.certfile)
- {
- curl_easy_setopt (curl, CURLOPT_SSLCERT, nxml->priv.certfile);
+ if (nxml->priv.certfile)
+ {
+ curl_easy_setopt(curl, CURLOPT_SSLCERT, nxml->priv.certfile);
- if (nxml->priv.password)
- curl_easy_setopt (curl, CURLOPT_SSLCERTPASSWD, nxml->priv.password);
+ if (nxml->priv.password)
+ curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, nxml->priv.password);
- if (nxml->priv.cacert)
- curl_easy_setopt (curl, CURLOPT_CAINFO, nxml->priv.cacert);
- }
+ if (nxml->priv.cacert)
+ curl_easy_setopt(curl, CURLOPT_CAINFO, nxml->priv.cacert);
+ }
- if (nxml->priv.authentication)
- curl_easy_setopt (curl, CURLOPT_USERPWD, nxml->priv.authentication);
+ if (nxml->priv.authentication)
+ curl_easy_setopt(curl, CURLOPT_USERPWD, nxml->priv.authentication);
- if (nxml->priv.proxy)
- {
- curl_easy_setopt (curl, CURLOPT_PROXY, nxml->priv.proxy);
+ if (nxml->priv.proxy)
+ {
+ curl_easy_setopt(curl, CURLOPT_PROXY, nxml->priv.proxy);
- if (nxml->priv.proxy_authentication)
- curl_easy_setopt (curl, CURLOPT_PROXYUSERPWD,
- nxml->priv.proxy_authentication);
- }
+ if (nxml->priv.proxy_authentication)
+ curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD,
+ nxml->priv.proxy_authentication);
+ }
- if (nxml->priv.user_agent)
- curl_easy_setopt (curl, CURLOPT_USERAGENT, nxml->priv.user_agent);
+ if (nxml->priv.user_agent)
+ curl_easy_setopt(curl, CURLOPT_USERAGENT, nxml->priv.user_agent);
- if ((ret = curl_easy_perform (curl)))
- {
- if (chunk->mm)
- free (chunk->mm);
+ if ((ret = curl_easy_perform(curl)))
+ {
+ if (chunk->mm)
+ free(chunk->mm);
- free (chunk);
+ free(chunk);
- nxml->priv.curl_error = ret;
+ nxml->priv.curl_error = ret;
- curl_easy_cleanup (curl);
- return NXML_ERR_DOWNLOAD;
- }
+ curl_easy_cleanup(curl);
+ return NXML_ERR_DOWNLOAD;
+ }
- curl_easy_cleanup (curl);
+ curl_easy_cleanup(curl);
- *buffer = chunk->mm;
+ *buffer = chunk->mm;
- if (size)
- *size = chunk->size;
+ if (size)
+ *size = chunk->size;
- free (chunk);
+ free(chunk);
- return NXML_OK;
+ return NXML_OK;
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_easy.c b/plugins/backend/local/libnxml/nxml_easy.c
index fcee6bcc..00690553 100644
--- a/plugins/backend/local/libnxml/nxml_easy.c
+++ b/plugins/backend/local/libnxml/nxml_easy.c
@@ -1,394 +1,392 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "nxml.h"
nxml_t *
-nxmle_new_data (nxml_error_t * err)
+nxmle_new_data(nxml_error_t *err)
{
- nxml_t *data = NULL;
- nxml_error_t ret;
+ nxml_t *data = NULL;
+ nxml_error_t ret;
- ret = nxml_new (&data);
- if (err)
- *err = ret;
+ ret = nxml_new(&data);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return data;
+ return data;
}
nxml_t *
-nxmle_new_data_from_url (char *url, nxml_error_t * err)
+nxmle_new_data_from_url(char *url, nxml_error_t *err)
{
- nxml_t *data = NULL;
- nxml_error_t ret;
+ nxml_t *data = NULL;
+ nxml_error_t ret;
- ret = nxml_new (&data);
- if (err)
- *err = ret;
+ ret = nxml_new(&data);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- nxml_set_func (data, nxml_print_generic);
+ nxml_set_func(data, nxml_print_generic);
- ret = nxml_parse_url (data, url);
- if (err)
- *err = ret;
+ ret = nxml_parse_url(data, url);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- {
- nxml_free (data);
- return NULL;
- }
+ if (ret != NXML_OK)
+ {
+ nxml_free(data);
+ return NULL;
+ }
- return data;
+ return data;
}
nxml_t *
-nxmle_new_data_from_file (char *file, nxml_error_t * err)
+nxmle_new_data_from_file(char *file, nxml_error_t *err)
{
- nxml_t *data = NULL;
- nxml_error_t ret;
+ nxml_t *data = NULL;
+ nxml_error_t ret;
- ret = nxml_new (&data);
- if (err)
- *err = ret;
+ ret = nxml_new(&data);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- nxml_set_func (data, nxml_print_generic);
+ nxml_set_func(data, nxml_print_generic);
- ret = nxml_parse_file (data, file);
- if (err)
- *err = ret;
+ ret = nxml_parse_file(data, file);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- {
- nxml_free (data);
- return NULL;
- }
+ if (ret != NXML_OK)
+ {
+ nxml_free(data);
+ return NULL;
+ }
- return data;
+ return data;
}
nxml_t *
-nxmle_new_data_from_buffer (char *buffer, size_t size, nxml_error_t * err)
+nxmle_new_data_from_buffer(char *buffer, size_t size, nxml_error_t *err)
{
- nxml_t *data = NULL;
- nxml_error_t ret;
+ nxml_t *data = NULL;
+ nxml_error_t ret;
- ret = nxml_new (&data);
- if (err)
- *err = ret;
+ ret = nxml_new(&data);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- nxml_set_func (data, nxml_print_generic);
+ nxml_set_func(data, nxml_print_generic);
- ret = nxml_parse_buffer (data, buffer, size);
- if (err)
- *err = ret;
+ ret = nxml_parse_buffer(data, buffer, size);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- {
- nxml_free (data);
- return NULL;
- }
+ if (ret != NXML_OK)
+ {
+ nxml_free(data);
+ return NULL;
+ }
- return data;
+ return data;
}
nxml_data_t *
-nxmle_add_new (nxml_t * nxml, nxml_data_t * parent, nxml_error_t * err)
+nxmle_add_new(nxml_t *nxml, nxml_data_t *parent, nxml_error_t *err)
{
- nxml_error_t ret;
- nxml_data_t *child = NULL;
+ nxml_error_t ret;
+ nxml_data_t *child = NULL;
- ret = nxml_add (nxml, parent, &child);
- if (err)
- *err = ret;
+ ret = nxml_add(nxml, parent, &child);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return child;
+ return child;
}
nxml_data_t *
-nxmle_add_data (nxml_t * nxml, nxml_data_t * parent, nxml_data_t * child,
- nxml_error_t * err)
+nxmle_add_data(nxml_t *nxml, nxml_data_t *parent, nxml_data_t *child,
+ nxml_error_t *err)
{
- nxml_error_t ret;
+ nxml_error_t ret;
- if (!child)
- {
- if (err)
- *err = NXML_ERR_DATA;
- return NULL;
- }
+ if (!child)
+ {
+ if (err)
+ *err = NXML_ERR_DATA;
+ return NULL;
+ }
- ret = nxml_add (nxml, parent, &child);
- if (err)
- *err = ret;
+ ret = nxml_add(nxml, parent, &child);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return child;
+ return child;
}
nxml_attr_t *
-nxmle_add_attribute_new (nxml_t * nxml, nxml_data_t * element,
- nxml_error_t * err)
+nxmle_add_attribute_new(nxml_t *nxml, nxml_data_t *element,
+ nxml_error_t *err)
{
- nxml_error_t ret;
- nxml_attr_t *attribute = NULL;
+ nxml_error_t ret;
+ nxml_attr_t *attribute = NULL;
- ret = nxml_add_attribute (nxml, element, &attribute);
- if (err)
- *err = ret;
+ ret = nxml_add_attribute(nxml, element, &attribute);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return attribute;
+ return attribute;
}
nxml_attr_t *
-nxmle_add_attribute_data (nxml_t * nxml, nxml_data_t * element,
- nxml_attr_t * attribute, nxml_error_t * err)
+nxmle_add_attribute_data(nxml_t *nxml, nxml_data_t *element,
+ nxml_attr_t *attribute, nxml_error_t *err)
{
- nxml_error_t ret;
+ nxml_error_t ret;
- if (!attribute)
- {
- if (err)
- *err = NXML_ERR_DATA;
- return NULL;
- }
+ if (!attribute)
+ {
+ if (err)
+ *err = NXML_ERR_DATA;
+ return NULL;
+ }
- ret = nxml_add_attribute (nxml, element, &attribute);
- if (err)
- *err = ret;
+ ret = nxml_add_attribute(nxml, element, &attribute);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return attribute;
+ return attribute;
}
nxml_namespace_t *
-nxmle_add_namespace_new (nxml_t * nxml, nxml_data_t * element,
- nxml_error_t * err)
+nxmle_add_namespace_new(nxml_t *nxml, nxml_data_t *element,
+ nxml_error_t *err)
{
- nxml_error_t ret;
- nxml_namespace_t *namespace = NULL;
+ nxml_error_t ret;
+ nxml_namespace_t *namespace = NULL;
- ret = nxml_add_namespace (nxml, element, &namespace);
- if (err)
- *err = ret;
+ ret = nxml_add_namespace(nxml, element, &namespace);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return namespace;
+ return namespace;
}
nxml_namespace_t *
-nxmle_add_namespace_data (nxml_t * nxml, nxml_data_t * element,
- nxml_namespace_t * namespace, nxml_error_t * err)
+nxmle_add_namespace_data(nxml_t *nxml, nxml_data_t *element,
+ nxml_namespace_t *namespace, nxml_error_t *err)
{
- nxml_error_t ret;
+ nxml_error_t ret;
- if (!namespace)
- {
- if (err)
- *err = NXML_ERR_DATA;
- return NULL;
- }
+ if (!namespace)
+ {
+ if (err)
+ *err = NXML_ERR_DATA;
+ return NULL;
+ }
- ret = nxml_add_namespace (nxml, element, &namespace);
- if (err)
- *err = ret;
+ ret = nxml_add_namespace(nxml, element, &namespace);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return namespace;
+ return namespace;
}
nxml_data_t *
-nxmle_root_element (nxml_t * nxml, nxml_error_t * err)
+nxmle_root_element(nxml_t *nxml, nxml_error_t *err)
{
- nxml_data_t *root;
- nxml_error_t ret;
+ nxml_data_t *root;
+ nxml_error_t ret;
- ret = nxml_root_element (nxml, &root);
- if (err)
- *err = ret;
+ ret = nxml_root_element(nxml, &root);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return root;
+ return root;
}
nxml_doctype_t *
-nxmle_doctype_element (nxml_t * nxml, nxml_error_t * err)
+nxmle_doctype_element(nxml_t *nxml, nxml_error_t *err)
{
- nxml_doctype_t *doctype;
- nxml_error_t ret;
+ nxml_doctype_t *doctype;
+ nxml_error_t ret;
- ret = nxml_doctype_element (nxml, &doctype);
- if (err)
- *err = ret;
+ ret = nxml_doctype_element(nxml, &doctype);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return doctype;
+ return doctype;
}
nxml_data_t *
-nxmle_find_element (nxml_t * nxml, nxml_data_t * data, char *name,
- nxml_error_t * err)
+nxmle_find_element(nxml_t *nxml, nxml_data_t *data, char *name,
+ nxml_error_t *err)
{
- nxml_data_t *element;
- nxml_error_t ret;
+ nxml_data_t *element;
+ nxml_error_t ret;
- ret = nxml_find_element (nxml, data, name, &element);
- if (err)
- *err = ret;
+ ret = nxml_find_element(nxml, data, name, &element);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return element;
+ return element;
}
char *
-nxmle_find_attribute (nxml_data_t * data, char *name, nxml_error_t * err)
+nxmle_find_attribute(nxml_data_t *data, char *name, nxml_error_t *err)
{
- nxml_attr_t *attribute;
- nxml_error_t ret;
- char *str;
+ nxml_attr_t *attribute;
+ nxml_error_t ret;
+ char *str;
- ret = nxml_find_attribute (data, name, &attribute);
- if (err)
- *err = ret;
+ ret = nxml_find_attribute(data, name, &attribute);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- if (!attribute)
- return NULL;
+ if (!attribute)
+ return NULL;
- str = strdup (attribute->value);
- if (!str)
- {
- if (err)
- *err = NXML_ERR_POSIX;
- return NULL;
- }
+ str = strdup(attribute->value);
+ if (!str)
+ {
+ if (err)
+ *err = NXML_ERR_POSIX;
+ return NULL;
+ }
- return str;
+ return str;
}
char *
-nxmle_find_namespace (nxml_data_t * data, char *name, nxml_error_t * err)
+nxmle_find_namespace(nxml_data_t *data, char *name, nxml_error_t *err)
{
- nxml_namespace_t *namespace;
- nxml_error_t ret;
- char *str;
+ nxml_namespace_t *namespace;
+ nxml_error_t ret;
+ char *str;
- ret = nxml_find_namespace (data, name, &namespace);
- if (err)
- *err = ret;
+ ret = nxml_find_namespace(data, name, &namespace);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- if (!namespace)
- return NULL;
+ if (!namespace)
+ return NULL;
- str = strdup (namespace->ns);
- if (!str)
- {
- if (err)
- *err = NXML_ERR_POSIX;
- return NULL;
- }
+ str = strdup(namespace->ns);
+ if (!str)
+ {
+ if (err)
+ *err = NXML_ERR_POSIX;
+ return NULL;
+ }
- return str;
+ return str;
}
char *
-nxmle_get_string (nxml_data_t * data, nxml_error_t * err)
+nxmle_get_string(nxml_data_t *data, nxml_error_t *err)
{
- nxml_error_t ret;
- char *str = NULL;
+ nxml_error_t ret;
+ char *str = NULL;
- ret = nxml_get_string (data, &str);
- if (err)
- *err = ret;
+ ret = nxml_get_string(data, &str);
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return str;
+ return str;
}
char *
-nxmle_write_buffer (nxml_t * nxml, nxml_error_t * err)
+nxmle_write_buffer(nxml_t *nxml, nxml_error_t *err)
{
- char *buffer;
- nxml_error_t ret;
+ char *buffer;
+ nxml_error_t ret;
- buffer = NULL;
- ret = nxml_write_buffer (nxml, &buffer);
+ buffer = NULL;
+ ret = nxml_write_buffer(nxml, &buffer);
- if (err)
- *err = ret;
+ if (err)
+ *err = ret;
- if (ret != NXML_OK)
- return NULL;
+ if (ret != NXML_OK)
+ return NULL;
- return buffer;
+ return buffer;
}
-int
-nxmle_line_error (nxml_t * nxml, nxml_error_t * err)
+int nxmle_line_error(nxml_t *nxml, nxml_error_t *err)
{
- int line;
- nxml_error_t ret;
+ int line;
+ nxml_error_t ret;
- ret = nxml_line_error (nxml, &line);
+ ret = nxml_line_error(nxml, &line);
- if (err)
- *err = ret;
+ if (err)
+ *err = ret;
- return line;
+ return line;
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_edit.c b/plugins/backend/local/libnxml/nxml_edit.c
index 3d4476d5..597dcaa4 100644
--- a/plugins/backend/local/libnxml/nxml_edit.c
+++ b/plugins/backend/local/libnxml/nxml_edit.c
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -19,167 +19,166 @@
#include "nxml.h"
nxml_error_t
-nxml_root_element (nxml_t * nxml, nxml_data_t ** data)
+nxml_root_element(nxml_t *nxml, nxml_data_t **data)
{
- nxml_data_t *tmp;
+ nxml_data_t *tmp;
- if (!data || !nxml)
- return NXML_ERR_DATA;
+ if (!data || !nxml)
+ return NXML_ERR_DATA;
- tmp = nxml->data;
- while (tmp)
- {
+ tmp = nxml->data;
+ while (tmp)
+ {
- if (tmp->type == NXML_TYPE_ELEMENT)
- break;
+ if (tmp->type == NXML_TYPE_ELEMENT)
+ break;
- tmp = tmp->next;
- }
+ tmp = tmp->next;
+ }
- *data = tmp;
+ *data = tmp;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_doctype_element (nxml_t * nxml, nxml_doctype_t ** data)
+nxml_doctype_element(nxml_t *nxml, nxml_doctype_t **data)
{
- if (!data || !nxml)
- return NXML_ERR_DATA;
+ if (!data || !nxml)
+ return NXML_ERR_DATA;
- *data = nxml->doctype;
- return NXML_OK;
+ *data = nxml->doctype;
+ return NXML_OK;
}
nxml_error_t
-nxml_get_string (nxml_data_t * data, char **string)
+nxml_get_string(nxml_data_t *data, char **string)
{
- if (!data || !string)
- return NXML_ERR_DATA;
-
- if (data->type == NXML_TYPE_TEXT)
- *string = strdup (data->value);
+ if (!data || !string)
+ return NXML_ERR_DATA;
- else if (data->type == NXML_TYPE_ELEMENT)
- {
- nxml_data_t *tmp;
+ if (data->type == NXML_TYPE_TEXT)
+ *string = strdup(data->value);
- tmp = data->children;
- *string = NULL;
-
- while (tmp)
+ else if (data->type == NXML_TYPE_ELEMENT)
{
- if (tmp->type == NXML_TYPE_TEXT)
- {
- *string = strdup (tmp->value);
- break;
- }
- tmp = tmp->next;
+ nxml_data_t *tmp;
+
+ tmp = data->children;
+ *string = NULL;
+
+ while (tmp)
+ {
+ if (tmp->type == NXML_TYPE_TEXT)
+ {
+ *string = strdup(tmp->value);
+ break;
+ }
+ tmp = tmp->next;
+ }
}
- }
- else
- *string = NULL;
+ else
+ *string = NULL;
- return NXML_OK;
+ return NXML_OK;
}
-
nxml_error_t
-nxml_find_element (nxml_t * nxml, nxml_data_t * data, char *name,
- nxml_data_t ** element)
+nxml_find_element(nxml_t *nxml, nxml_data_t *data, char *name,
+ nxml_data_t **element)
{
- nxml_data_t *tmp;
+ nxml_data_t *tmp;
- if (!nxml || !name || !element)
- return NXML_ERR_DATA;
+ if (!nxml || !name || !element)
+ return NXML_ERR_DATA;
- if (data && data->type != NXML_TYPE_ELEMENT)
- {
- *element = NULL;
- return NXML_OK;
- }
+ if (data && data->type != NXML_TYPE_ELEMENT)
+ {
+ *element = NULL;
+ return NXML_OK;
+ }
- if (data)
- tmp = data->children;
- else
- tmp = nxml->data;
+ if (data)
+ tmp = data->children;
+ else
+ tmp = nxml->data;
- while (tmp)
- {
- if (tmp->type == NXML_TYPE_ELEMENT && !strcmp (tmp->value, name))
+ while (tmp)
{
- *element = tmp;
- return NXML_OK;
- }
+ if (tmp->type == NXML_TYPE_ELEMENT && !strcmp(tmp->value, name))
+ {
+ *element = tmp;
+ return NXML_OK;
+ }
- tmp = tmp->next;
- }
+ tmp = tmp->next;
+ }
- *element = NULL;
- return NXML_OK;
+ *element = NULL;
+ return NXML_OK;
}
nxml_error_t
-nxml_find_attribute (nxml_data_t * data, char *name, nxml_attr_t ** attribute)
+nxml_find_attribute(nxml_data_t *data, char *name, nxml_attr_t **attribute)
{
- nxml_attr_t *tmp;
+ nxml_attr_t *tmp;
- if (!data || !name || !attribute)
- return NXML_ERR_DATA;
+ if (!data || !name || !attribute)
+ return NXML_ERR_DATA;
- if (data->type != NXML_TYPE_ELEMENT)
- {
- *attribute = NULL;
- return NXML_OK;
- }
+ if (data->type != NXML_TYPE_ELEMENT)
+ {
+ *attribute = NULL;
+ return NXML_OK;
+ }
- tmp = data->attributes;
+ tmp = data->attributes;
- while (tmp)
- {
- if (!strcmp (tmp->name, name))
+ while (tmp)
{
- *attribute = tmp;
- return NXML_OK;
- }
+ if (!strcmp(tmp->name, name))
+ {
+ *attribute = tmp;
+ return NXML_OK;
+ }
- tmp = tmp->next;
- }
+ tmp = tmp->next;
+ }
- *attribute = NULL;
- return NXML_OK;
+ *attribute = NULL;
+ return NXML_OK;
}
nxml_error_t
-nxml_find_namespace (nxml_data_t * data, char *name,
- nxml_namespace_t ** namespace)
+nxml_find_namespace(nxml_data_t *data, char *name,
+ nxml_namespace_t **namespace)
{
- nxml_namespace_t *tmp;
+ nxml_namespace_t *tmp;
- if (!data || !name || !namespace)
- return NXML_ERR_DATA;
+ if (!data || !name || !namespace)
+ return NXML_ERR_DATA;
- if (data->type != NXML_TYPE_ELEMENT)
- {
- *namespace = NULL;
- return NXML_OK;
- }
+ if (data->type != NXML_TYPE_ELEMENT)
+ {
+ *namespace = NULL;
+ return NXML_OK;
+ }
- tmp = data->ns_list;
+ tmp = data->ns_list;
- while (tmp)
- {
- if (!strcmp (tmp->ns, name))
+ while (tmp)
{
- *namespace = tmp;
- return NXML_OK;
- }
+ if (!strcmp(tmp->ns, name))
+ {
+ *namespace = tmp;
+ return NXML_OK;
+ }
- tmp = tmp->next;
- }
+ tmp = tmp->next;
+ }
- *namespace = NULL;
- return NXML_OK;
+ *namespace = NULL;
+ return NXML_OK;
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_error.c b/plugins/backend/local/libnxml/nxml_error.c
index 0c9d8c48..604fd640 100644
--- a/plugins/backend/local/libnxml/nxml_error.c
+++ b/plugins/backend/local/libnxml/nxml_error.c
@@ -1,67 +1,63 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "nxml.h"
char *
-nxml_strerror (nxml_t * nxml, nxml_error_t err)
+nxml_strerror(nxml_t *nxml, nxml_error_t err)
{
- switch (err)
- {
- case NXML_OK:
- return "Success";
+ switch (err)
+ {
+ case NXML_OK:
+ return "Success";
- case NXML_ERR_PARSER:
- return "Parser error";
+ case NXML_ERR_PARSER:
+ return "Parser error";
- case NXML_ERR_DOWNLOAD:
- return nxml
- && nxml->priv.curl_error ? (char *) curl_easy_strerror (nxml->priv.
- curl_error) :
- "Download error";
+ case NXML_ERR_DOWNLOAD:
+ return nxml && nxml->priv.curl_error ? (char *)curl_easy_strerror(nxml->priv.curl_error) : "Download error";
- case NXML_ERR_DATA:
- return "No correct paramenter in the function";
+ case NXML_ERR_DATA:
+ return "No correct paramenter in the function";
- default:
- return strerror (errno);
- }
+ default:
+ return strerror(errno);
+ }
}
CURLcode
-nxml_curl_error (nxml_t * nxml, nxml_error_t err)
+nxml_curl_error(nxml_t *nxml, nxml_error_t err)
{
- if (!nxml || err != NXML_ERR_DOWNLOAD)
- return CURLE_OK;
+ if (!nxml || err != NXML_ERR_DOWNLOAD)
+ return CURLE_OK;
- return nxml->priv.curl_error;
+ return nxml->priv.curl_error;
}
nxml_error_t
-nxml_line_error (nxml_t * nxml, int *line)
+nxml_line_error(nxml_t *nxml, int *line)
{
- if (!nxml || !line)
- return NXML_ERR_DATA;
+ if (!nxml || !line)
+ return NXML_ERR_DATA;
- *line = nxml->priv.line;
+ *line = nxml->priv.line;
- return NXML_OK;
+ return NXML_OK;
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_free.c b/plugins/backend/local/libnxml/nxml_free.c
index 2a40ef7b..ae4ee080 100644
--- a/plugins/backend/local/libnxml/nxml_free.c
+++ b/plugins/backend/local/libnxml/nxml_free.c
@@ -1,234 +1,233 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "nxml.h"
-static void __nxml_private_free (__nxml_private_t * priv);
-static void __nxml_entity_free (__nxml_private_t * priv);
+static void __nxml_private_free(__nxml_private_t *priv);
+static void __nxml_entity_free(__nxml_private_t *priv);
nxml_error_t
-nxml_free_data (nxml_data_t * data)
+nxml_free_data(nxml_data_t *data)
{
- nxml_namespace_t *namespace;
- nxml_attr_t *attr;
- nxml_data_t *tmp;
- void *old;
+ nxml_namespace_t *namespace;
+ nxml_attr_t *attr;
+ nxml_data_t *tmp;
+ void *old;
- if (!data)
- return NXML_ERR_DATA;
+ if (!data)
+ return NXML_ERR_DATA;
- if (data->value)
- free (data->value);
+ if (data->value)
+ free(data->value);
- namespace = data->ns_list;
- while (namespace)
- {
- old = namespace;
- namespace = namespace->next;
+ namespace = data->ns_list;
+ while (namespace)
+ {
+ old = namespace;
+ namespace = namespace->next;
- nxml_free_namespace (old);
- }
+ nxml_free_namespace(old);
+ }
- attr = data->attributes;
- while (attr)
- {
- old = attr;
- attr = attr->next;
+ attr = data->attributes;
+ while (attr)
+ {
+ old = attr;
+ attr = attr->next;
- nxml_free_attribute (old);
- }
+ nxml_free_attribute(old);
+ }
- tmp = data->children;
- while (tmp)
- {
- old = tmp;
- tmp = tmp->next;
+ tmp = data->children;
+ while (tmp)
+ {
+ old = tmp;
+ tmp = tmp->next;
- nxml_free_data (old);
- }
+ nxml_free_data(old);
+ }
- free (data);
+ free(data);
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_free_attribute (nxml_attr_t * t)
+nxml_free_attribute(nxml_attr_t *t)
{
- if (!t)
- return NXML_ERR_DATA;
+ if (!t)
+ return NXML_ERR_DATA;
- if (t->name)
- free (t->name);
+ if (t->name)
+ free(t->name);
- if (t->value)
- free (t->value);
+ if (t->value)
+ free(t->value);
- free (t);
+ free(t);
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_free_namespace (nxml_namespace_t * t)
+nxml_free_namespace(nxml_namespace_t *t)
{
- if (!t)
- return NXML_ERR_DATA;
+ if (!t)
+ return NXML_ERR_DATA;
- if (t->prefix)
- free (t->prefix);
+ if (t->prefix)
+ free(t->prefix);
- if (t->ns)
- free (t->ns);
+ if (t->ns)
+ free(t->ns);
- free (t);
+ free(t);
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_free_doctype (nxml_doctype_t * doctype)
+nxml_free_doctype(nxml_doctype_t *doctype)
{
- nxml_doctype_t *tmp;
+ nxml_doctype_t *tmp;
- if (!doctype)
- return NXML_ERR_DATA;
+ if (!doctype)
+ return NXML_ERR_DATA;
- while (doctype)
- {
- if (doctype->value)
- free (doctype->value);
+ while (doctype)
+ {
+ if (doctype->value)
+ free(doctype->value);
- if (doctype->name)
- free (doctype->name);
+ if (doctype->name)
+ free(doctype->name);
- tmp = doctype;
- doctype = doctype->next;
+ tmp = doctype;
+ doctype = doctype->next;
- free (tmp);
- }
+ free(tmp);
+ }
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_free (nxml_t * data)
+nxml_free(nxml_t *data)
{
- if (!data)
- return NXML_ERR_DATA;
+ if (!data)
+ return NXML_ERR_DATA;
- nxml_empty (data);
+ nxml_empty(data);
- __nxml_private_free (&data->priv);
+ __nxml_private_free(&data->priv);
- free (data);
+ free(data);
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_empty (nxml_t * data)
+nxml_empty(nxml_t *data)
{
- nxml_data_t *t, *old;
- __nxml_private_t priv;
+ nxml_data_t *t, *old;
+ __nxml_private_t priv;
- if (!data)
- return NXML_ERR_DATA;
+ if (!data)
+ return NXML_ERR_DATA;
- if (data->file)
- free (data->file);
+ if (data->file)
+ free(data->file);
- if (data->encoding)
- free (data->encoding);
+ if (data->encoding)
+ free(data->encoding);
- /* I must free the doctype, I must not empty only! */
- if (data->doctype)
- nxml_free_doctype (data->doctype);
+ /* I must free the doctype, I must not empty only! */
+ if (data->doctype)
+ nxml_free_doctype(data->doctype);
- t = data->data;
- while (t)
- {
- old = t;
- t = t->next;
- nxml_free_data (old);
- }
+ t = data->data;
+ while (t)
+ {
+ old = t;
+ t = t->next;
+ nxml_free_data(old);
+ }
- __nxml_entity_free (&data->priv);
+ __nxml_entity_free(&data->priv);
- memcpy (&priv, &data->priv, sizeof (__nxml_private_t));
- memset (data, 0, sizeof (nxml_t));
- memcpy (&data->priv, &priv, sizeof (__nxml_private_t));
+ memcpy(&priv, &data->priv, sizeof(__nxml_private_t));
+ memset(data, 0, sizeof(nxml_t));
+ memcpy(&data->priv, &priv, sizeof(__nxml_private_t));
- return NXML_OK;
+ return NXML_OK;
}
static void
-__nxml_entity_free (__nxml_private_t * priv)
+__nxml_entity_free(__nxml_private_t *priv)
{
- __nxml_entity_t *entity;
+ __nxml_entity_t *entity;
- if (!priv)
- return;
+ if (!priv)
+ return;
- while (priv->entities)
- {
- entity = priv->entities;
- priv->entities = priv->entities->next;
+ while (priv->entities)
+ {
+ entity = priv->entities;
+ priv->entities = priv->entities->next;
- if (entity->entity)
- free (entity->entity);
+ if (entity->entity)
+ free(entity->entity);
- if (entity->name)
- free (entity->name);
+ if (entity->name)
+ free(entity->name);
- free (entity);
- }
+ free(entity);
+ }
}
static void
-__nxml_private_free (__nxml_private_t * priv)
+__nxml_private_free(__nxml_private_t *priv)
{
- if (!priv)
- return;
+ if (!priv)
+ return;
- if (priv->proxy)
- free (priv->proxy);
+ if (priv->proxy)
+ free(priv->proxy);
- if (priv->proxy_authentication)
- free (priv->proxy_authentication);
+ if (priv->proxy_authentication)
+ free(priv->proxy_authentication);
- if (priv->certfile)
- free (priv->certfile);
+ if (priv->certfile)
+ free(priv->certfile);
- if (priv->password)
- free (priv->password);
+ if (priv->password)
+ free(priv->password);
- if (priv->cacert)
- free (priv->cacert);
+ if (priv->cacert)
+ free(priv->cacert);
- if (priv->authentication)
- free (priv->authentication);
+ if (priv->authentication)
+ free(priv->authentication);
- if (priv->user_agent)
- free (priv->user_agent);
+ if (priv->user_agent)
+ free(priv->user_agent);
- __nxml_entity_free (priv);
+ __nxml_entity_free(priv);
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_init.c b/plugins/backend/local/libnxml/nxml_init.c
index 0ed9879d..e7789fa5 100644
--- a/plugins/backend/local/libnxml/nxml_init.c
+++ b/plugins/backend/local/libnxml/nxml_init.c
@@ -1,406 +1,400 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "nxml.h"
nxml_error_t
-nxml_new (nxml_t ** nxml)
+nxml_new(nxml_t **nxml)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- if (!(*nxml = (nxml_t *) calloc (1, sizeof (nxml_t))))
- return NXML_ERR_POSIX;
+ if (!(*nxml = (nxml_t *)calloc(1, sizeof(nxml_t))))
+ return NXML_ERR_POSIX;
- return NXML_OK;
+ return NXML_OK;
}
static void
-nxml_add_rec (nxml_t * nxml, nxml_data_t * data)
+nxml_add_rec(nxml_t *nxml, nxml_data_t *data)
{
- while (data)
- {
- data->doc = nxml;
- if (data->children)
- nxml_add_rec (nxml, data->children);
-
- data = data->next;
- }
+ while (data)
+ {
+ data->doc = nxml;
+ if (data->children)
+ nxml_add_rec(nxml, data->children);
+
+ data = data->next;
+ }
}
nxml_error_t
-nxml_add (nxml_t * nxml, nxml_data_t * parent, nxml_data_t ** child)
+nxml_add(nxml_t *nxml, nxml_data_t *parent, nxml_data_t **child)
{
- nxml_data_t *tmp;
+ nxml_data_t *tmp;
- if (!nxml || !child)
- return NXML_ERR_DATA;
+ if (!nxml || !child)
+ return NXML_ERR_DATA;
- if (!*child && !(*child = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
+ if (!*child && !(*child = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
+ (*child)->doc = nxml;
+ (*child)->parent = parent;
+ (*child)->next = NULL;
- (*child)->doc = nxml;
- (*child)->parent = parent;
- (*child)->next = NULL;
-
-
- if (parent)
- {
- if (!parent->children)
- parent->children = *child;
-
- else
+ if (parent)
{
- tmp = parent->children;
+ if (!parent->children)
+ parent->children = *child;
- while (tmp->next)
- tmp = tmp->next;
+ else
+ {
+ tmp = parent->children;
- tmp->next = *child;
- }
- }
- else
- {
- if (!nxml->data)
- nxml->data = *child;
+ while (tmp->next)
+ tmp = tmp->next;
- else
+ tmp->next = *child;
+ }
+ }
+ else
{
- tmp = nxml->data;
+ if (!nxml->data)
+ nxml->data = *child;
- while (tmp->next)
- tmp = tmp->next;
+ else
+ {
+ tmp = nxml->data;
- tmp->next = *child;
+ while (tmp->next)
+ tmp = tmp->next;
+
+ tmp->next = *child;
+ }
}
- }
- nxml_add_rec (nxml, (*child)->children);
+ nxml_add_rec(nxml, (*child)->children);
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_remove (nxml_t * nxml, nxml_data_t * parent, nxml_data_t * child)
+nxml_remove(nxml_t *nxml, nxml_data_t *parent, nxml_data_t *child)
{
- nxml_data_t *tmp, *old;
+ nxml_data_t *tmp, *old;
- if (!nxml || !child)
- return NXML_ERR_DATA;
+ if (!nxml || !child)
+ return NXML_ERR_DATA;
- if (parent)
- tmp = parent->children;
- else
- tmp = nxml->data;
+ if (parent)
+ tmp = parent->children;
+ else
+ tmp = nxml->data;
- old = NULL;
+ old = NULL;
- while (tmp)
- {
- if (tmp == child)
+ while (tmp)
{
- if (old)
- old->next = child->next;
- else if (parent)
- parent->children = child->next;
- else
- nxml->data = child->next;
-
- break;
+ if (tmp == child)
+ {
+ if (old)
+ old->next = child->next;
+ else if (parent)
+ parent->children = child->next;
+ else
+ nxml->data = child->next;
+
+ break;
+ }
+
+ old = tmp;
+ tmp = tmp->next;
}
- old = tmp;
- tmp = tmp->next;
- }
-
- child->next = NULL;
+ child->next = NULL;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_add_attribute (nxml_t * nxml, nxml_data_t * element, nxml_attr_t ** attr)
+nxml_add_attribute(nxml_t *nxml, nxml_data_t *element, nxml_attr_t **attr)
{
- nxml_attr_t *tmp;
+ nxml_attr_t *tmp;
- if (!nxml || !element || !attr)
- return NXML_ERR_DATA;
+ if (!nxml || !element || !attr)
+ return NXML_ERR_DATA;
- if (!*attr && !(*attr = (nxml_attr_t *) calloc (1, sizeof (nxml_attr_t))))
- return NXML_ERR_POSIX;
+ if (!*attr && !(*attr = (nxml_attr_t *)calloc(1, sizeof(nxml_attr_t))))
+ return NXML_ERR_POSIX;
- (*attr)->next = NULL;
+ (*attr)->next = NULL;
- if (!element->attributes)
- element->attributes = *attr;
+ if (!element->attributes)
+ element->attributes = *attr;
- else
- {
- tmp = element->attributes;
+ else
+ {
+ tmp = element->attributes;
- while (tmp->next)
- tmp = tmp->next;
+ while (tmp->next)
+ tmp = tmp->next;
- tmp->next = *attr;
- }
+ tmp->next = *attr;
+ }
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_remove_attribute (nxml_t * nxml, nxml_data_t * element,
- nxml_attr_t * attr)
+nxml_remove_attribute(nxml_t *nxml, nxml_data_t *element,
+ nxml_attr_t *attr)
{
- nxml_attr_t *tmp, *old;
+ nxml_attr_t *tmp, *old;
- if (!nxml || !element || !attr)
- return NXML_ERR_DATA;
+ if (!nxml || !element || !attr)
+ return NXML_ERR_DATA;
- tmp = element->attributes;
+ tmp = element->attributes;
- old = NULL;
+ old = NULL;
- while (tmp)
- {
- if (tmp == attr)
+ while (tmp)
{
- if (old)
- old->next = attr->next;
- else
- element->attributes = attr->next;
-
- break;
+ if (tmp == attr)
+ {
+ if (old)
+ old->next = attr->next;
+ else
+ element->attributes = attr->next;
+
+ break;
+ }
+
+ old = tmp;
+ tmp = tmp->next;
}
- old = tmp;
- tmp = tmp->next;
- }
-
- attr->next = NULL;
+ attr->next = NULL;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_add_namespace (nxml_t * nxml, nxml_data_t * element,
- nxml_namespace_t ** namespace)
+nxml_add_namespace(nxml_t *nxml, nxml_data_t *element,
+ nxml_namespace_t **namespace)
{
- nxml_namespace_t *tmp;
+ nxml_namespace_t *tmp;
- if (!nxml || !element || !namespace)
- return NXML_ERR_DATA;
+ if (!nxml || !element || !namespace)
+ return NXML_ERR_DATA;
- if (!*namespace
- && !(*namespace =
- (nxml_namespace_t *) calloc (1, sizeof (nxml_namespace_t))))
- return NXML_ERR_POSIX;
+ if (!*namespace && !(*namespace =
+ (nxml_namespace_t *)calloc(1, sizeof(nxml_namespace_t))))
+ return NXML_ERR_POSIX;
- (*namespace)->next = NULL;
+ (*namespace)->next = NULL;
- if (!element->ns_list)
- element->ns_list = *namespace;
+ if (!element->ns_list)
+ element->ns_list = *namespace;
- else
- {
- tmp = element->ns_list;
+ else
+ {
+ tmp = element->ns_list;
- while (tmp->next)
- tmp = tmp->next;
+ while (tmp->next)
+ tmp = tmp->next;
- tmp->next = *namespace;
- }
+ tmp->next = *namespace;
+ }
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_remove_namespace (nxml_t * nxml, nxml_data_t * element,
- nxml_namespace_t * namespace)
+nxml_remove_namespace(nxml_t *nxml, nxml_data_t *element,
+ nxml_namespace_t *namespace)
{
- nxml_namespace_t *tmp, *old;
+ nxml_namespace_t *tmp, *old;
- if (!nxml || !element || !namespace)
- return NXML_ERR_DATA;
+ if (!nxml || !element || !namespace)
+ return NXML_ERR_DATA;
- tmp = element->ns_list;
+ tmp = element->ns_list;
- old = NULL;
+ old = NULL;
- while (tmp)
- {
- if (tmp == namespace)
+ while (tmp)
{
- if (old)
- old->next = namespace->next;
- else
- element->ns_list = namespace->next;
-
- break;
+ if (tmp == namespace)
+ {
+ if (old)
+ old->next = namespace->next;
+ else
+ element->ns_list = namespace->next;
+
+ break;
+ }
+
+ old = tmp;
+ tmp = tmp->next;
}
- old = tmp;
- tmp = tmp->next;
- }
+ namespace->next = NULL;
- namespace->next = NULL;
-
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_func (nxml_t * nxml, void (*func) (char *, ...))
+nxml_set_func(nxml_t *nxml, void (*func)(char *, ...))
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- nxml->priv.func = func;
+ nxml->priv.func = func;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_timeout (nxml_t * nxml, int timeout)
+nxml_set_timeout(nxml_t *nxml, int timeout)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- nxml->priv.timeout = timeout;
+ nxml->priv.timeout = timeout;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_proxy (nxml_t * nxml, char *proxy, char *userpwd)
+nxml_set_proxy(nxml_t *nxml, char *proxy, char *userpwd)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- if (nxml->priv.proxy)
- free (nxml->priv.proxy);
+ if (nxml->priv.proxy)
+ free(nxml->priv.proxy);
- if (proxy)
- nxml->priv.proxy = strdup (proxy);
- else
- nxml->priv.proxy = NULL;
+ if (proxy)
+ nxml->priv.proxy = strdup(proxy);
+ else
+ nxml->priv.proxy = NULL;
- if (nxml->priv.proxy_authentication)
- free (nxml->priv.proxy_authentication);
+ if (nxml->priv.proxy_authentication)
+ free(nxml->priv.proxy_authentication);
- if (userpwd)
- nxml->priv.proxy_authentication = strdup (userpwd);
- else
- nxml->priv.proxy_authentication = NULL;
+ if (userpwd)
+ nxml->priv.proxy_authentication = strdup(userpwd);
+ else
+ nxml->priv.proxy_authentication = NULL;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_authentication (nxml_t * nxml, char *userpwd)
+nxml_set_authentication(nxml_t *nxml, char *userpwd)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- if (nxml->priv.authentication)
- free (nxml->priv.authentication);
+ if (nxml->priv.authentication)
+ free(nxml->priv.authentication);
- if (userpwd)
- nxml->priv.authentication = strdup (userpwd);
- else
- nxml->priv.authentication = NULL;
+ if (userpwd)
+ nxml->priv.authentication = strdup(userpwd);
+ else
+ nxml->priv.authentication = NULL;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_textindent (nxml_t * nxml, char textindent)
+nxml_set_textindent(nxml_t *nxml, char textindent)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- if (textindent)
- nxml->priv.textindent = 1;
- else
- nxml->priv.textindent = 0;
+ if (textindent)
+ nxml->priv.textindent = 1;
+ else
+ nxml->priv.textindent = 0;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_user_agent (nxml_t * nxml, char *user_agent)
+nxml_set_user_agent(nxml_t *nxml, char *user_agent)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- if (nxml->priv.user_agent)
- free (nxml->priv.user_agent);
+ if (nxml->priv.user_agent)
+ free(nxml->priv.user_agent);
- if (user_agent)
- nxml->priv.user_agent = strdup (user_agent);
- else
- nxml->priv.user_agent = NULL;
+ if (user_agent)
+ nxml->priv.user_agent = strdup(user_agent);
+ else
+ nxml->priv.user_agent = NULL;
- return NXML_OK;
+ return NXML_OK;
}
nxml_error_t
-nxml_set_certificate (nxml_t * nxml, char *certificate, char *password,
- char *cacert, int verifypeer)
+nxml_set_certificate(nxml_t *nxml, char *certificate, char *password,
+ char *cacert, int verifypeer)
{
- if (!nxml)
- return NXML_ERR_DATA;
+ if (!nxml)
+ return NXML_ERR_DATA;
- if (nxml->priv.certfile)
- free (nxml->priv.certfile);
+ if (nxml->priv.certfile)
+ free(nxml->priv.certfile);
- if (certificate)
- nxml->priv.certfile = strdup (certificate);
- else
- nxml->priv.certfile = NULL;
+ if (certificate)
+ nxml->priv.certfile = strdup(certificate);
+ else
+ nxml->priv.certfile = NULL;
- if (nxml->priv.password)
- free (nxml->priv.password);
+ if (nxml->priv.password)
+ free(nxml->priv.password);
- if (password)
- nxml->priv.password = strdup (password);
- else
- nxml->priv.password = NULL;
+ if (password)
+ nxml->priv.password = strdup(password);
+ else
+ nxml->priv.password = NULL;
- if (cacert)
- nxml->priv.cacert = strdup (cacert);
- else
- nxml->priv.cacert = NULL;
+ if (cacert)
+ nxml->priv.cacert = strdup(cacert);
+ else
+ nxml->priv.cacert = NULL;
- nxml->priv.verifypeer = !verifypeer;
+ nxml->priv.verifypeer = !verifypeer;
- return NXML_OK;
+ return NXML_OK;
}
-void
-nxml_print_generic (char *str, ...)
+void nxml_print_generic(char *str, ...)
{
- va_list va;
+ va_list va;
- va_start (va, str);
- vfprintf (stderr, str, va);
- va_end (va);
+ va_start(va, str);
+ vfprintf(stderr, str, va);
+ va_end(va);
}
-
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_internal.h b/plugins/backend/local/libnxml/nxml_internal.h
index b1d2339d..675b6654 100644
--- a/plugins/backend/local/libnxml/nxml_internal.h
+++ b/plugins/backend/local/libnxml/nxml_internal.h
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -21,60 +21,39 @@
/* Rule [4] */
#define __NXML_NAMESTARTCHARS \
- ((ch=__NXML_U8()) == ':' \
- || (ch >= 'a' && ch <= 'z') \
- || ch=='_' \
- || (ch >= 'A' && ch <= 'Z') \
- || (ch >= 0xc0 && ch <= 0xd6) \
- || (ch >= 0xd8 && ch <= 0xf6) \
- || (ch >= 0xf8 && ch <= 0x2ff) \
- || (ch >= 0x370 && ch <= 0x37d) \
- || (ch >= 0x37f && ch <= 0x1fff) \
- || (ch >= 0x200c && ch <= 0x200d) \
- || (ch >= 0x2070 && ch <= 0x218f) \
- || (ch >= 0x2c00 && ch <= 0x2fef) \
- || (ch >= 0x3001 && ch <= 0xd7ff) \
- || (ch >= 0xf900 && ch <= 0xfdcf) \
- || (ch >= 0xfdf0 && ch <= 0xfffd) \
- || (ch >= 0x10000 && ch <= 0xeffff))
+ ((ch = __NXML_U8()) == ':' || (ch >= 'a' && ch <= 'z') || ch == '_' || (ch >= 'A' && ch <= 'Z') || (ch >= 0xc0 && ch <= 0xd6) || (ch >= 0xd8 && ch <= 0xf6) || (ch >= 0xf8 && ch <= 0x2ff) || (ch >= 0x370 && ch <= 0x37d) || (ch >= 0x37f && ch <= 0x1fff) || (ch >= 0x200c && ch <= 0x200d) || (ch >= 0x2070 && ch <= 0x218f) || (ch >= 0x2c00 && ch <= 0x2fef) || (ch >= 0x3001 && ch <= 0xd7ff) || (ch >= 0xf900 && ch <= 0xfdcf) || (ch >= 0xfdf0 && ch <= 0xfffd) || (ch >= 0x10000 && ch <= 0xeffff))
/* Rule [4a] */
#define __NXML_NAMECHARS \
- (__NXML_NAMESTARTCHARS \
- || ch=='-' \
- || ch=='.' \
- || (ch >= '0' && ch <= '9') \
- || ch==0xb7 \
- || (ch >= 0x0300 && ch <= 0x036f) \
- || (ch >= 0x203f && ch <= 0x2040))
+ (__NXML_NAMESTARTCHARS || ch == '-' || ch == '.' || (ch >= '0' && ch <= '9') || ch == 0xb7 || (ch >= 0x0300 && ch <= 0x036f) || (ch >= 0x203f && ch <= 0x2040))
#define __NXML_U8() __nxml_utf8((unsigned char **)buffer, size, &byte)
typedef struct __nxml_string_t__ __nxml_string_t;
-int64_t __nxml_utf8 (unsigned char **buffer,
- size_t *size,
- int *byte);
+int64_t __nxml_utf8(unsigned char **buffer,
+ size_t *size,
+ int *byte);
-int64_t __nxml_int_charset (int i,
- unsigned char *buffer,
- char *charset);
+int64_t __nxml_int_charset(int i,
+ unsigned char *buffer,
+ char *charset);
-int __nxml_utf_detection (char *r_buffer,
+int __nxml_utf_detection(char *r_buffer,
size_t r_size,
char **buffer,
- size_t *size,
+ size_t *size,
nxml_charset_t *);
-int __nxml_escape_spaces (nxml_t * doc,
+int __nxml_escape_spaces(nxml_t *doc,
char **buffer,
- size_t * size);
+ size_t *size);
-char * __nxml_get_value (nxml_t * doc,
- char **buffer,
- size_t * size);
+char *__nxml_get_value(nxml_t *doc,
+ char **buffer,
+ size_t *size);
-char * __nxml_trim (char *tmp);
+char *__nxml_trim(char *tmp);
/* nxml_string.c */
@@ -84,24 +63,22 @@ char * __nxml_trim (char *tmp);
*/
struct __nxml_string_t__
{
- char *string;
- size_t size;
+ char *string;
+ size_t size;
};
-__nxml_string_t * __nxml_string_new (void);
+__nxml_string_t *__nxml_string_new(void);
-int __nxml_string_add (__nxml_string_t *st,
- char *what,
- size_t size);
+int __nxml_string_add(__nxml_string_t *st,
+ char *what,
+ size_t size);
-char * __nxml_string_free (__nxml_string_t *st);
+char *__nxml_string_free(__nxml_string_t *st);
+void __nxml_namespace_parse(nxml_t *nxml);
-void __nxml_namespace_parse (nxml_t *nxml);
-
-int __nxml_atoi (char *str);
+int __nxml_atoi(char *str);
#endif
/* EOF */
-
diff --git a/plugins/backend/local/libnxml/nxml_namespace.c b/plugins/backend/local/libnxml/nxml_namespace.c
index 523cd981..2f54670a 100644
--- a/plugins/backend/local/libnxml/nxml_namespace.c
+++ b/plugins/backend/local/libnxml/nxml_namespace.c
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -20,338 +20,335 @@
struct __nxml_data_ns_t
{
- nxml_namespace_t *ns;
- struct __nxml_data_ns_t *next;
+ nxml_namespace_t *ns;
+ struct __nxml_data_ns_t *next;
};
static void
-__nxml_namespace_free_item (nxml_data_t * e)
+__nxml_namespace_free_item(nxml_data_t *e)
{
- nxml_namespace_t *ns;
- nxml_data_t *child;
+ nxml_namespace_t *ns;
+ nxml_data_t *child;
- while (e->ns_list)
- {
- ns = e->ns_list->next;
+ while (e->ns_list)
+ {
+ ns = e->ns_list->next;
- if (e->ns_list->prefix)
- free (e->ns_list->prefix);
+ if (e->ns_list->prefix)
+ free(e->ns_list->prefix);
- if (e->ns_list->ns)
- free (e->ns_list->ns);
+ if (e->ns_list->ns)
+ free(e->ns_list->ns);
- free (e->ns_list);
+ free(e->ns_list);
- e->ns_list = ns;
- }
+ e->ns_list = ns;
+ }
- e->ns = NULL;
+ e->ns = NULL;
- child = e->children;
- while (child)
- {
- __nxml_namespace_free_item (child);
- child = child->next;
- }
+ child = e->children;
+ while (child)
+ {
+ __nxml_namespace_free_item(child);
+ child = child->next;
+ }
}
static void
-__nxml_namespace_free (nxml_t * nxml)
+__nxml_namespace_free(nxml_t *nxml)
{
- nxml_data_t *e;
+ nxml_data_t *e;
- e = nxml->data;
- while (e)
- {
- __nxml_namespace_free_item (e);
+ e = nxml->data;
+ while (e)
+ {
+ __nxml_namespace_free_item(e);
- e = e->next;
- }
+ e = e->next;
+ }
}
-int
-__nxml_namespace_parse_add (nxml_data_t * data, char *prefix, char *namespace)
+int __nxml_namespace_parse_add(nxml_data_t *data, char *prefix, char *namespace)
{
- nxml_namespace_t *ns;
+ nxml_namespace_t *ns;
- if (!(ns = (nxml_namespace_t *) calloc (1, sizeof (nxml_namespace_t))))
- return 1;
+ if (!(ns = (nxml_namespace_t *)calloc(1, sizeof(nxml_namespace_t))))
+ return 1;
- if (prefix && !(ns->prefix = strdup (prefix)))
- {
- free (ns);
- return 1;
- }
+ if (prefix && !(ns->prefix = strdup(prefix)))
+ {
+ free(ns);
+ return 1;
+ }
- if (!(ns->ns = strdup (namespace)))
- {
- if (ns->prefix)
- free (ns->prefix);
- free (ns);
- return 1;
- }
+ if (!(ns->ns = strdup(namespace)))
+ {
+ if (ns->prefix)
+ free(ns->prefix);
+ free(ns);
+ return 1;
+ }
- ns->next = data->ns_list;
- data->ns_list = ns;
+ ns->next = data->ns_list;
+ data->ns_list = ns;
- return 0;
+ return 0;
}
static int
-__nxml_namespace_find_item (nxml_t * nxml, nxml_data_t * e)
+__nxml_namespace_find_item(nxml_t *nxml, nxml_data_t *e)
{
- nxml_data_t *child;
- nxml_attr_t *att;
+ nxml_data_t *child;
+ nxml_attr_t *att;
- att = e->attributes;
- while (att)
- {
- if (!strcmp (att->name, "xmlns"))
+ att = e->attributes;
+ while (att)
{
- if (__nxml_namespace_parse_add (e, NULL, att->value))
- {
- __nxml_namespace_free (nxml);
- return 1;
- }
+ if (!strcmp(att->name, "xmlns"))
+ {
+ if (__nxml_namespace_parse_add(e, NULL, att->value))
+ {
+ __nxml_namespace_free(nxml);
+ return 1;
+ }
+ }
+ else if (!strncmp(att->name, "xmlns:", 6))
+ {
+ if (__nxml_namespace_parse_add(e, att->name + 6, att->value))
+ {
+ __nxml_namespace_free(nxml);
+ return 1;
+ }
+ }
+
+ att = att->next;
}
- else if (!strncmp (att->name, "xmlns:", 6))
+
+ child = e->children;
+ while (child)
{
- if (__nxml_namespace_parse_add (e, att->name + 6, att->value))
- {
- __nxml_namespace_free (nxml);
- return 1;
- }
+ if (child->type == NXML_TYPE_ELEMENT)
+ __nxml_namespace_find_item(nxml, child);
+ child = child->next;
}
- att = att->next;
- }
-
- child = e->children;
- while (child)
- {
- if (child->type == NXML_TYPE_ELEMENT)
- __nxml_namespace_find_item (nxml, child);
- child = child->next;
- }
-
- return 0;
+ return 0;
}
static int
-__nxml_namespace_find (nxml_t * nxml)
+__nxml_namespace_find(nxml_t *nxml)
{
- nxml_data_t *e;
+ nxml_data_t *e;
- e = nxml->data;
- while (e)
- {
- if (e->type == NXML_TYPE_ELEMENT)
- __nxml_namespace_find_item (nxml, e);
- e = e->next;
- }
-
- return 0;
+ e = nxml->data;
+ while (e)
+ {
+ if (e->type == NXML_TYPE_ELEMENT)
+ __nxml_namespace_find_item(nxml, e);
+ e = e->next;
+ }
+ return 0;
}
static void
-__nxml_namespace_associate_attribute (struct __nxml_data_ns_t *list,
- nxml_attr_t * e)
+__nxml_namespace_associate_attribute(struct __nxml_data_ns_t *list,
+ nxml_attr_t *e)
{
- int i;
- int len = strlen (e->name);
- int k;
-
- for (i = k = 0; i < len; i++)
- if (e->name[i] == ':')
- {
- k = i;
- break;
- }
-
- if (!k)
- {
- while (list)
+ int i;
+ int len = strlen(e->name);
+ int k;
+
+ for (i = k = 0; i < len; i++)
+ if (e->name[i] == ':')
+ {
+ k = i;
+ break;
+ }
+
+ if (!k)
{
- if (!list->ns->prefix)
- {
- e->ns = list->ns;
- return;
- }
- list = list->next;
- }
-
- return;
- }
+ while (list)
+ {
+ if (!list->ns->prefix)
+ {
+ e->ns = list->ns;
+ return;
+ }
+ list = list->next;
+ }
- else
- {
- while (list)
- {
- if (list->ns->prefix && !strncmp (list->ns->prefix, e->name, k))
- {
- char *a = strdup (e->name + strlen (list->ns->prefix) + 1);
-
- if (!a)
return;
+ }
- free (e->name);
- e->name = a;
-
- e->ns = list->ns;
- return;
- }
- list = list->next;
+ else
+ {
+ while (list)
+ {
+ if (list->ns->prefix && !strncmp(list->ns->prefix, e->name, k))
+ {
+ char *a = strdup(e->name + strlen(list->ns->prefix) + 1);
+
+ if (!a)
+ return;
+
+ free(e->name);
+ e->name = a;
+
+ e->ns = list->ns;
+ return;
+ }
+ list = list->next;
+ }
}
- }
}
static void
-__nxml_namespace_associate_item (struct __nxml_data_ns_t *list,
- nxml_data_t * e)
+__nxml_namespace_associate_item(struct __nxml_data_ns_t *list,
+ nxml_data_t *e)
{
- int i;
- int len;
- int k;
- nxml_attr_t *attr;
-
- attr = e->attributes;
- while (attr)
- {
- __nxml_namespace_associate_attribute (list, attr);
- attr = attr->next;
- }
-
- len = strlen (e->value);
-
- for (i = k = 0; i < len; i++)
- if (e->value[i] == ':')
- {
- k = i;
- break;
- }
-
- if (!k)
- {
- while (list)
+ int i;
+ int len;
+ int k;
+ nxml_attr_t *attr;
+
+ attr = e->attributes;
+ while (attr)
{
- if (!list->ns->prefix)
- {
- e->ns = list->ns;
- return;
- }
- list = list->next;
+ __nxml_namespace_associate_attribute(list, attr);
+ attr = attr->next;
}
- return;
- }
+ len = strlen(e->value);
+
+ for (i = k = 0; i < len; i++)
+ if (e->value[i] == ':')
+ {
+ k = i;
+ break;
+ }
- else
- {
- while (list)
+ if (!k)
{
- if (list->ns->prefix && !strncmp (list->ns->prefix, e->value, k))
- {
- char *a = strdup (e->value + strlen (list->ns->prefix) + 1);
+ while (list)
+ {
+ if (!list->ns->prefix)
+ {
+ e->ns = list->ns;
+ return;
+ }
+ list = list->next;
+ }
- if (!a)
return;
+ }
- free (e->value);
- e->value = a;
-
- e->ns = list->ns;
- return;
- }
- list = list->next;
+ else
+ {
+ while (list)
+ {
+ if (list->ns->prefix && !strncmp(list->ns->prefix, e->value, k))
+ {
+ char *a = strdup(e->value + strlen(list->ns->prefix) + 1);
+
+ if (!a)
+ return;
+
+ free(e->value);
+ e->value = a;
+
+ e->ns = list->ns;
+ return;
+ }
+ list = list->next;
+ }
}
- }
}
static void
-__nxml_namespace_associate (struct __nxml_data_ns_t **list,
- nxml_data_t * root)
+__nxml_namespace_associate(struct __nxml_data_ns_t **list,
+ nxml_data_t *root)
{
- nxml_data_t *e;
- nxml_namespace_t *ns;
- struct __nxml_data_ns_t *tmp, *old;
+ nxml_data_t *e;
+ nxml_namespace_t *ns;
+ struct __nxml_data_ns_t *tmp, *old;
- ns = root->ns_list;
- while (ns)
- {
- if (!(tmp = calloc (1, sizeof (struct __nxml_data_ns_t))))
- return;
-
- tmp->ns = ns;
- tmp->next = (*list);
- (*list) = tmp;
+ ns = root->ns_list;
+ while (ns)
+ {
+ if (!(tmp = calloc(1, sizeof(struct __nxml_data_ns_t))))
+ return;
- ns = ns->next;
- }
+ tmp->ns = ns;
+ tmp->next = (*list);
+ (*list) = tmp;
- __nxml_namespace_associate_item (*list, root);
+ ns = ns->next;
+ }
- e = root->children;
- while (e)
- {
- if (e->type == NXML_TYPE_ELEMENT)
- __nxml_namespace_associate (list, e);
+ __nxml_namespace_associate_item(*list, root);
- e = e->next;
- }
+ e = root->children;
+ while (e)
+ {
+ if (e->type == NXML_TYPE_ELEMENT)
+ __nxml_namespace_associate(list, e);
- ns = root->ns_list;
- while (ns)
- {
- tmp = *list;
- old = NULL;
+ e = e->next;
+ }
- while (tmp)
+ ns = root->ns_list;
+ while (ns)
{
- if (tmp->ns == ns)
- {
- if (old)
- old->next = tmp->next;
- else
- *list = tmp->next;
-
- free (tmp);
- break;
- }
-
- old = tmp;
- tmp = tmp->next;
+ tmp = *list;
+ old = NULL;
+
+ while (tmp)
+ {
+ if (tmp->ns == ns)
+ {
+ if (old)
+ old->next = tmp->next;
+ else
+ *list = tmp->next;
+
+ free(tmp);
+ break;
+ }
+
+ old = tmp;
+ tmp = tmp->next;
+ }
+
+ ns = ns->next;
}
-
- ns = ns->next;
- }
}
static void
-__nxml_namespace_connect (nxml_t * nxml)
+__nxml_namespace_connect(nxml_t *nxml)
{
- nxml_data_t *e;
- struct __nxml_data_ns_t *list = NULL;
+ nxml_data_t *e;
+ struct __nxml_data_ns_t *list = NULL;
- e = nxml->data;
- while (e)
- {
- if (e->type == NXML_TYPE_ELEMENT)
- __nxml_namespace_associate (&list, e);
+ e = nxml->data;
+ while (e)
+ {
+ if (e->type == NXML_TYPE_ELEMENT)
+ __nxml_namespace_associate(&list, e);
- e = e->next;
- }
+ e = e->next;
+ }
}
-void
-__nxml_namespace_parse (nxml_t * nxml)
+void __nxml_namespace_parse(nxml_t *nxml)
{
- __nxml_namespace_free (nxml);
+ __nxml_namespace_free(nxml);
- if (__nxml_namespace_find (nxml))
- return;
+ if (__nxml_namespace_find(nxml))
+ return;
- __nxml_namespace_connect (nxml);
+ __nxml_namespace_connect(nxml);
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_parser.c b/plugins/backend/local/libnxml/nxml_parser.c
index bdad6395..8379aa01 100644
--- a/plugins/backend/local/libnxml/nxml_parser.c
+++ b/plugins/backend/local/libnxml/nxml_parser.c
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -19,225 +19,221 @@
#include "nxml.h"
static int
-__nxml_parse_unique_attribute (nxml_attr_t * attr, char *name)
+__nxml_parse_unique_attribute(nxml_attr_t *attr, char *name)
{
- /*
+ /*
* Rule [40] - Well-formedness contraint: Unique Att Spec
*/
- while (attr)
- {
- if (!strcmp (attr->name, name))
- return 1;
+ while (attr)
+ {
+ if (!strcmp(attr->name, name))
+ return 1;
- attr = attr->next;
- }
+ attr = attr->next;
+ }
- return 0;
+ return 0;
}
static char *
-__nxml_parse_string (nxml_t * doc, char *buffer, int size)
+__nxml_parse_string(nxml_t *doc, char *buffer, int size)
{
- char *real;
- int i;
- int q;
- __nxml_string_t *ret;
+ char *real;
+ int i;
+ int q;
+ __nxml_string_t *ret;
- ret = __nxml_string_new ();
+ ret = __nxml_string_new();
- for (q = i = 0; i < size; i++)
- {
- if (*(buffer + i) == 0xd)
- continue;
-
- if (*(buffer + i) == 0xa || *(buffer + i) == 0x9
- || *(buffer + i) == 0x20)
+ for (q = i = 0; i < size; i++)
{
- if (!q)
- {
- if (!doc->priv.textindent)
- q = 1;
-
- __nxml_string_add (ret, buffer + i, 1);
- }
- }
+ if (*(buffer + i) == 0xd)
+ continue;
- else if (*(buffer + i) == '&')
- {
- if (!strncmp (buffer + i, "&lt;", 4))
- {
- __nxml_string_add (ret, "<", 1);
- i += 3;
- q = 0;
- }
-
- else if (!strncmp (buffer + i, "&gt;", 4))
- {
- __nxml_string_add (ret, ">", 1);
- i += 3;
- q = 0;
- }
-
- else if (!strncmp (buffer + i, "&amp;", 5))
- {
- __nxml_string_add (ret, "&", 1);
- i += 4;
- q = 0;
- }
-
- else if (!strncmp (buffer + i, "&apos;", 6))
- {
- __nxml_string_add (ret, "'", 1);
- i += 5;
- q = 0;
- }
-
- else if (!strncmp (buffer + i, "&quot;", 6))
- {
- __nxml_string_add (ret, "\"", 1);
- i += 5;
- q = 0;
- }
-
- else if (*(buffer + i + 1) == '#')
- {
- char buf[2048];
- int k = i;
- int last;
-
- while (*(buffer + k) != ';' && k < size)
- k++;
-
- last = k - (i + 2) > sizeof (buf) ? sizeof (buf) : k - (i + 2);
- strncpy (buf, buffer + i + 2, last);
- buf[last] = 0;
-
- if (buf[0] != 'x')
- last = atoi (buf);
- else
- last = __nxml_atoi (&buf[1]);
-
- if ((last = __nxml_int_charset (last, (unsigned char *) buf, doc->encoding)) > 0)
- {
- strncpy(buf, buffer + i, k-i+1);
- buf[k-i+2] = '\0';
- __nxml_string_add (ret, buf, k-i+1);
- }
- else
- __nxml_string_add (ret, buffer + i, 1);
-
- i += k - i;
- q = 0;
- }
-
- else
- {
- __nxml_entity_t *entity;
- char buf[1024];
- int k = i;
- int last;
-
- while (*(buffer + k) != ';' && k < size)
- k++;
-
- last = k - (i + 1) > sizeof (buf) ? sizeof (buf) : k - (i + 1);
- strncpy (buf, buffer + i + 1, last);
- buf[last] = 0;
-
- for (entity = doc->priv.entities; entity; entity = entity->next)
+ if (*(buffer + i) == 0xa || *(buffer + i) == 0x9 || *(buffer + i) == 0x20)
{
- if (!strcmp (entity->name, buf))
- {
- __nxml_string_add (ret, entity->entity,
- strlen (entity->entity));
- break;
- }
+ if (!q)
+ {
+ if (!doc->priv.textindent)
+ q = 1;
+ __nxml_string_add(ret, buffer + i, 1);
+ }
}
- if (!entity)
- __nxml_string_add (ret, buffer + i, 1);
- else
- i += strlen (entity->name) + 1;
-
- q = 0;
- }
- }
+ else if (*(buffer + i) == '&')
+ {
+ if (!strncmp(buffer + i, "&lt;", 4))
+ {
+ __nxml_string_add(ret, "<", 1);
+ i += 3;
+ q = 0;
+ }
+
+ else if (!strncmp(buffer + i, "&gt;", 4))
+ {
+ __nxml_string_add(ret, ">", 1);
+ i += 3;
+ q = 0;
+ }
+
+ else if (!strncmp(buffer + i, "&amp;", 5))
+ {
+ __nxml_string_add(ret, "&", 1);
+ i += 4;
+ q = 0;
+ }
+
+ else if (!strncmp(buffer + i, "&apos;", 6))
+ {
+ __nxml_string_add(ret, "'", 1);
+ i += 5;
+ q = 0;
+ }
+
+ else if (!strncmp(buffer + i, "&quot;", 6))
+ {
+ __nxml_string_add(ret, "\"", 1);
+ i += 5;
+ q = 0;
+ }
+
+ else if (*(buffer + i + 1) == '#')
+ {
+ char buf[2048];
+ int k = i;
+ int last;
+
+ while (*(buffer + k) != ';' && k < size)
+ k++;
+
+ last = k - (i + 2) > sizeof(buf) ? sizeof(buf) : k - (i + 2);
+ strncpy(buf, buffer + i + 2, last);
+ buf[last] = 0;
+
+ int value;
+ if (buf[0] != 'x')
+ value = atoi(buf);
+ else
+ value = __nxml_atoi(&buf[1]);
+
+ int num_bytes;
+ if ((num_bytes = __nxml_int_charset(value, (unsigned char *)buf, doc->encoding)) > 0)
+ {
+ __nxml_string_add(ret, buf, num_bytes);
+ }
+ else
+ __nxml_string_add(ret, buffer + i, 1);
+ i += k - i;
+ q = 0;
+ }
+
+ else
+ {
+ __nxml_entity_t *entity;
+ char buf[1024];
+ int k = i;
+ int last;
+
+ while (*(buffer + k) != ';' && k < size)
+ k++;
+
+ last = k - (i + 1) > sizeof(buf) ? sizeof(buf) : k - (i + 1);
+ strncpy(buf, buffer + i + 1, last);
+ buf[last] = 0;
+
+ for (entity = doc->priv.entities; entity; entity = entity->next)
+ {
+ if (!strcmp(entity->name, buf))
+ {
+ __nxml_string_add(ret, entity->entity,
+ strlen(entity->entity));
+ break;
+ }
+ }
+
+ if (!entity)
+ __nxml_string_add(ret, buffer + i, 1);
+ else
+ i += strlen(entity->name) + 1;
+
+ q = 0;
+ }
+ }
- else
- {
- q = 0;
- __nxml_string_add (ret, buffer + i, 1);
+ else
+ {
+ q = 0;
+ __nxml_string_add(ret, buffer + i, 1);
+ }
}
- }
- if (!(real = __nxml_string_free (ret)))
- real = strdup ("");
+ if (!(real = __nxml_string_free(ret)))
+ real = strdup("");
- return real;
+ return real;
}
static char *
-__nxml_parse_get_attr (nxml_t * doc, char **buffer, size_t * size)
+__nxml_parse_get_attr(nxml_t *doc, char **buffer, size_t *size)
{
- char attr[1024];
- int i;
- int byte;
- int64_t ch;
+ char attr[1024];
+ int i;
+ int byte;
+ int64_t ch;
- if (!*size)
- return NULL;
+ if (!*size)
+ return NULL;
- if (!__NXML_NAMESTARTCHARS)
- return NULL;
+ if (!__NXML_NAMESTARTCHARS)
+ return NULL;
- memcpy (&attr[0], *buffer, byte);
+ memcpy(&attr[0], *buffer, byte);
- i = byte;
- (*buffer) += byte;
- (*size) -= byte;
+ i = byte;
+ (*buffer) += byte;
+ (*size) -= byte;
- while (__NXML_NAMECHARS && *size && i < sizeof (attr) - 1)
- {
- memcpy (&attr[i], *buffer, byte);
+ while (__NXML_NAMECHARS && *size && i < sizeof(attr) - 1)
+ {
+ memcpy(&attr[i], *buffer, byte);
- i += byte;
- (*buffer) += byte;
- (*size) -= byte;
- }
+ i += byte;
+ (*buffer) += byte;
+ (*size) -= byte;
+ }
- if (**buffer != 0x20 && **buffer != 0x9 && **buffer != 0xa
- && **buffer != 0xd && **buffer != '=')
- {
- (*buffer) -= i;
- (*size) += i;
- return NULL;
- }
+ if (**buffer != 0x20 && **buffer != 0x9 && **buffer != 0xa && **buffer != 0xd && **buffer != '=')
+ {
+ (*buffer) -= i;
+ (*size) += i;
+ return NULL;
+ }
- i += __nxml_escape_spaces (doc, buffer, size);
+ i += __nxml_escape_spaces(doc, buffer, size);
- if (**buffer != '=')
- {
- (*buffer) -= i;
- (*size) += i;
- return NULL;
- }
+ if (**buffer != '=')
+ {
+ (*buffer) -= i;
+ (*size) += i;
+ return NULL;
+ }
- (*buffer)++;
- (*size)--;
+ (*buffer)++;
+ (*size)--;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- attr[i] = 0;
- return strdup (attr);
+ attr[i] = 0;
+ return strdup(attr);
}
static nxml_error_t
-__nxml_parse_get_attribute (nxml_t * doc, char **buffer, size_t * size,
- nxml_attr_t ** attr)
+__nxml_parse_get_attribute(nxml_t *doc, char **buffer, size_t *size,
+ nxml_attr_t **attr)
{
- /*
+ /*
* Rule [41] - Attribute ::= Name Eq AttValue
* Rule [25] - Eq ::= S? '=' S?
* Rule [5] - Name ::= NameStartChar (NameChar)*
@@ -246,117 +242,117 @@ __nxml_parse_get_attribute (nxml_t * doc, char **buffer, size_t * size,
* Rule [10] - AttValue ::= '"' ([^<&"] | Reference)* '"' |
* "'" ([^<&'] | Reference)* "'"
*/
- char *tag, *value, *v;
+ char *tag, *value, *v;
- if (!*size)
- return NXML_OK;
+ if (!*size)
+ return NXML_OK;
- *attr = NULL;
+ *attr = NULL;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (!(tag = __nxml_parse_get_attr (doc, buffer, size)))
- return NXML_OK;
+ if (!(tag = __nxml_parse_get_attr(doc, buffer, size)))
+ return NXML_OK;
- if (!(value = __nxml_get_value (doc, buffer, size)))
- {
- free (tag);
+ if (!(value = __nxml_get_value(doc, buffer, size)))
+ {
+ free(tag);
- if (doc->priv.func)
- doc->priv.func ("%s: expected value of attribute (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ if (doc->priv.func)
+ doc->priv.func("%s: expected value of attribute (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
+ return NXML_ERR_PARSER;
+ }
- if (!(v = __nxml_parse_string (doc, value, strlen (value))))
- {
- free (tag);
- return NXML_ERR_POSIX;
- }
+ if (!(v = __nxml_parse_string(doc, value, strlen(value))))
+ {
+ free(tag);
+ return NXML_ERR_POSIX;
+ }
- free (value);
- value = v;
+ free(value);
+ value = v;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (!(*attr = (nxml_attr_t *) calloc (1, sizeof (nxml_attr_t))))
- {
- free (tag);
- free (value);
+ if (!(*attr = (nxml_attr_t *)calloc(1, sizeof(nxml_attr_t))))
+ {
+ free(tag);
+ free(value);
- return NXML_ERR_POSIX;
- }
+ return NXML_ERR_POSIX;
+ }
- (*attr)->name = tag;
- (*attr)->value = value;
+ (*attr)->name = tag;
+ (*attr)->value = value;
- return NXML_OK;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_cdata (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data)
+__nxml_parse_cdata(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data)
{
- /*
- * Rule [18] - CDSect ::= CDStart CData CDEnd
+ /*
+ * Rule [18] - CDSect ::= CDStart CData CDEnd
* Rule [19] - CDStart ::= '<![CDATA['
* Rule [20] - CData ::= (Char * - (Char * ']]>' Char *))
* Rule [21] - CDEnd ::= ']]>'
*/
- int i = 0;
- nxml_data_t *t;
- char *value;
+ int i = 0;
+ nxml_data_t *t;
+ char *value;
- while (i < *size)
- {
- if (!strncmp (*buffer + i, "]]>", 3))
- break;
+ while (i < *size)
+ {
+ if (!strncmp(*buffer + i, "]]>", 3))
+ break;
- if (*(*buffer + i) == 0xa && doc->priv.func)
- doc->priv.line++;
+ if (*(*buffer + i) == 0xa && doc->priv.func)
+ doc->priv.line++;
- i++;
- }
+ i++;
+ }
- if (strncmp (*buffer + i, "]]>", 3))
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected ']]>' as close of a CDATA (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
+ if (strncmp(*buffer + i, "]]>", 3))
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected ']]>' as close of a CDATA (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ return NXML_ERR_PARSER;
+ }
- if (!(t = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
+ if (!(t = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
- t->doc = doc;
+ t->doc = doc;
- if (!(value = (char *) malloc (sizeof (char) * (i + 1))))
- {
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!(value = (char *)malloc(sizeof(char) * (i + 1))))
+ {
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- strncpy (value, *buffer, i);
- value[i] = 0;
+ strncpy(value, *buffer, i);
+ value[i] = 0;
- t->value = value;
- t->type = NXML_TYPE_TEXT;
+ t->value = value;
+ t->type = NXML_TYPE_TEXT;
- (*buffer) += i + 3;
- (*size) -= i + 3;
+ (*buffer) += i + 3;
+ (*size) -= i + 3;
- *data = t;
+ *data = t;
- return NXML_OK;
+ return NXML_OK;
}
static void
-__nxml_parse_entity (nxml_t * doc, char **buffer, size_t * size)
+__nxml_parse_entity(nxml_t *doc, char **buffer, size_t *size)
{
- /*
+ /*
* [70] EntityDecl ::= GEDecl | PEDecl
* [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
* [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
@@ -364,1132 +360,1123 @@ __nxml_parse_entity (nxml_t * doc, char **buffer, size_t * size)
* [74] PEDef ::= EntityValue | ExternalID
*/
- int i;
- char name[1024];
- char *entity;
- int byte;
- int64_t ch;
+ int i;
+ char name[1024];
+ char *entity;
+ int byte;
+ int64_t ch;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (strncmp (*buffer, "<!ENTITY", 8))
- {
- int q = i = 0;
-
- while ((*(*buffer + i) != '>' || q) && i < *size)
+ if (strncmp(*buffer, "<!ENTITY", 8))
{
- if (*(*buffer + i) == '<')
- q++;
+ int q = i = 0;
- else if (*(*buffer + i) == '>')
- q--;
+ while ((*(*buffer + i) != '>' || q) && i < *size)
+ {
+ if (*(*buffer + i) == '<')
+ q++;
- i++;
- }
+ else if (*(*buffer + i) == '>')
+ q--;
- if (*(*buffer) == '>')
- i++;
+ i++;
+ }
- (*buffer) += i;
- (*size) -= i;
- return;
- }
+ if (*(*buffer) == '>')
+ i++;
- *buffer += 8;
- *size -= 8;
+ (*buffer) += i;
+ (*size) -= i;
+ return;
+ }
- __nxml_escape_spaces (doc, buffer, size);
+ *buffer += 8;
+ *size -= 8;
- /* Name */
- if (!__NXML_NAMESTARTCHARS)
- {
- int q = i = 0;
+ __nxml_escape_spaces(doc, buffer, size);
- while ((*(*buffer + i) != '>' || q) && i < *size)
+ /* Name */
+ if (!__NXML_NAMESTARTCHARS)
{
- if (*(*buffer + i) == '<')
- q++;
+ int q = i = 0;
- else if (*(*buffer + i) == '>')
- q--;
+ while ((*(*buffer + i) != '>' || q) && i < *size)
+ {
+ if (*(*buffer + i) == '<')
+ q++;
- i++;
- }
+ else if (*(*buffer + i) == '>')
+ q--;
- if (*(*buffer) == '>')
- i++;
+ i++;
+ }
- (*buffer) += i;
- (*size) -= i;
- return;
- }
+ if (*(*buffer) == '>')
+ i++;
- memcpy (&name[0], *buffer, byte);
+ (*buffer) += i;
+ (*size) -= i;
+ return;
+ }
- i = byte;
- (*buffer) += byte;
- (*size) -= byte;
+ memcpy(&name[0], *buffer, byte);
- while (__NXML_NAMECHARS && *size && i < sizeof (name) - 1)
- {
- memcpy (&name[i], *buffer, byte);
+ i = byte;
+ (*buffer) += byte;
+ (*size) -= byte;
- i += byte;
- (*buffer) += byte;
- (*size) -= byte;
- }
+ while (__NXML_NAMECHARS && *size && i < sizeof(name) - 1)
+ {
+ memcpy(&name[i], *buffer, byte);
- name[i] = 0;
+ i += byte;
+ (*buffer) += byte;
+ (*size) -= byte;
+ }
- if (!i || !strcmp (name, "%"))
- {
- int q = i = 0;
+ name[i] = 0;
- while ((*(*buffer + i) != '>' || q) && i < *size)
+ if (!i || !strcmp(name, "%"))
{
- if (*(*buffer + i) == '<')
- q++;
-
- else if (*(*buffer + i) == '>')
- q--;
+ int q = i = 0;
- i++;
- }
+ while ((*(*buffer + i) != '>' || q) && i < *size)
+ {
+ if (*(*buffer + i) == '<')
+ q++;
- if (*(*buffer) == '>')
- i++;
+ else if (*(*buffer + i) == '>')
+ q--;
- (*buffer) += i;
- (*size) -= i;
- return;
- }
+ i++;
+ }
- __nxml_escape_spaces (doc, buffer, size);
+ if (*(*buffer) == '>')
+ i++;
- entity = __nxml_get_value (doc, buffer, size);
+ (*buffer) += i;
+ (*size) -= i;
+ return;
+ }
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (**buffer == '>')
- {
- (*buffer)++;
- (*size)--;
- }
+ entity = __nxml_get_value(doc, buffer, size);
- if (entity)
- {
- __nxml_entity_t *e;
+ __nxml_escape_spaces(doc, buffer, size);
- if (!(e = calloc (1, sizeof (__nxml_entity_t))))
+ if (**buffer == '>')
{
- free (entity);
- return;
+ (*buffer)++;
+ (*size)--;
}
- if (!(e->name = strdup (name)))
+ if (entity)
{
- free (e);
- free (entity);
- return;
- }
+ __nxml_entity_t *e;
- e->entity = entity;
+ if (!(e = calloc(1, sizeof(__nxml_entity_t))))
+ {
+ free(entity);
+ return;
+ }
- if (!doc->priv.entities)
- doc->priv.entities = e;
- else
- {
- __nxml_entity_t *tmp = doc->priv.entities;
+ if (!(e->name = strdup(name)))
+ {
+ free(e);
+ free(entity);
+ return;
+ }
+
+ e->entity = entity;
+
+ if (!doc->priv.entities)
+ doc->priv.entities = e;
+ else
+ {
+ __nxml_entity_t *tmp = doc->priv.entities;
- while (tmp->next)
- tmp = tmp->next;
+ while (tmp->next)
+ tmp = tmp->next;
- tmp->next = e;
+ tmp->next = e;
+ }
}
- }
}
static nxml_error_t
-__nxml_parse_doctype (nxml_t * doc, char **buffer, size_t * size,
- int *doctype)
+__nxml_parse_doctype(nxml_t *doc, char **buffer, size_t *size,
+ int *doctype)
{
- /*
- * Rule [28] - doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S?
+ /*
+ * Rule [28] - doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S?
* ('[' intSubset '] S?)? '>'
*/
- nxml_doctype_t *t;
- nxml_doctype_t *tmp;
- char str[1024];
- char *value;
- int i;
- int byte;
- int64_t ch;
- int q = 0;
+ nxml_doctype_t *t;
+ nxml_doctype_t *tmp;
+ char str[1024];
+ char *value;
+ int i;
+ int byte;
+ int64_t ch;
+ int q = 0;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (!__NXML_NAMESTARTCHARS)
- {
- if (doc->priv.func)
- doc->priv.func ("%s: abnormal char '%c' (line %d)\n",
- doc->file ? doc->file : "", **buffer, doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ if (!__NXML_NAMESTARTCHARS)
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: abnormal char '%c' (line %d)\n",
+ doc->file ? doc->file : "", **buffer, doc->priv.line);
+ return NXML_ERR_PARSER;
+ }
- memcpy (&str[0], *buffer, byte);
+ memcpy(&str[0], *buffer, byte);
- i = byte;
- (*buffer) += byte;
- (*size) -= byte;
+ i = byte;
+ (*buffer) += byte;
+ (*size) -= byte;
- while (__NXML_NAMECHARS && *size && i < sizeof (str) - 1)
- {
- memcpy (&str[i], *buffer, byte);
+ while (__NXML_NAMECHARS && *size && i < sizeof(str) - 1)
+ {
+ memcpy(&str[i], *buffer, byte);
- i += byte;
- (*buffer) += byte;
- (*size) -= byte;
- }
+ i += byte;
+ (*buffer) += byte;
+ (*size) -= byte;
+ }
- str[i] = 0;
+ str[i] = 0;
- if (!(t = (nxml_doctype_t *) calloc (1, sizeof (nxml_doctype_t))))
- return NXML_ERR_POSIX;
+ if (!(t = (nxml_doctype_t *)calloc(1, sizeof(nxml_doctype_t))))
+ return NXML_ERR_POSIX;
- t->doc = doc;
+ t->doc = doc;
- if (!(t->name = strdup (str)))
- {
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!(t->name = strdup(str)))
+ {
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- i = 0;
- while ((*(*buffer + i) != '>' || q) && i < *size)
- {
- if (*(*buffer + i) == '<')
- q++;
+ i = 0;
+ while ((*(*buffer + i) != '>' || q) && i < *size)
+ {
+ if (*(*buffer + i) == '<')
+ q++;
- else if (*(*buffer + i) == '>')
- q--;
+ else if (*(*buffer + i) == '>')
+ q--;
- if (*(*buffer + i) == 0xa && doc->priv.func)
- doc->priv.line++;
+ if (*(*buffer + i) == 0xa && doc->priv.func)
+ doc->priv.line++;
- i++;
- }
+ i++;
+ }
- if (*(*buffer + i) != '>')
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected '>' as close of a doctype (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
+ if (*(*buffer + i) != '>')
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected '>' as close of a doctype (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
- free (t->value);
- free (t);
- return NXML_ERR_PARSER;
- }
+ free(t->value);
+ free(t);
+ return NXML_ERR_PARSER;
+ }
- if (!(value = __nxml_parse_string (doc, *buffer, i)))
- {
- free (t->value);
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!(value = __nxml_parse_string(doc, *buffer, i)))
+ {
+ free(t->value);
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- t->value = value;
+ t->value = value;
- (*buffer) += i + 1;
- (*size) -= i + 1;
+ (*buffer) += i + 1;
+ (*size) -= i + 1;
- tmp = doc->doctype;
- if (!tmp)
- doc->doctype = t;
+ tmp = doc->doctype;
+ if (!tmp)
+ doc->doctype = t;
- else
- {
- while (tmp->next)
- tmp = tmp->next;
+ else
+ {
+ while (tmp->next)
+ tmp = tmp->next;
- tmp->next = t;
- }
+ tmp->next = t;
+ }
- *doctype = 1;
+ *doctype = 1;
- while (value && *value && *value != '[')
- value++;
+ while (value && *value && *value != '[')
+ value++;
- if (value && *value == '[')
- {
- unsigned int size;
+ if (value && *value == '[')
+ {
+ unsigned int size;
- value++;
- size = strlen (value);
+ value++;
+ size = strlen(value);
- while (size > 0 && value && *value)
- __nxml_parse_entity (doc, &value, (size_t *) & size);
- }
+ while (size > 0 && value && *value)
+ __nxml_parse_entity(doc, &value, (size_t *)&size);
+ }
- return NXML_OK;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_comment (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data)
+__nxml_parse_comment(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data)
{
- /*
+ /*
* Rule [15] - Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
*/
- int i = 0;
- nxml_data_t *t;
- char *value;
+ int i = 0;
+ nxml_data_t *t;
+ char *value;
- while (strncmp (*buffer + i, "-->", 3) && i < *size)
- {
- if (*(*buffer + i) == 0xa && doc->priv.func)
- doc->priv.line++;
- i++;
- }
+ while (strncmp(*buffer + i, "-->", 3) && i < *size)
+ {
+ if (*(*buffer + i) == 0xa && doc->priv.func)
+ doc->priv.line++;
+ i++;
+ }
- if (strncmp (*buffer + i, "-->", 3))
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected '--' as close comment (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
+ if (strncmp(*buffer + i, "-->", 3))
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected '--' as close comment (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ return NXML_ERR_PARSER;
+ }
- if (!(t = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
+ if (!(t = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
- t->doc = doc;
+ t->doc = doc;
- if (!(value = __nxml_parse_string (doc, *buffer, i)))
- {
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!(value = __nxml_parse_string(doc, *buffer, i)))
+ {
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- t->value = value;
+ t->value = value;
- (*buffer) += i + 3;
- (*size) -= i + 3;
+ (*buffer) += i + 3;
+ (*size) -= i + 3;
- t->type = NXML_TYPE_COMMENT;
+ t->type = NXML_TYPE_COMMENT;
- *data = t;
+ *data = t;
- return NXML_OK;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_pi (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data)
+__nxml_parse_pi(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data)
{
- /*
- * Rule [16] - PI ::= '<?' PITarget (S (Char * - (Char * '?>' Char *)))?
+ /*
+ * Rule [16] - PI ::= '<?' PITarget (S (Char * - (Char * '?>' Char *)))?
* '?>'
* Rule [17] - PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
*/
- int i = 0;
- nxml_data_t *t;
- char *value;
+ int i = 0;
+ nxml_data_t *t;
+ char *value;
- if (!*size)
- return NXML_OK;
+ if (!*size)
+ return NXML_OK;
- *data = NULL;
+ *data = NULL;
- (*buffer) += 1;
- (*size) -= 1;
+ (*buffer) += 1;
+ (*size) -= 1;
- while (strncmp (*buffer + i, "?>", 2) && i < *size)
- {
- if (*(*buffer + i) == 0xa && doc->priv.func)
- doc->priv.line++;
- i++;
- }
+ while (strncmp(*buffer + i, "?>", 2) && i < *size)
+ {
+ if (*(*buffer + i) == 0xa && doc->priv.func)
+ doc->priv.line++;
+ i++;
+ }
- if (strncmp (*buffer + i, "?>", 2))
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected '?' as close pi tag (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
+ if (strncmp(*buffer + i, "?>", 2))
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected '?' as close pi tag (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ return NXML_ERR_PARSER;
+ }
- if (!strncasecmp (*buffer, "?xml", 4))
- {
- if (doc->priv.func)
- doc->priv.func ("%s: pi xml is reserved! (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
+ if (!strncasecmp(*buffer, "?xml", 4))
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: pi xml is reserved! (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ return NXML_ERR_PARSER;
+ }
- if (!(t = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
+ if (!(t = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
- t->doc = doc;
+ t->doc = doc;
- if (!(value = __nxml_parse_string (doc, *buffer, i)))
- {
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!(value = __nxml_parse_string(doc, *buffer, i)))
+ {
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- t->value = value;
+ t->value = value;
- (*buffer) += i + 2;
- (*size) -= i + 2;
+ (*buffer) += i + 2;
+ (*size) -= i + 2;
- t->type = NXML_TYPE_PI;
+ t->type = NXML_TYPE_PI;
- *data = t;
+ *data = t;
- return NXML_OK;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_other (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data, int *doctype)
+__nxml_parse_other(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data, int *doctype)
{
- /* Tags '<!'... */
+ /* Tags '<!'... */
- *data = NULL;
- *doctype = 0;
+ *data = NULL;
+ *doctype = 0;
- if (!*size)
- return NXML_OK;
+ if (!*size)
+ return NXML_OK;
- (*buffer) += 1;
- (*size) -= 1;
+ (*buffer) += 1;
+ (*size) -= 1;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (!strncmp (*buffer, "[CDATA[", 7))
- {
- (*buffer) += 7;
- (*size) -= 7;
+ if (!strncmp(*buffer, "[CDATA[", 7))
+ {
+ (*buffer) += 7;
+ (*size) -= 7;
- return __nxml_parse_cdata (doc, buffer, size, data);
- }
+ return __nxml_parse_cdata(doc, buffer, size, data);
+ }
- else if (!strncmp (*buffer, "--", 2))
- {
- (*buffer) += 2;
- (*size) -= 2;
+ else if (!strncmp(*buffer, "--", 2))
+ {
+ (*buffer) += 2;
+ (*size) -= 2;
- return __nxml_parse_comment (doc, buffer, size, data);
- }
+ return __nxml_parse_comment(doc, buffer, size, data);
+ }
- else if (!strncmp (*buffer, "DOCTYPE", 7))
- {
- (*buffer) += 7;
- (*size) -= 7;
+ else if (!strncmp(*buffer, "DOCTYPE", 7))
+ {
+ (*buffer) += 7;
+ (*size) -= 7;
- return __nxml_parse_doctype (doc, buffer, size, doctype);
- }
+ return __nxml_parse_doctype(doc, buffer, size, doctype);
+ }
- else
- {
- if (doc->priv.func)
- doc->priv.func ("%s: abnormal tag (line %d)\n",
- doc->file ? doc->file : "", doc->priv.line);
+ else
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: abnormal tag (line %d)\n",
+ doc->file ? doc->file : "", doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ return NXML_ERR_PARSER;
+ }
}
static nxml_error_t
-__nxml_parse_text (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data)
+__nxml_parse_text(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data)
{
- int i = 0;
- nxml_data_t *t;
- char *value;
- char *value_new;
+ int i = 0;
+ nxml_data_t *t;
+ char *value;
+ char *value_new;
- *data = NULL;
+ *data = NULL;
- if (!*size)
- return NXML_OK;
+ if (!*size)
+ return NXML_OK;
- while (*(*buffer + i) != '<' && i < *size)
- {
- if (*(*buffer + i) == 0xa && doc->priv.func)
- doc->priv.line++;
- i++;
- }
+ while (*(*buffer + i) != '<' && i < *size)
+ {
+ if (*(*buffer + i) == 0xa && doc->priv.func)
+ doc->priv.line++;
+ i++;
+ }
- if (!(t = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
+ if (!(t = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
- t->doc = doc;
+ t->doc = doc;
- if (!(value = __nxml_parse_string (doc, *buffer, i)))
- {
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!(value = __nxml_parse_string(doc, *buffer, i)))
+ {
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- (*buffer) += i;
- (*size) -= i;
+ (*buffer) += i;
+ (*size) -= i;
- value_new = __nxml_trim (value);
- free (value);
+ value_new = __nxml_trim(value);
+ free(value);
- if (!value_new)
- {
- free (t);
- return NXML_ERR_POSIX;
- }
+ if (!value_new)
+ {
+ free(t);
+ return NXML_ERR_POSIX;
+ }
- t->value = value_new;
- t->type = NXML_TYPE_TEXT;
+ t->value = value_new;
+ t->type = NXML_TYPE_TEXT;
- *data = t;
+ *data = t;
- return NXML_OK;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_close (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data)
+__nxml_parse_close(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data)
{
- /*
+ /*
* Rule [42] - ETag ::= '</' Name S? '>'
*/
- nxml_data_t *tag;
- char str[1024];
- int i;
- int byte;
- int64_t ch;
+ nxml_data_t *tag;
+ char str[1024];
+ int i;
+ int byte;
+ int64_t ch;
- *data = NULL;
+ *data = NULL;
- if (!*size)
- return NXML_OK;
+ if (!*size)
+ return NXML_OK;
- if (!__NXML_NAMESTARTCHARS)
- {
- if (doc->priv.func)
- doc->priv.func ("%s: abnormal char '%c' (line %d)\n",
- doc->file ? doc->file : "", **buffer, doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ if (!__NXML_NAMESTARTCHARS)
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: abnormal char '%c' (line %d)\n",
+ doc->file ? doc->file : "", **buffer, doc->priv.line);
+ return NXML_ERR_PARSER;
+ }
- memcpy (&str[0], *buffer, byte);
+ memcpy(&str[0], *buffer, byte);
- i = byte;
- (*buffer) += byte;
- (*size) -= byte;
+ i = byte;
+ (*buffer) += byte;
+ (*size) -= byte;
- while (__NXML_NAMECHARS && *size && i < sizeof (str) - 1)
- {
- memcpy (&str[i], *buffer, byte);
+ while (__NXML_NAMECHARS && *size && i < sizeof(str) - 1)
+ {
+ memcpy(&str[i], *buffer, byte);
- i += byte;
- (*buffer) += byte;
- (*size) -= byte;
- }
+ i += byte;
+ (*buffer) += byte;
+ (*size) -= byte;
+ }
- str[i] = 0;
+ str[i] = 0;
- __nxml_escape_spaces (doc, buffer, size);
+ __nxml_escape_spaces(doc, buffer, size);
- if (**buffer != '>')
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected char '>' after tag %s (line %d)\n",
- doc->file ? doc->file : "", str, doc->priv.line);
- return NXML_ERR_PARSER;
- }
+ if (**buffer != '>')
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected char '>' after tag %s (line %d)\n",
+ doc->file ? doc->file : "", str, doc->priv.line);
+ return NXML_ERR_PARSER;
+ }
- (*buffer) += 1;
- (*size) -= 1;
+ (*buffer) += 1;
+ (*size) -= 1;
- if (!(tag = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
+ if (!(tag = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
- tag->doc = doc;
+ tag->doc = doc;
- if (!(tag->value = strdup (str)))
- {
- free (tag);
- return NXML_ERR_POSIX;
- }
+ if (!(tag->value = strdup(str)))
+ {
+ free(tag);
+ return NXML_ERR_POSIX;
+ }
- tag->type = NXML_TYPE_ELEMENT_CLOSE;
+ tag->type = NXML_TYPE_ELEMENT_CLOSE;
- *data = tag;
+ *data = tag;
- return NXML_OK;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_get_tag (nxml_t * doc, char **buffer, size_t * size,
- nxml_data_t ** data, int *doctype)
+__nxml_parse_get_tag(nxml_t *doc, char **buffer, size_t *size,
+ nxml_data_t **data, int *doctype)
{
- /* Parse the element... */
- nxml_attr_t *attr, *last;
- nxml_data_t *tag, *child, *child_last;
- nxml_error_t err;
-
- char str[1024];
- int i;
- int closed = 0;
- int byte;
- int64_t ch;
-
- *data = NULL;
- *doctype = 0;
-
- if (!*size)
- return NXML_OK;
-
- __nxml_escape_spaces (doc, buffer, size);
-
- /* Text */
- if (**buffer != '<')
- return __nxml_parse_text (doc, buffer, size, data);
-
- (*buffer) += 1;
- (*size) -= 1;
-
- /* Comment, CData, DocType or other elements */
- if (**buffer == '!')
- return __nxml_parse_other (doc, buffer, size, data, doctype);
-
- /* PI */
- else if (**buffer == '?')
- return __nxml_parse_pi (doc, buffer, size, data);
-
- /* Close tag */
- else if (**buffer == '/')
- {
- (*buffer) += 1;
- (*size) -= 1;
- return __nxml_parse_close (doc, buffer, size, data);
- }
-
- __nxml_escape_spaces (doc, buffer, size);
-
- if (!__NXML_NAMESTARTCHARS)
- {
- if (doc->priv.func)
- doc->priv.func ("%s: abnormal char '%c' (line %d)\n",
- doc->file ? doc->file : "", **buffer, doc->priv.line);
- return NXML_ERR_PARSER;
- }
-
- memcpy (&str[0], *buffer, byte);
-
- i = byte;
- (*buffer) += byte;
- (*size) -= byte;
-
- while (__NXML_NAMECHARS && *size && i < sizeof (str) - 1)
- {
- memcpy (&str[i], *buffer, byte);
-
- i += byte;
- (*buffer) += byte;
- (*size) -= byte;
- }
-
- str[i] = 0;
-
- if (**buffer != 0x20 && **buffer != 0x9 && **buffer != 0xa
- && **buffer != 0xd && **buffer != '>' && **buffer != '/')
- {
- (*buffer) -= i;
- (*size) += i;
-
- if (doc->priv.func)
- doc->priv.func ("%s: abnormal char '%c' after tag %s (line %d)\n",
- doc->file ? doc->file : "", *(*buffer + i), str,
- doc->priv.line);
-
- return NXML_ERR_PARSER;
- }
-
- if (!(tag = (nxml_data_t *) calloc (1, sizeof (nxml_data_t))))
- return NXML_ERR_POSIX;
-
- tag->doc = doc;
-
- if (!(tag->value = strdup (str)))
- {
- free (tag);
- return NXML_ERR_POSIX;
- }
-
- last = NULL;
-
- /* Get attribute: */
- while (!(err = __nxml_parse_get_attribute (doc, buffer, size, &attr))
- && attr)
- {
- if (!*size)
- return NXML_ERR_PARSER;
+ /* Parse the element... */
+ nxml_attr_t *attr, *last;
+ nxml_data_t *tag, *child, *child_last;
+ nxml_error_t err;
+
+ char str[1024];
+ int i;
+ int closed = 0;
+ int byte;
+ int64_t ch;
+
+ *data = NULL;
+ *doctype = 0;
+
+ if (!*size)
+ return NXML_OK;
- if (__nxml_parse_unique_attribute (tag->attributes, attr->name))
+ __nxml_escape_spaces(doc, buffer, size);
+
+ /* Text */
+ if (**buffer != '<')
+ return __nxml_parse_text(doc, buffer, size, data);
+
+ (*buffer) += 1;
+ (*size) -= 1;
+
+ /* Comment, CData, DocType or other elements */
+ if (**buffer == '!')
+ return __nxml_parse_other(doc, buffer, size, data, doctype);
+
+ /* PI */
+ else if (**buffer == '?')
+ return __nxml_parse_pi(doc, buffer, size, data);
+
+ /* Close tag */
+ else if (**buffer == '/')
{
- if (doc->priv.func)
- doc->priv.
- func ("%s: Duplicate attribute '%s' in tag '%s' (line %d)\n",
- doc->file ? doc->file : "", attr->name, tag->value,
- doc->priv.line);
+ (*buffer) += 1;
+ (*size) -= 1;
+ return __nxml_parse_close(doc, buffer, size, data);
+ }
- nxml_free_attribute (attr);
- nxml_free_data (tag);
+ __nxml_escape_spaces(doc, buffer, size);
- return NXML_ERR_PARSER;
+ if (!__NXML_NAMESTARTCHARS)
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: abnormal char '%c' (line %d)\n",
+ doc->file ? doc->file : "", **buffer, doc->priv.line);
+ return NXML_ERR_PARSER;
}
- if (last)
- last->next = attr;
- else
- tag->attributes = attr;
-
- last = attr;
- }
-
- if (err)
- {
- nxml_free_data (tag);
- return err;
- }
-
- /* Closed element */
- if (**buffer == '/')
- {
- closed++;
- (*buffer) += 1;
- (*size) -= 1;
-
- __nxml_escape_spaces (doc, buffer, size);
- }
-
- if (**buffer != '>')
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected char '>' after tag %s (line %d)\n",
- doc->file ? doc->file : "", tag->value,
- doc->priv.line);
-
- nxml_free_data (tag);
- return NXML_ERR_PARSER;
- }
-
- (*buffer) += 1;
- (*size) -= 1;
-
- if (!closed)
- {
- child_last = NULL;
-
- /* Search children: */
- while (!
- (err = __nxml_parse_get_tag (doc, buffer, size, &child, doctype))
- && (*doctype || child))
+ memcpy(&str[0], *buffer, byte);
+
+ i = byte;
+ (*buffer) += byte;
+ (*size) -= byte;
+
+ while (__NXML_NAMECHARS && *size && i < sizeof(str) - 1)
{
- if (*doctype)
- continue;
+ memcpy(&str[i], *buffer, byte);
- /* If the current child, break: */
- if (child->type == NXML_TYPE_ELEMENT_CLOSE)
- {
- if (!strcmp (child->value, tag->value))
- {
- closed = 1;
- nxml_free_data (child);
- break;
- }
+ i += byte;
+ (*buffer) += byte;
+ (*size) -= byte;
+ }
+
+ str[i] = 0;
- else
+ if (**buffer != 0x20 && **buffer != 0x9 && **buffer != 0xa && **buffer != 0xd && **buffer != '>' && **buffer != '/')
+ {
+ (*buffer) -= i;
+ (*size) += i;
+
+ if (doc->priv.func)
+ doc->priv.func("%s: abnormal char '%c' after tag %s (line %d)\n",
+ doc->file ? doc->file : "", *(*buffer + i), str,
+ doc->priv.line);
+
+ return NXML_ERR_PARSER;
+ }
+
+ if (!(tag = (nxml_data_t *)calloc(1, sizeof(nxml_data_t))))
+ return NXML_ERR_POSIX;
+
+ tag->doc = doc;
+
+ if (!(tag->value = strdup(str)))
+ {
+ free(tag);
+ return NXML_ERR_POSIX;
+ }
+
+ last = NULL;
+
+ /* Get attribute: */
+ while (!(err = __nxml_parse_get_attribute(doc, buffer, size, &attr)) && attr)
+ {
+ if (!*size)
+ return NXML_ERR_PARSER;
+
+ if (__nxml_parse_unique_attribute(tag->attributes, attr->name))
{
- if (doc->priv.func)
- doc->priv.
- func ("%s: expected tag '/%s' and not '%s' (line %d)\n",
- doc->file ? doc->file : "", tag->value,
- child->value, doc->priv.line);
+ if (doc->priv.func)
+ doc->priv.func("%s: Duplicate attribute '%s' in tag '%s' (line %d)\n",
+ doc->file ? doc->file : "", attr->name, tag->value,
+ doc->priv.line);
- nxml_free_data (child);
- nxml_free_data (tag);
+ nxml_free_attribute(attr);
+ nxml_free_data(tag);
- return NXML_ERR_PARSER;
+ return NXML_ERR_PARSER;
}
- }
- /* Set the parent */
- child->parent = tag;
+ if (last)
+ last->next = attr;
+ else
+ tag->attributes = attr;
- if (child_last)
- child_last->next = child;
- else
- tag->children = child;
+ last = attr;
+ }
+
+ if (err)
+ {
+ nxml_free_data(tag);
+ return err;
+ }
+
+ /* Closed element */
+ if (**buffer == '/')
+ {
+ closed++;
+ (*buffer) += 1;
+ (*size) -= 1;
- child_last = child;
+ __nxml_escape_spaces(doc, buffer, size);
}
- if (err)
+ if (**buffer != '>')
{
- nxml_free_data (tag);
- return err;
+ if (doc->priv.func)
+ doc->priv.func("%s: expected char '>' after tag %s (line %d)\n",
+ doc->file ? doc->file : "", tag->value,
+ doc->priv.line);
+
+ nxml_free_data(tag);
+ return NXML_ERR_PARSER;
}
- }
- tag->type = NXML_TYPE_ELEMENT;
+ (*buffer) += 1;
+ (*size) -= 1;
- if (!closed)
- {
- if (doc->priv.func)
- doc->priv.func ("%s: expected tag '/%s' (line %d)\n",
- doc->file ? doc->file : "", tag->value,
- doc->priv.line);
+ if (!closed)
+ {
+ child_last = NULL;
- nxml_free_data (tag);
- return NXML_ERR_PARSER;
- }
+ /* Search children: */
+ while (!(err = __nxml_parse_get_tag(doc, buffer, size, &child, doctype)) && (*doctype || child))
+ {
+ if (*doctype)
+ continue;
+
+ /* If the current child, break: */
+ if (child->type == NXML_TYPE_ELEMENT_CLOSE)
+ {
+ if (!strcmp(child->value, tag->value))
+ {
+ closed = 1;
+ nxml_free_data(child);
+ break;
+ }
+
+ else
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected tag '/%s' and not '%s' (line %d)\n",
+ doc->file ? doc->file : "", tag->value,
+ child->value, doc->priv.line);
+
+ nxml_free_data(child);
+ nxml_free_data(tag);
+
+ return NXML_ERR_PARSER;
+ }
+ }
+
+ /* Set the parent */
+ child->parent = tag;
+
+ if (child_last)
+ child_last->next = child;
+ else
+ tag->children = child;
+
+ child_last = child;
+ }
- *data = tag;
- return NXML_OK;
+ if (err)
+ {
+ nxml_free_data(tag);
+ return err;
+ }
+ }
+
+ tag->type = NXML_TYPE_ELEMENT;
+
+ if (!closed)
+ {
+ if (doc->priv.func)
+ doc->priv.func("%s: expected tag '/%s' (line %d)\n",
+ doc->file ? doc->file : "", tag->value,
+ doc->priv.line);
+
+ nxml_free_data(tag);
+ return NXML_ERR_PARSER;
+ }
+
+ *data = tag;
+ return NXML_OK;
}
static nxml_error_t
-__nxml_parse_buffer (nxml_t * nxml, char *r_buffer, size_t r_size)
+__nxml_parse_buffer(nxml_t *nxml, char *r_buffer, size_t r_size)
{
- /*
+ /*
* Rule [1] - Document ::= prolog element Misc* - Char* RestrictedChar Char*
*/
- nxml_attr_t *attr;
- nxml_error_t err;
- nxml_charset_t charset;
- nxml_data_t *tag, *last, *root;
- int doctype;
+ nxml_attr_t *attr;
+ nxml_error_t err;
+ nxml_charset_t charset;
+ nxml_data_t *tag, *last, *root;
+ int doctype;
- int freed;
+ int freed;
- char *buffer = NULL;
- size_t size;
+ char *buffer = NULL;
+ size_t size;
- if (!r_buffer || !nxml)
- return NXML_ERR_DATA;
+ if (!r_buffer || !nxml)
+ return NXML_ERR_DATA;
- if (!r_size)
- r_size = strlen (r_buffer);
+ if (!r_size)
+ r_size = strlen(r_buffer);
- switch ((freed =
- __nxml_utf_detection (r_buffer, r_size, &buffer, &size, &charset)))
- {
- case 0:
- buffer = r_buffer;
- size = r_size;
- break;
+ switch ((freed =
+ __nxml_utf_detection(r_buffer, r_size, &buffer, &size, &charset)))
+ {
+ case 0:
+ buffer = r_buffer;
+ size = r_size;
+ break;
- case -1:
- return NXML_ERR_POSIX;
- }
+ case -1:
+ return NXML_ERR_POSIX;
+ }
- nxml->priv.line = 1;
- nxml->version = NXML_VERSION_1_0;
- nxml->standalone = 1;
+ nxml->priv.line = 1;
+ nxml->version = NXML_VERSION_1_0;
+ nxml->standalone = 1;
- /*
+ /*
* Rule [22] - prolog ::= XMLDecl Misc* (doctypedecl Misc*)?
* Rule [23] - XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
*/
- if (!strncmp (buffer, "<?xml ", 6))
- {
- buffer += 6;
- size -= 6;
-
- if ((err =
- __nxml_parse_get_attribute (nxml, &buffer, &size,
- &attr)) != NXML_OK)
+ if (!strncmp(buffer, "<?xml ", 6))
{
- nxml_empty (nxml);
+ buffer += 6;
+ size -= 6;
- if (freed)
- free (buffer);
+ if ((err =
+ __nxml_parse_get_attribute(nxml, &buffer, &size,
+ &attr)) != NXML_OK)
+ {
+ nxml_empty(nxml);
- return err;
- }
+ if (freed)
+ free(buffer);
- if (!attr)
- {
- if (nxml->priv.func)
- nxml->priv.func ("%s: expected 'version' attribute (line %d)\n",
- nxml->file ? nxml->file : "", nxml->priv.line);
+ return err;
+ }
- if (freed)
- free (buffer);
+ if (!attr)
+ {
+ if (nxml->priv.func)
+ nxml->priv.func("%s: expected 'version' attribute (line %d)\n",
+ nxml->file ? nxml->file : "", nxml->priv.line);
- return NXML_ERR_PARSER;
- }
+ if (freed)
+ free(buffer);
- if (!strcmp (attr->value, "1.0"))
- nxml->version = NXML_VERSION_1_0;
+ return NXML_ERR_PARSER;
+ }
- else if (!strcmp (attr->value, "1.1"))
- nxml->version = NXML_VERSION_1_1;
+ if (!strcmp(attr->value, "1.0"))
+ nxml->version = NXML_VERSION_1_0;
- else
- {
- if (nxml->priv.func)
- nxml->priv.
- func ("libnxml 0.18.3 suports only xml 1.1 or 1.0 (line %d)\n",
- nxml->priv.line);
+ else if (!strcmp(attr->value, "1.1"))
+ nxml->version = NXML_VERSION_1_1;
- if (freed)
- free (buffer);
+ else
+ {
+ if (nxml->priv.func)
+ nxml->priv.func("libnxml 0.18.3 suports only xml 1.1 or 1.0 (line %d)\n",
+ nxml->priv.line);
- return NXML_ERR_PARSER;
- }
+ if (freed)
+ free(buffer);
- nxml_free_attribute (attr);
+ return NXML_ERR_PARSER;
+ }
- while (!(err = __nxml_parse_get_attribute (nxml, &buffer, &size, &attr))
- && attr)
- {
- if (!strcmp (attr->name, "standalone"))
- {
- if (!strcmp (attr->value, "yes"))
- nxml->standalone = 1;
+ nxml_free_attribute(attr);
- else
- nxml->standalone = 0;
- }
+ while (!(err = __nxml_parse_get_attribute(nxml, &buffer, &size, &attr)) && attr)
+ {
+ if (!strcmp(attr->name, "standalone"))
+ {
+ if (!strcmp(attr->value, "yes"))
+ nxml->standalone = 1;
- else if (!strcmp (attr->name, "encoding"))
- {
- nxml->encoding = strdup (attr->value);
+ else
+ nxml->standalone = 0;
+ }
- if (!nxml->encoding)
- {
- nxml_empty (nxml);
- nxml_free_attribute (attr);
+ else if (!strcmp(attr->name, "encoding"))
+ {
+ nxml->encoding = strdup(attr->value);
- if (freed)
- free (buffer);
+ if (!nxml->encoding)
+ {
+ nxml_empty(nxml);
+ nxml_free_attribute(attr);
- return NXML_ERR_POSIX;
- }
- }
+ if (freed)
+ free(buffer);
- else
- {
+ return NXML_ERR_POSIX;
+ }
+ }
- if (nxml->priv.func)
- nxml->priv.func ("%s: unexpected attribute '%s' (line %d)\n",
- nxml->file ? nxml->file : "", attr->name,
- nxml->priv.line);
+ else
+ {
- nxml_empty (nxml);
- nxml_free_attribute (attr);
+ if (nxml->priv.func)
+ nxml->priv.func("%s: unexpected attribute '%s' (line %d)\n",
+ nxml->file ? nxml->file : "", attr->name,
+ nxml->priv.line);
- if (freed)
- free (buffer);
+ nxml_empty(nxml);
+ nxml_free_attribute(attr);
- return NXML_ERR_PARSER;
- }
+ if (freed)
+ free(buffer);
- nxml_free_attribute (attr);
- }
+ return NXML_ERR_PARSER;
+ }
- if (err || strncmp (buffer, "?>", 2))
- {
- if (nxml->priv.func)
- nxml->priv.func ("%s expected '?>' (line %d)\n",
- nxml->file ? nxml->file : "", nxml->priv.line);
+ nxml_free_attribute(attr);
+ }
- nxml_empty (nxml);
+ if (err || strncmp(buffer, "?>", 2))
+ {
+ if (nxml->priv.func)
+ nxml->priv.func("%s expected '?>' (line %d)\n",
+ nxml->file ? nxml->file : "", nxml->priv.line);
- if (freed)
- free (buffer);
+ nxml_empty(nxml);
- return NXML_ERR_PARSER;
- }
+ if (freed)
+ free(buffer);
- buffer += 2;
- size -= 2;
- }
+ return NXML_ERR_PARSER;
+ }
- root = last = NULL;
- while (!(err = __nxml_parse_get_tag (nxml, &buffer, &size, &tag, &doctype))
- && (doctype || tag))
- {
- if (doctype)
- continue;
+ buffer += 2;
+ size -= 2;
+ }
- if (tag->type == NXML_TYPE_ELEMENT && !root)
- root = tag;
+ root = last = NULL;
+ while (!(err = __nxml_parse_get_tag(nxml, &buffer, &size, &tag, &doctype)) && (doctype || tag))
+ {
+ if (doctype)
+ continue;
- if (last)
- last->next = tag;
- else
- nxml->data = tag;
+ if (tag->type == NXML_TYPE_ELEMENT && !root)
+ root = tag;
- last = tag;
- }
+ if (last)
+ last->next = tag;
+ else
+ nxml->data = tag;
- if (err)
- {
- nxml_empty (nxml);
+ last = tag;
+ }
- if (freed)
- free (buffer);
+ if (err)
+ {
+ nxml_empty(nxml);
- return NXML_ERR_PARSER;
- }
+ if (freed)
+ free(buffer);
- if (!root)
- {
- if (nxml->priv.func)
- nxml->priv.func ("%s: No root element founded!\n",
- nxml->file ? nxml->file : "");
+ return NXML_ERR_PARSER;
+ }
- nxml_empty (nxml);
+ if (!root)
+ {
+ if (nxml->priv.func)
+ nxml->priv.func("%s: No root element founded!\n",
+ nxml->file ? nxml->file : "");
- if (freed)
- free (buffer);
+ nxml_empty(nxml);
- return NXML_ERR_PARSER;
- }
+ if (freed)
+ free(buffer);
- if (freed)
- free (buffer);
+ return NXML_ERR_PARSER;
+ }
+
+ if (freed)
+ free(buffer);
- nxml->charset_detected = charset;
+ nxml->charset_detected = charset;
- __nxml_namespace_parse (nxml);
+ __nxml_namespace_parse(nxml);
- return NXML_OK;
+ return NXML_OK;
}
/* EXTERNAL FUNCTIONS *******************************************************/
nxml_error_t
-nxml_parse_url (nxml_t * nxml, char *url)
+nxml_parse_url(nxml_t *nxml, char *url)
{
- nxml_error_t err;
- char *buffer;
- size_t size;
+ nxml_error_t err;
+ char *buffer;
+ size_t size;
- if (!url || !nxml)
- return NXML_ERR_DATA;
+ if (!url || !nxml)
+ return NXML_ERR_DATA;
- if ((err = nxml_download_file (nxml, url, &buffer, &size)) != NXML_OK)
- return err;
+ if ((err = nxml_download_file(nxml, url, &buffer, &size)) != NXML_OK)
+ return err;
- if (nxml->file)
- free (nxml->file);
+ if (nxml->file)
+ free(nxml->file);
- if (!(nxml->file = strdup (url)))
- {
- nxml_empty (nxml);
- return NXML_ERR_POSIX;
- }
+ if (!(nxml->file = strdup(url)))
+ {
+ nxml_empty(nxml);
+ return NXML_ERR_POSIX;
+ }
- nxml->size = size;
+ nxml->size = size;
- nxml_empty (nxml);
+ nxml_empty(nxml);
- err = __nxml_parse_buffer (nxml, buffer, size);
+ err = __nxml_parse_buffer(nxml, buffer, size);
- free (buffer);
+ free(buffer);
- return err;
+ return err;
}
nxml_error_t
-nxml_parse_file (nxml_t * nxml, char *file)
+nxml_parse_file(nxml_t *nxml, char *file)
{
- nxml_error_t err;
- char *buffer;
- struct stat st;
- int fd, len, ret;
+ nxml_error_t err;
+ char *buffer;
+ struct stat st;
+ int fd, len, ret;
- if (!file || !nxml)
- return NXML_ERR_DATA;
+ if (!file || !nxml)
+ return NXML_ERR_DATA;
- if (stat (file, &st))
- return NXML_ERR_POSIX;
+ if (stat(file, &st))
+ return NXML_ERR_POSIX;
- if ((fd = open (file, O_RDONLY)) < 0)
- return NXML_ERR_POSIX;
+ if ((fd = open(file, O_RDONLY)) < 0)
+ return NXML_ERR_POSIX;
- if (!(buffer = (char *) malloc (sizeof (char) * (st.st_size + 1))))
- return NXML_ERR_POSIX;
+ if (!(buffer = (char *)malloc(sizeof(char) * (st.st_size + 1))))
+ return NXML_ERR_POSIX;
- len = 0;
+ len = 0;
- while (len < st.st_size)
- {
- if ((ret = read (fd, buffer + len, st.st_size - len)) <= 0)
+ while (len < st.st_size)
{
- free (buffer);
- close (fd);
- return NXML_ERR_POSIX;
- }
+ if ((ret = read(fd, buffer + len, st.st_size - len)) <= 0)
+ {
+ free(buffer);
+ close(fd);
+ return NXML_ERR_POSIX;
+ }
- len += ret;
- }
+ len += ret;
+ }
- buffer[len] = 0;
- close (fd);
+ buffer[len] = 0;
+ close(fd);
- nxml_empty (nxml);
+ nxml_empty(nxml);
- if (nxml->file)
- free (nxml->file);
+ if (nxml->file)
+ free(nxml->file);
- if (!(nxml->file = strdup (file)))
- {
- nxml_empty (nxml);
- free (buffer);
- return NXML_ERR_POSIX;
- }
+ if (!(nxml->file = strdup(file)))
+ {
+ nxml_empty(nxml);
+ free(buffer);
+ return NXML_ERR_POSIX;
+ }
- nxml->size = st.st_size;
+ nxml->size = st.st_size;
- err = __nxml_parse_buffer (nxml, buffer, st.st_size);
+ err = __nxml_parse_buffer(nxml, buffer, st.st_size);
- free (buffer);
- return err;
+ free(buffer);
+ return err;
}
nxml_error_t
-nxml_parse_buffer (nxml_t * nxml, char *buffer, size_t size)
+nxml_parse_buffer(nxml_t *nxml, char *buffer, size_t size)
{
- if (!buffer || !nxml)
- return NXML_ERR_DATA;
+ if (!buffer || !nxml)
+ return NXML_ERR_DATA;
- nxml_empty (nxml);
+ nxml_empty(nxml);
- if (nxml->file)
- free (nxml->file);
+ if (nxml->file)
+ free(nxml->file);
- if (!(nxml->file = strdup ("buffer")))
- {
- nxml_empty (nxml);
- return NXML_ERR_POSIX;
- }
+ if (!(nxml->file = strdup("buffer")))
+ {
+ nxml_empty(nxml);
+ return NXML_ERR_POSIX;
+ }
- nxml->size = size;
+ nxml->size = size;
- return __nxml_parse_buffer (nxml, buffer, size);
+ return __nxml_parse_buffer(nxml, buffer, size);
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_string.c b/plugins/backend/local/libnxml/nxml_string.c
index cc5e0814..f5d4fd49 100644
--- a/plugins/backend/local/libnxml/nxml_string.c
+++ b/plugins/backend/local/libnxml/nxml_string.c
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -19,100 +19,98 @@
#include "nxml.h"
char *
-__nxml_string_no_space (char *str)
+__nxml_string_no_space(char *str)
{
- char *ret;
- int i, j;
- int q;
- int size;
+ char *ret;
+ int i, j;
+ int q;
+ int size;
- if (!str)
- return NULL;
+ if (!str)
+ return NULL;
- size = strlen (str);
+ size = strlen(str);
- if (!(ret = (char *) malloc (sizeof (char) * (size + 1))))
- return NULL;
+ if (!(ret = (char *)malloc(sizeof(char) * (size + 1))))
+ return NULL;
- for (q = i = j = 0; i < size; i++)
- {
- if (*(str + i) == 0xd)
- continue;
-
- if (*(str + i) == 0xa || *(str + i) == 0x9 || *(str + i) == 0x20)
+ for (q = i = j = 0; i < size; i++)
{
- if (!q)
- {
- q = 1;
- ret[j++] = *(str + i);
- }
+ if (*(str + i) == 0xd)
+ continue;
+
+ if (*(str + i) == 0xa || *(str + i) == 0x9 || *(str + i) == 0x20)
+ {
+ if (!q)
+ {
+ q = 1;
+ ret[j++] = *(str + i);
+ }
+ }
+
+ else
+ {
+ q = 0;
+ ret[j++] = *(str + i);
+ }
}
- else
- {
- q = 0;
- ret[j++] = *(str + i);
- }
- }
-
- ret[j] = 0;
+ ret[j] = 0;
- return ret;
+ return ret;
}
__nxml_string_t *
-__nxml_string_new (void)
+__nxml_string_new(void)
{
- __nxml_string_t *st;
+ __nxml_string_t *st;
- if (!(st = (__nxml_string_t *) calloc (1, sizeof (__nxml_string_t))))
- return NULL;
+ if (!(st = (__nxml_string_t *)calloc(1, sizeof(__nxml_string_t))))
+ return NULL;
- return st;
+ return st;
}
char *
-__nxml_string_free (__nxml_string_t * st)
+__nxml_string_free(__nxml_string_t *st)
{
- char *ret;
+ char *ret;
- if (!st)
- return NULL;
+ if (!st)
+ return NULL;
- ret = st->string;
- free (st);
+ ret = st->string;
+ free(st);
- return ret;
+ return ret;
}
-int
-__nxml_string_add (__nxml_string_t * st, char *what, size_t size)
+int __nxml_string_add(__nxml_string_t *st, char *what, size_t size)
{
- if (!st || !*what)
- return 1;
-
- if (size <= 0)
- size = strlen (what);
-
- if (!st->size)
- {
- if (!(st->string = (char *) malloc (sizeof (char) * (size + 1))))
- return 1;
- }
- else
- {
- if (!
- (st->string =
- (char *) realloc (st->string,
- sizeof (char) * (size + st->size + 1))))
- return 1;
- }
-
- memcpy (st->string + st->size, what, size);
- st->size += size;
- st->string[st->size] = 0;
-
- return 0;
+ if (!st || !*what)
+ return 1;
+
+ if (size <= 0)
+ size = strlen(what);
+
+ if (!st->size)
+ {
+ if (!(st->string = (char *)malloc(sizeof(char) * (size + 1))))
+ return 1;
+ }
+ else
+ {
+ if (!(st->string =
+ (char *)realloc(st->string,
+ sizeof(char) * (size + st->size + 1))))
+ return 1;
+ }
+
+ memcpy(st->string + st->size, what, size);
+ st->size += size;
+ st->string[st->size] = 0;
+
+ return 0;
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_tools.c b/plugins/backend/local/libnxml/nxml_tools.c
index 75828728..9f075acf 100644
--- a/plugins/backend/local/libnxml/nxml_tools.c
+++ b/plugins/backend/local/libnxml/nxml_tools.c
@@ -1,127 +1,122 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include "nxml.h"
-int
-__nxml_atoi (char *str)
+int __nxml_atoi(char *str)
{
- int ret;
- sscanf (str, "%x", (unsigned int *) &ret);
- return ret;
+ int ret;
+ sscanf(str, "%x", (unsigned int *)&ret);
+ return ret;
}
-int
-__nxml_escape_spaces (nxml_t * doc, char **buffer, size_t * size)
+int __nxml_escape_spaces(nxml_t *doc, char **buffer, size_t *size)
{
- /*
+ /*
* Rule [3] - S ::= (#x20 | #x9 | #xD | #xA)+
*/
- int k = 0;
+ int k = 0;
- if (!*size)
- return 0;
+ if (!*size)
+ return 0;
- while ((**buffer == 0x20 || **buffer == 0x9 || **buffer == 0xd
- || **buffer == 0xa) && *size)
- {
- if (**buffer == 0xa && doc->priv.func)
- doc->priv.line++;
+ while ((**buffer == 0x20 || **buffer == 0x9 || **buffer == 0xd || **buffer == 0xa) && *size)
+ {
+ if (**buffer == 0xa && doc->priv.func)
+ doc->priv.line++;
- (*buffer)++;
- (*size)--;
- k++;
- }
+ (*buffer)++;
+ (*size)--;
+ k++;
+ }
- return k;
+ return k;
}
char *
-__nxml_get_value (nxml_t * doc, char **buffer, size_t * size)
+__nxml_get_value(nxml_t *doc, char **buffer, size_t *size)
{
- char *attr;
- int i;
- int quot;
+ char *attr;
+ int i;
+ int quot;
- if (!*size)
- return NULL;
+ if (!*size)
+ return NULL;
- if (**buffer == '"')
- quot = 1;
+ if (**buffer == '"')
+ quot = 1;
- else if (**buffer == '\'')
- quot = 0;
+ else if (**buffer == '\'')
+ quot = 0;
- else
- return NULL;
+ else
+ return NULL;
- (*buffer)++;
- (*size)--;
+ (*buffer)++;
+ (*size)--;
- i = 0;
- while (((quot && *(*buffer + i) != '"')
- || (!quot && *(*buffer + i) != '\'')))
- {
- if (*(*buffer + i) == '\n' && doc->priv.func)
- doc->priv.line++;
+ i = 0;
+ while (((quot && *(*buffer + i) != '"') || (!quot && *(*buffer + i) != '\'')))
+ {
+ if (*(*buffer + i) == '\n' && doc->priv.func)
+ doc->priv.line++;
- i++;
- }
+ i++;
+ }
- if (quot && *(*buffer + i) != '"')
- return NULL;
+ if (quot && *(*buffer + i) != '"')
+ return NULL;
- else if (!quot && *(*buffer + i) != '\'')
- return NULL;
+ else if (!quot && *(*buffer + i) != '\'')
+ return NULL;
- if (!(attr = (char *) malloc (sizeof (char) * (i + 1))))
- return NULL;
+ if (!(attr = (char *)malloc(sizeof(char) * (i + 1))))
+ return NULL;
- memcpy (attr, *buffer, i);
+ memcpy(attr, *buffer, i);
- attr[i] = 0;
+ attr[i] = 0;
- i++;
- (*buffer) += i;
- (*size) -= i;
+ i++;
+ (*buffer) += i;
+ (*size) -= i;
- return attr;
+ return attr;
}
char *
-__nxml_trim (char *tmp)
+__nxml_trim(char *tmp)
{
- /* Trim function: */
- int i = 0;
- while (tmp[i] == 0x20 || tmp[i] == 0x9 || tmp[i] == 0xd || tmp[i] == 0xa)
- tmp++;
+ /* Trim function: */
+ int i = 0;
+ while (tmp[i] == 0x20 || tmp[i] == 0x9 || tmp[i] == 0xd || tmp[i] == 0xa)
+ tmp++;
- i = strlen (tmp);
- i--;
+ i = strlen(tmp);
+ i--;
- while (tmp[i] == 0x20 || tmp[i] == 0x9 || tmp[i] == 0xd || tmp[i] == 0xa)
- i--;
+ while (tmp[i] == 0x20 || tmp[i] == 0x9 || tmp[i] == 0xd || tmp[i] == 0xa)
+ i--;
- tmp[i + 1] = 0;
+ tmp[i + 1] = 0;
- return strdup (tmp);
+ return strdup(tmp);
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_utf.c b/plugins/backend/local/libnxml/nxml_utf.c
index 9109b65c..9d8f9fbd 100644
--- a/plugins/backend/local/libnxml/nxml_utf.c
+++ b/plugins/backend/local/libnxml/nxml_utf.c
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -29,494 +29,487 @@
*/
int64_t
-__nxml_utf8 (unsigned char **buffer, size_t * size, int *byte)
+__nxml_utf8(unsigned char **buffer, size_t *size, int *byte)
{
- int64_t ret;
- unsigned char c0 = **buffer, c1, c2, c3, c4;
-
- if (c0 < 0x80 || *size < 2)
- {
- *byte = 1;
- ret = (int64_t) c0;
- return ret;
- }
-
- c1 = *(*buffer + 1);
-
- if ((c0 & 0xe0) == 0xc0 || *size < 3)
- {
- *byte = 2;
- ret = (((c0 & 0x1f) << 6) | (c1 & 0x3f));
- return ret;
- }
-
- c2 = *(*buffer + 2);
-
- if ((c0 & 0xf0) == 0xe0 || *size < 4)
- {
- *byte = 3;
- ret = (((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f));
- return ret;
- }
-
- c3 = *(*buffer + 3);
-
- if ((c0 & 0xf8) == 0xf0 || *size < 5)
- {
- *byte = 4;
- ret =
- (((c0 & 0x7) << 18) | ((c1 & 0x3f) << 12) | ((c2 & 0x3f) << 6) |
- (c3 & 0x3f));
- return ret;
- }
-
- c4 = *(*buffer + 4);
-
- if ((c0 & 0xfc) == 0xf8)
- {
- *byte = 5;
- ret =
- (((c0 & 0x3) << 24) | ((c1 & 0x3f) << 18) | ((c2 & 0x3f) << 12) |
- ((c3 & 0x3f) << 6) | (c4 & 0x3f));
- return ret;
- }
-
- *byte = 1;
- ret = (int64_t) c0;
- return ret;
-}
+ int64_t ret;
+ unsigned char c0 = **buffer, c1, c2, c3, c4;
-#define __NXML_XTO8( x , b ) \
- if(byte>=1023-b) { \
- if(!(ret=realloc(ret, (j+b)*sizeof(char)))) return -1; \
- byte=0; \
- } \
- memcpy(&ret[j], x, b); \
- j+=b; \
- byte+=b;
-
-static size_t
-__nxml_utf16to8 (int le, unsigned char *buffer, size_t size,
- unsigned char **ret_buffer)
-{
- int64_t ch;
- int j = 0;
- int byte = 0;
- unsigned char *ret;
+ if (c0 < 0x80 || *size < 2)
+ {
+ *byte = 1;
+ ret = (int64_t)c0;
+ return ret;
+ }
- if (!(ret = (unsigned char *) malloc (sizeof (unsigned char) * 1024)))
- return -1;
+ c1 = *(*buffer + 1);
- while (size > 0)
- {
- if (le)
+ if ((c0 & 0xe0) == 0xc0 || *size < 3)
{
- if ((*buffer & 0xfc) == 0xd8 && (*(buffer + 2) & 0xfc) == 0xdc)
- {
- ch = ((*buffer & 0x03) << 18) + (*(buffer + 1) << 10) +
- ((*(buffer + 2) & 0x03) << 8) + *(buffer + 3);
-
- buffer += 4;
- size -= 4;
- }
-
- else
- {
-
- ch = (*buffer << 8) + *(buffer + 1);
- buffer += 2;
- size -= 2;
- }
+ *byte = 2;
+ ret = (((c0 & 0x1f) << 6) | (c1 & 0x3f));
+ return ret;
}
- else if ((*(buffer + 1) & 0xfc) == 0xd8
- && (*(buffer + 3) & 0xfc) == 0xdc)
- {
- ch = ((*(buffer + 1) & 0x03) << 18) + (*buffer << 10) +
- ((*(buffer + 3) & 0x03) << 8) + *(buffer + 2);
+ c2 = *(*buffer + 2);
- buffer += 4;
- size -= 4;
+ if ((c0 & 0xf0) == 0xe0 || *size < 4)
+ {
+ *byte = 3;
+ ret = (((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f));
+ return ret;
}
- else
- {
+ c3 = *(*buffer + 3);
- ch = (*(buffer + 1) << 8) + *buffer;
- buffer += 2;
- size -= 2;
+ if ((c0 & 0xf8) == 0xf0 || *size < 5)
+ {
+ *byte = 4;
+ ret =
+ (((c0 & 0x7) << 18) | ((c1 & 0x3f) << 12) | ((c2 & 0x3f) << 6) |
+ (c3 & 0x3f));
+ return ret;
}
- /* 8bit: 1000000 */
- if (ch < 0x80)
+ c4 = *(*buffer + 4);
+
+ if ((c0 & 0xfc) == 0xf8)
{
- __NXML_XTO8 ((void *) &ch, 1);
+ *byte = 5;
+ ret =
+ (((c0 & 0x3) << 24) | ((c1 & 0x3f) << 18) | ((c2 & 0x3f) << 12) |
+ ((c3 & 0x3f) << 6) | (c4 & 0x3f));
+ return ret;
}
- /* 11bit: xx100000 xx000000
- * 1000 0000 0000
+ *byte = 1;
+ ret = (int64_t)c0;
+ return ret;
+}
+
+#define __NXML_XTO8(x, b) \
+ if (byte >= 1023 - b) \
+ { \
+ if (!(ret = realloc(ret, (j + b) * sizeof(char)))) \
+ return -1; \
+ byte = 0; \
+ } \
+ memcpy(&ret[j], x, b); \
+ j += b; \
+ byte += b;
+
+static size_t
+__nxml_utf16to8(int le, unsigned char *buffer, size_t size,
+ unsigned char **ret_buffer)
+{
+ int64_t ch;
+ int j = 0;
+ int byte = 0;
+ unsigned char *ret;
+
+ if (!(ret = (unsigned char *)malloc(sizeof(unsigned char) * 1024)))
+ return -1;
+
+ while (size > 0)
+ {
+ if (le)
+ {
+ if ((*buffer & 0xfc) == 0xd8 && (*(buffer + 2) & 0xfc) == 0xdc)
+ {
+ ch = ((*buffer & 0x03) << 18) + (*(buffer + 1) << 10) +
+ ((*(buffer + 2) & 0x03) << 8) + *(buffer + 3);
+
+ buffer += 4;
+ size -= 4;
+ }
+
+ else
+ {
+
+ ch = (*buffer << 8) + *(buffer + 1);
+ buffer += 2;
+ size -= 2;
+ }
+ }
+
+ else if ((*(buffer + 1) & 0xfc) == 0xd8 && (*(buffer + 3) & 0xfc) == 0xdc)
+ {
+ ch = ((*(buffer + 1) & 0x03) << 18) + (*buffer << 10) +
+ ((*(buffer + 3) & 0x03) << 8) + *(buffer + 2);
+
+ buffer += 4;
+ size -= 4;
+ }
+
+ else
+ {
+
+ ch = (*(buffer + 1) << 8) + *buffer;
+ buffer += 2;
+ size -= 2;
+ }
+
+ /* 8bit: 1000000 */
+ if (ch < 0x80)
+ {
+ __NXML_XTO8((void *)&ch, 1);
+ }
+
+ /* 11bit: xx100000 xx000000
+ * 1000 0000 0000
* 0x 8 0 0
*/
- else if (ch < 0x800)
- {
- /* 11bits: 110xxxxx 10xxxxxx */
- char a[2];
- a[0] = (ch >> 6) | 0xc0;
- a[1] = (ch & 0x3f) | 0x80;
- __NXML_XTO8 ((void *) a, 2);
- }
-
- /* 16bit: xxx10000 xx000000 xx000000
+ else if (ch < 0x800)
+ {
+ /* 11bits: 110xxxxx 10xxxxxx */
+ char a[2];
+ a[0] = (ch >> 6) | 0xc0;
+ a[1] = (ch & 0x3f) | 0x80;
+ __NXML_XTO8((void *)a, 2);
+ }
+
+ /* 16bit: xxx10000 xx000000 xx000000
* 1 0000 0000 0000 0000
* 0x 1 0 0 0 0
*/
- else if (ch < 0x10000)
- {
- /* 16bits: 1110xxxx 10xxxxxx 10xxxxxx */
- char a[3];
- a[0] = (ch >> 12) | 0xe0;
- a[1] = ((ch >> 6) & 0x3f) | 0x80;
- a[2] = (ch & 0x3f) | 0x80;
- __NXML_XTO8 ((void *) a, 3);
- }
-
- /* 21bit: xxxx1000 xx000000 xx000000 xx000000
+ else if (ch < 0x10000)
+ {
+ /* 16bits: 1110xxxx 10xxxxxx 10xxxxxx */
+ char a[3];
+ a[0] = (ch >> 12) | 0xe0;
+ a[1] = ((ch >> 6) & 0x3f) | 0x80;
+ a[2] = (ch & 0x3f) | 0x80;
+ __NXML_XTO8((void *)a, 3);
+ }
+
+ /* 21bit: xxxx1000 xx000000 xx000000 xx000000
* 10 0000 0000 0000 0000 0000
* 0x 2 0 0 0 0 0
*/
- else if (ch < 0x200000)
- {
- /* 21bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
- char a[4];
- a[0] = (ch >> 18) | 0xf0;
- a[1] = ((ch >> 12) & 0x3f);
- a[2] = ((ch >> 6) & 0x3f);
- a[3] = (ch & 0x3f);
- __NXML_XTO8 ((void *) a, 4);
- }
-
- /* 26bit: xxxxx100 xx000000 xx000000 xx000000 xx000000
+ else if (ch < 0x200000)
+ {
+ /* 21bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ char a[4];
+ a[0] = (ch >> 18) | 0xf0;
+ a[1] = ((ch >> 12) & 0x3f);
+ a[2] = ((ch >> 6) & 0x3f);
+ a[3] = (ch & 0x3f);
+ __NXML_XTO8((void *)a, 4);
+ }
+
+ /* 26bit: xxxxx100 xx000000 xx000000 xx000000 xx000000
* 100 0000 0000 0000 0000 0000 0000
* 0x 4 0 0 0 0 0 0
*/
- else if (ch < 0x4000000)
- {
- /* 21bits: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
- char a[5];
- a[0] = (ch >> 24) | 0xf8;
- a[1] = ((ch >> 18) & 0x3f);
- a[2] = ((ch >> 12) & 0x3f);
- a[3] = ((ch >> 6) & 0x3f);
- a[4] = (ch & 0x3f);
- __NXML_XTO8 ((void *) a, 5);
+ else if (ch < 0x4000000)
+ {
+ /* 21bits: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ char a[5];
+ a[0] = (ch >> 24) | 0xf8;
+ a[1] = ((ch >> 18) & 0x3f);
+ a[2] = ((ch >> 12) & 0x3f);
+ a[3] = ((ch >> 6) & 0x3f);
+ a[4] = (ch & 0x3f);
+ __NXML_XTO8((void *)a, 5);
+ }
}
- }
- ret[j] = 0;
- (*ret_buffer) = ret;
+ ret[j] = 0;
+ (*ret_buffer) = ret;
- return (size_t) j;
+ return (size_t)j;
}
static size_t
-__nxml_ucs4to8 (int type, unsigned char *buffer, size_t size,
- unsigned char **ret_buffer)
+__nxml_ucs4to8(int type, unsigned char *buffer, size_t size,
+ unsigned char **ret_buffer)
{
- int64_t ch;
- int j = 0;
- int byte = 0;
- unsigned char *ret;
-
- if (!(ret = (unsigned char *) malloc (sizeof (unsigned char) * 1024)))
- return -1;
-
- while (size > 0)
- {
- switch (type)
- {
- case 0: /* 1234 */
- ch =
- (*buffer << 18) + (*(buffer + 1) << 12) + (*(buffer + 2) << 6) +
- (*(buffer + 3));
- break;
-
- case 1: /* 4321 */
- ch =
- (*buffer) + (*(buffer + 1) << 6) + (*(buffer + 2) << 12) +
- (*(buffer + 3) << 18);
- break;
-
- case 2: /* 2143 */
- ch =
- ((*buffer) << 12) + (*(buffer + 1) << 18) + (*(buffer + 2)) +
- (*(buffer + 3) << 6);
- break;
-
- case 3: /* 3412 */
- ch =
- ((*buffer) << 6) + (*(buffer + 1)) + (*(buffer + 2) << 18) +
- (*(buffer + 3) << 12);
- break;
-
- }
+ int64_t ch;
+ int j = 0;
+ int byte = 0;
+ unsigned char *ret;
- buffer += 4;
- size -= 4;
+ if (!(ret = (unsigned char *)malloc(sizeof(unsigned char) * 1024)))
+ return -1;
- /* 8bit: 1000000 */
- if (ch < 0x80)
+ while (size > 0)
{
- __NXML_XTO8 ((void *) &ch, 1);
- }
-
- /* 11bit: xx100000 xx000000
- * 1000 0000 0000
+ switch (type)
+ {
+ case 0: /* 1234 */
+ ch =
+ (*buffer << 18) + (*(buffer + 1) << 12) + (*(buffer + 2) << 6) +
+ (*(buffer + 3));
+ break;
+
+ case 1: /* 4321 */
+ ch =
+ (*buffer) + (*(buffer + 1) << 6) + (*(buffer + 2) << 12) +
+ (*(buffer + 3) << 18);
+ break;
+
+ case 2: /* 2143 */
+ ch =
+ ((*buffer) << 12) + (*(buffer + 1) << 18) + (*(buffer + 2)) +
+ (*(buffer + 3) << 6);
+ break;
+
+ case 3: /* 3412 */
+ ch =
+ ((*buffer) << 6) + (*(buffer + 1)) + (*(buffer + 2) << 18) +
+ (*(buffer + 3) << 12);
+ break;
+ }
+
+ buffer += 4;
+ size -= 4;
+
+ /* 8bit: 1000000 */
+ if (ch < 0x80)
+ {
+ __NXML_XTO8((void *)&ch, 1);
+ }
+
+ /* 11bit: xx100000 xx000000
+ * 1000 0000 0000
* 0x 8 0 0
*/
- else if (ch < 0x800)
- {
- /* 11bits: 110xxxxx 10xxxxxx */
- char a[2];
- a[0] = (ch >> 6) | 0xc0;
- a[1] = (ch & 0x3f) | 0x80;
- __NXML_XTO8 ((void *) a, 2);
- }
-
- /* 16bit: xxx10000 xx000000 xx000000
+ else if (ch < 0x800)
+ {
+ /* 11bits: 110xxxxx 10xxxxxx */
+ char a[2];
+ a[0] = (ch >> 6) | 0xc0;
+ a[1] = (ch & 0x3f) | 0x80;
+ __NXML_XTO8((void *)a, 2);
+ }
+
+ /* 16bit: xxx10000 xx000000 xx000000
* 1 0000 0000 0000 0000
* 0x 1 0 0 0 0
*/
- else if (ch < 0x10000)
- {
- /* 16bits: 1110xxxx 10xxxxxx 10xxxxxx */
- char a[3];
- a[0] = (ch >> 12) | 0xe0;
- a[1] = ((ch >> 6) & 0x3f) | 0x80;
- a[2] = (ch & 0x3f) | 0x80;
- __NXML_XTO8 ((void *) a, 3);
- }
-
- /* 21bit: xxxx1000 xx000000 xx000000 xx000000
+ else if (ch < 0x10000)
+ {
+ /* 16bits: 1110xxxx 10xxxxxx 10xxxxxx */
+ char a[3];
+ a[0] = (ch >> 12) | 0xe0;
+ a[1] = ((ch >> 6) & 0x3f) | 0x80;
+ a[2] = (ch & 0x3f) | 0x80;
+ __NXML_XTO8((void *)a, 3);
+ }
+
+ /* 21bit: xxxx1000 xx000000 xx000000 xx000000
* 10 0000 0000 0000 0000 0000
* 0x 2 0 0 0 0 0
*/
- else if (ch < 0x200000)
- {
- /* 21bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
- char a[4];
- a[0] = (ch >> 18) | 0xf0;
- a[1] = ((ch >> 12) & 0x3f);
- a[2] = ((ch >> 6) & 0x3f);
- a[3] = (ch & 0x3f);
- __NXML_XTO8 ((void *) a, 4);
- }
-
- /* 26bit: xxxxx100 xx000000 xx000000 xx000000 xx000000
+ else if (ch < 0x200000)
+ {
+ /* 21bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ char a[4];
+ a[0] = (ch >> 18) | 0xf0;
+ a[1] = ((ch >> 12) & 0x3f);
+ a[2] = ((ch >> 6) & 0x3f);
+ a[3] = (ch & 0x3f);
+ __NXML_XTO8((void *)a, 4);
+ }
+
+ /* 26bit: xxxxx100 xx000000 xx000000 xx000000 xx000000
* 100 0000 0000 0000 0000 0000 0000
* 0x 4 0 0 0 0 0 0
*/
- else if (ch < 0x4000000)
- {
- /* 21bits: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
- char a[5];
- a[0] = (ch >> 24) | 0xf8;
- a[1] = ((ch >> 18) & 0x3f);
- a[2] = ((ch >> 12) & 0x3f);
- a[3] = ((ch >> 6) & 0x3f);
- a[4] = (ch & 0x3f);
- __NXML_XTO8 ((void *) a, 5);
+ else if (ch < 0x4000000)
+ {
+ /* 21bits: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ char a[5];
+ a[0] = (ch >> 24) | 0xf8;
+ a[1] = ((ch >> 18) & 0x3f);
+ a[2] = ((ch >> 12) & 0x3f);
+ a[3] = ((ch >> 6) & 0x3f);
+ a[4] = (ch & 0x3f);
+ __NXML_XTO8((void *)a, 5);
+ }
}
- }
- ret[j] = 0;
- (*ret_buffer) = ret;
+ ret[j] = 0;
+ (*ret_buffer) = ret;
- return (size_t) j;
+ return (size_t)j;
}
-int
-__nxml_utf_detection (char *r_buffer, size_t r_size, char **buffer,
- size_t * size, nxml_charset_t * charset)
+int __nxml_utf_detection(char *r_buffer, size_t r_size, char **buffer,
+ size_t *size, nxml_charset_t *charset)
{
- /* Utf-8: 0x3c 0x3f 0x78 0x6d */
- if (strncmp (r_buffer, "<?xml", 5))
- {
- *charset = NXML_CHARSET_UTF8;
- return 0;
- }
+ /* Utf-8: 0x3c 0x3f 0x78 0x6d */
+ if (strncmp(r_buffer, "<?xml", 5))
+ {
+ *charset = NXML_CHARSET_UTF8;
+ return 0;
+ }
- /* Utf-16LE: 0x00 0x3c 0x00 0x3f */
- if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x3c && *(r_buffer + 2) == 0x00
- && *(r_buffer + 3) == 0x3f)
- {
- (*size) =
- __nxml_utf16to8 (1, (unsigned char *) r_buffer, r_size,
- (unsigned char **) buffer);
+ /* Utf-16LE: 0x00 0x3c 0x00 0x3f */
+ if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x3c && *(r_buffer + 2) == 0x00 && *(r_buffer + 3) == 0x3f)
+ {
+ (*size) =
+ __nxml_utf16to8(1, (unsigned char *)r_buffer, r_size,
+ (unsigned char **)buffer);
- if (*size < 0)
- return -1;
+ if (*size < 0)
+ return -1;
- *charset = NXML_CHARSET_UTF16LE;
+ *charset = NXML_CHARSET_UTF16LE;
- return 1;
- }
+ return 1;
+ }
- /* Utf-16BE: 0x3c 0x00 0x3f 0x00 */
- if (*r_buffer == 0x3c && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x3f
- && *(r_buffer + 3) == 0x00)
- {
- (*size) =
- __nxml_utf16to8 (0, (unsigned char *) r_buffer, r_size,
- (unsigned char **) buffer);
+ /* Utf-16BE: 0x3c 0x00 0x3f 0x00 */
+ if (*r_buffer == 0x3c && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x3f && *(r_buffer + 3) == 0x00)
+ {
+ (*size) =
+ __nxml_utf16to8(0, (unsigned char *)r_buffer, r_size,
+ (unsigned char **)buffer);
- if (*size < 0)
- return -1;
+ if (*size < 0)
+ return -1;
- *charset = NXML_CHARSET_UTF16BE;
+ *charset = NXML_CHARSET_UTF16BE;
- return 1;
- }
+ return 1;
+ }
- /* UCS-4 (1234): 0x00 0x00 0x00 0x3c */
- if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x00
- && *(r_buffer + 3) == 0x3c)
- {
- (*size) =
- __nxml_ucs4to8 (0, (unsigned char *) r_buffer, r_size,
- (unsigned char **) buffer);
+ /* UCS-4 (1234): 0x00 0x00 0x00 0x3c */
+ if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x00 && *(r_buffer + 3) == 0x3c)
+ {
+ (*size) =
+ __nxml_ucs4to8(0, (unsigned char *)r_buffer, r_size,
+ (unsigned char **)buffer);
- if (*size < 0)
- return -1;
+ if (*size < 0)
+ return -1;
- *charset = NXML_CHARSET_UCS4_1234;
+ *charset = NXML_CHARSET_UCS4_1234;
- return 1;
- }
+ return 1;
+ }
- /* UCS-4 (4321): 0x3c 0x00 0x00 0x00 */
- if (*r_buffer == 0x3c && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x00
- && *(r_buffer + 3) == 0x00)
- {
- (*size) =
- __nxml_ucs4to8 (1, (unsigned char *) r_buffer, r_size,
- (unsigned char **) buffer);
+ /* UCS-4 (4321): 0x3c 0x00 0x00 0x00 */
+ if (*r_buffer == 0x3c && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x00 && *(r_buffer + 3) == 0x00)
+ {
+ (*size) =
+ __nxml_ucs4to8(1, (unsigned char *)r_buffer, r_size,
+ (unsigned char **)buffer);
- if (*size < 0)
- return -1;
+ if (*size < 0)
+ return -1;
- *charset = NXML_CHARSET_UCS4_4321;
+ *charset = NXML_CHARSET_UCS4_4321;
- return 1;
- }
+ return 1;
+ }
- /* UCS-4 (2143): 0x00 0x00 0x3c 0x00 */
- if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x3c
- && *(r_buffer + 3) == 0x00)
- {
- (*size) =
- __nxml_ucs4to8 (2, (unsigned char *) r_buffer, r_size,
- (unsigned char **) buffer);
+ /* UCS-4 (2143): 0x00 0x00 0x3c 0x00 */
+ if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x00 && *(r_buffer + 2) == 0x3c && *(r_buffer + 3) == 0x00)
+ {
+ (*size) =
+ __nxml_ucs4to8(2, (unsigned char *)r_buffer, r_size,
+ (unsigned char **)buffer);
- if (*size < 0)
- return -1;
+ if (*size < 0)
+ return -1;
- *charset = NXML_CHARSET_UCS4_2143;
+ *charset = NXML_CHARSET_UCS4_2143;
- return 1;
- }
+ return 1;
+ }
- /* UCS-4 (3412): 0x00 0x3c 0x00 0x00 */
- if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x3c && *(r_buffer + 2) == 0x00
- && *(r_buffer + 3) == 0x00)
- {
- (*size) =
- __nxml_ucs4to8 (3, (unsigned char *) r_buffer, r_size,
- (unsigned char **) buffer);
+ /* UCS-4 (3412): 0x00 0x3c 0x00 0x00 */
+ if (*r_buffer == 0x00 && *(r_buffer + 1) == 0x3c && *(r_buffer + 2) == 0x00 && *(r_buffer + 3) == 0x00)
+ {
+ (*size) =
+ __nxml_ucs4to8(3, (unsigned char *)r_buffer, r_size,
+ (unsigned char **)buffer);
- if (*size < 0)
- return -1;
+ if (*size < 0)
+ return -1;
- *charset = NXML_CHARSET_UCS4_3412;
+ *charset = NXML_CHARSET_UCS4_3412;
- return 1;
- }
+ return 1;
+ }
- *charset = NXML_CHARSET_UNKNOWN;
+ *charset = NXML_CHARSET_UNKNOWN;
- return 0;
+ return 0;
}
int64_t
-__nxml_int_charset (int ch, unsigned char *str, char *charset)
+__nxml_int_charset(int ch, unsigned char *str, char *charset)
{
- if (!charset || strcasecmp (charset, "utf-8"))
- {
- str[0] = ch;
- return 1;
- }
-
- /* 8bit: 1000000 */
- if (ch < 0x80)
- {
- str[0] = ch;
- return 1;
- }
-
- /* 11bit: xx100000 xx000000
- * 1000 0000 0000
+ if (!charset || strcasecmp(charset, "utf-8"))
+ {
+ str[0] = ch;
+ return 1;
+ }
+
+ /* 8bit: 1000000 */
+ if (ch < 0x80)
+ {
+ str[0] = ch;
+ return 1;
+ }
+
+ /* 11bit: xx100000 xx000000
+ * 1000 0000 0000
* 0x 8 0 0
*/
- else if (ch < 0x800)
- {
- /* 11bits: 110xxxxx 10xxxxxx */
- str[0] = (ch >> 6) | 0xc0;
- str[1] = (ch & 0x3f) | 0x80;
- return 2;
- }
-
- /* 16bit: xxx10000 xx000000 xx000000
+ else if (ch < 0x800)
+ {
+ /* 11bits: 110xxxxx 10xxxxxx */
+ str[0] = (ch >> 6) | 0xc0;
+ str[1] = (ch & 0x3f) | 0x80;
+ return 2;
+ }
+
+ /* 16bit: xxx10000 xx000000 xx000000
* 1 0000 0000 0000 0000
* 0x 1 0 0 0 0
*/
- else if (ch < 0x10000)
- {
- /* 16bits: 1110xxxx 10xxxxxx 10xxxxxx */
- str[0] = (ch >> 12) | 0xe0;
- str[1] = ((ch >> 6) & 0x3f) | 0x80;
- str[2] = (ch & 0x3f) | 0x80;
- return 3;
- }
-
- /* 21bit: xxxx1000 xx000000 xx000000 xx000000
+ else if (ch < 0x10000)
+ {
+ /* 16bits: 1110xxxx 10xxxxxx 10xxxxxx */
+ str[0] = (ch >> 12) | 0xe0;
+ str[1] = ((ch >> 6) & 0x3f) | 0x80;
+ str[2] = (ch & 0x3f) | 0x80;
+ return 3;
+ }
+
+ /* 21bit: xxxx1000 xx000000 xx000000 xx000000
* 10 0000 0000 0000 0000 0000
* 0x 2 0 0 0 0 0
*/
- else if (ch < 0x200000)
- {
- /* 21bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
- str[0] = (ch >> 18) | 0xf0;
- str[1] = ((ch >> 12) & 0x3f);
- str[2] = ((ch >> 6) & 0x3f);
- str[3] = (ch & 0x3f);
- return 4;
- }
-
- /* 26bit: xxxxx100 xx000000 xx000000 xx000000 xx000000
+ else if (ch < 0x200000)
+ {
+ /* 21bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ str[0] = (ch >> 18) | 0xf0;
+ str[1] = ((ch >> 12) & 0x3f);
+ str[2] = ((ch >> 6) & 0x3f);
+ str[3] = (ch & 0x3f);
+ return 4;
+ }
+
+ /* 26bit: xxxxx100 xx000000 xx000000 xx000000 xx000000
* 100 0000 0000 0000 0000 0000 0000
* 0x 4 0 0 0 0 0 0
*/
- else if (ch < 0x4000000)
- {
- /* 21bits: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
- str[0] = (ch >> 24) | 0xf8;
- str[1] = ((ch >> 18) & 0x3f);
- str[2] = ((ch >> 12) & 0x3f);
- str[3] = ((ch >> 6) & 0x3f);
- str[4] = (ch & 0x3f);
- return 5;
- }
-
- return 0;
+ else if (ch < 0x4000000)
+ {
+ /* 21bits: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ str[0] = (ch >> 24) | 0xf8;
+ str[1] = ((ch >> 18) & 0x3f);
+ str[2] = ((ch >> 12) & 0x3f);
+ str[3] = ((ch >> 6) & 0x3f);
+ str[4] = (ch & 0x3f);
+ return 5;
+ }
+
+ return 0;
}
/* EOF */
diff --git a/plugins/backend/local/libnxml/nxml_write.c b/plugins/backend/local/libnxml/nxml_write.c
index 6932d7ec..f1c658c7 100644
--- a/plugins/backend/local/libnxml/nxml_write.c
+++ b/plugins/backend/local/libnxml/nxml_write.c
@@ -1,16 +1,16 @@
-/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
+/* nXml - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
* <bakunin@autistici.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
@@ -19,392 +19,392 @@
#include "nxml.h"
static void
-__nxml_write_escape_string (void (*func) (void *, char *, ...), void *obj,
- char *str)
+__nxml_write_escape_string(void (*func)(void *, char *, ...), void *obj,
+ char *str)
{
- int i;
- int len;
- char buf[1024];
- int j;
-
-#define __NXML_CHECK_BUF \
- if(j==sizeof(buf)-1) { buf[j]=0; func(obj, "%s",buf); j=0; }
-
- if (!str)
- return;
-
- len = strlen (str);
-
- for (j = i = 0; i < len; i++)
- {
- if (str[i] == '\r')
- continue;
-
- else if (str[i] == '<')
- {
- buf[j++] = '&';
- __NXML_CHECK_BUF;
- buf[j++] = 'l';
- __NXML_CHECK_BUF;
- buf[j++] = 't';
- __NXML_CHECK_BUF;
- buf[j++] = ';';
- __NXML_CHECK_BUF;
+ int i;
+ int len;
+ char buf[1024];
+ int j;
+
+#define __NXML_CHECK_BUF \
+ if (j == sizeof(buf) - 1) \
+ { \
+ buf[j] = 0; \
+ func(obj, "%s", buf); \
+ j = 0; \
}
- else if (str[i] == '>')
- {
- buf[j++] = '&';
- __NXML_CHECK_BUF;
- buf[j++] = 'g';
- __NXML_CHECK_BUF;
- buf[j++] = 't';
- __NXML_CHECK_BUF;
- buf[j++] = ';';
- __NXML_CHECK_BUF;
- }
+ if (!str)
+ return;
- else if (str[i] == '&')
- {
- buf[j++] = '&';
- __NXML_CHECK_BUF;
- buf[j++] = 'a';
- __NXML_CHECK_BUF;
- buf[j++] = 'm';
- __NXML_CHECK_BUF;
- buf[j++] = 'p';
- __NXML_CHECK_BUF;
- buf[j++] = ';';
- __NXML_CHECK_BUF;
- }
+ len = strlen(str);
- else if (str[i] == '\'')
+ for (j = i = 0; i < len; i++)
{
- buf[j++] = '&';
- __NXML_CHECK_BUF;
- buf[j++] = 'a';
- __NXML_CHECK_BUF;
- buf[j++] = 'p';
- __NXML_CHECK_BUF;
- buf[j++] = 'o';
- __NXML_CHECK_BUF;
- buf[j++] = 's';
- __NXML_CHECK_BUF;
- buf[j++] = ';';
- __NXML_CHECK_BUF;
+ if (str[i] == '\r')
+ continue;
+
+ else if (str[i] == '<')
+ {
+ buf[j++] = '&';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'l';
+ __NXML_CHECK_BUF;
+ buf[j++] = 't';
+ __NXML_CHECK_BUF;
+ buf[j++] = ';';
+ __NXML_CHECK_BUF;
+ }
+
+ else if (str[i] == '>')
+ {
+ buf[j++] = '&';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'g';
+ __NXML_CHECK_BUF;
+ buf[j++] = 't';
+ __NXML_CHECK_BUF;
+ buf[j++] = ';';
+ __NXML_CHECK_BUF;
+ }
+
+ else if (str[i] == '&')
+ {
+ buf[j++] = '&';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'a';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'm';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'p';
+ __NXML_CHECK_BUF;
+ buf[j++] = ';';
+ __NXML_CHECK_BUF;
+ }
+
+ else if (str[i] == '\'')
+ {
+ buf[j++] = '&';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'a';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'p';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'o';
+ __NXML_CHECK_BUF;
+ buf[j++] = 's';
+ __NXML_CHECK_BUF;
+ buf[j++] = ';';
+ __NXML_CHECK_BUF;
+ }
+
+ else if (str[i] == '\"')
+ {
+ buf[j++] = '&';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'q';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'u';
+ __NXML_CHECK_BUF;
+ buf[j++] = 'o';
+ __NXML_CHECK_BUF;
+ buf[j++] = 't';
+ __NXML_CHECK_BUF;
+ buf[j++] = ';';
+ __NXML_CHECK_BUF;
+ }
+
+ else
+ {
+ buf[j++] = str[i];
+ __NXML_CHECK_BUF;
+ }
}
- else if (str[i] == '\"')
+ if (j)
{
- buf[j++] = '&';
- __NXML_CHECK_BUF;
- buf[j++] = 'q';
- __NXML_CHECK_BUF;
- buf[j++] = 'u';
- __NXML_CHECK_BUF;
- buf[j++] = 'o';
- __NXML_CHECK_BUF;
- buf[j++] = 't';
- __NXML_CHECK_BUF;
- buf[j++] = ';';
- __NXML_CHECK_BUF;
+ buf[j] = 0;
+ func(obj, "%s", buf);
+ j = 0;
}
-
- else
- {
- buf[j++] = str[i];
- __NXML_CHECK_BUF;
- }
- }
-
- if (j)
- {
- buf[j] = 0;
- func (obj, "%s", buf);
- j = 0;
- }
}
static int
-__nxml_write_haslines (char *what)
+__nxml_write_haslines(char *what)
{
- while (what && *what)
- {
- if (*what == '\n')
- return 1;
- what++;
- }
-
- return 0;
+ while (what && *what)
+ {
+ if (*what == '\n')
+ return 1;
+ what++;
+ }
+
+ return 0;
}
static void
-__nxml_write_indent (void (*func) (void *, char *, ...), void *obj,
- int indent)
+__nxml_write_indent(void (*func)(void *, char *, ...), void *obj,
+ int indent)
{
- int i;
- for (i = 0; i < indent; i++)
- func (obj, " ");
+ int i;
+ for (i = 0; i < indent; i++)
+ func(obj, " ");
}
static void
-__nxml_write_newline (void (*func) (void *, char *, ...), void *obj)
+__nxml_write_newline(void (*func)(void *, char *, ...), void *obj)
{
- func (obj, "\n");
+ func(obj, "\n");
}
static void
-__nxml_write_data_text (nxml_data_t * data,
- void (*func) (void *, char *, ...), void *obj)
+__nxml_write_data_text(nxml_data_t *data,
+ void (*func)(void *, char *, ...), void *obj)
{
- __nxml_write_escape_string (func, obj, data->value);
+ __nxml_write_escape_string(func, obj, data->value);
}
static void
-__nxml_write_data_comment (nxml_data_t * data,
- void (*func) (void *, char *, ...), void *obj)
+__nxml_write_data_comment(nxml_data_t *data,
+ void (*func)(void *, char *, ...), void *obj)
{
- func (obj, "<!--%s-->", data->value);
+ func(obj, "<!--%s-->", data->value);
}
static void
-__nxml_write_data_pi (nxml_data_t * data, void (*func) (void *, char *, ...),
- void *obj)
+__nxml_write_data_pi(nxml_data_t *data, void (*func)(void *, char *, ...),
+ void *obj)
{
- func (obj, "<?%s?>", data->value);
+ func(obj, "<?%s?>", data->value);
}
static void
-__nxml_write_data_doctype (nxml_doctype_t * data,
- void (*func) (void *, char *, ...), void *obj)
+__nxml_write_data_doctype(nxml_doctype_t *data,
+ void (*func)(void *, char *, ...), void *obj)
{
- func (obj, "<!DOCTYPE %s %s>", data->name, data->value);
+ func(obj, "<!DOCTYPE %s %s>", data->name, data->value);
}
static void
-__nxml_write_data_element (nxml_data_t * data,
- void (*func) (void *, char *, ...), void *obj)
+__nxml_write_data_element(nxml_data_t *data,
+ void (*func)(void *, char *, ...), void *obj)
{
- nxml_attr_t *attr;
+ nxml_attr_t *attr;
- func (obj, "<");
- if (data->ns && data->ns->prefix)
- func (obj, "%s:", data->ns->prefix);
- func (obj, "%s", data->value);
+ func(obj, "<");
+ if (data->ns && data->ns->prefix)
+ func(obj, "%s:", data->ns->prefix);
+ func(obj, "%s", data->value);
- attr = data->attributes;
- while (attr)
- {
- func (obj, " ");
+ attr = data->attributes;
+ while (attr)
+ {
+ func(obj, " ");
- if (attr->ns && attr->ns->prefix)
- func (obj, "%s:", attr->ns->prefix);
- func (obj, "%s=\"", attr->name);
+ if (attr->ns && attr->ns->prefix)
+ func(obj, "%s:", attr->ns->prefix);
+ func(obj, "%s=\"", attr->name);
- __nxml_write_escape_string (func, obj, attr->value);
- func (obj, "\"");
- attr = attr->next;
- }
+ __nxml_write_escape_string(func, obj, attr->value);
+ func(obj, "\"");
+ attr = attr->next;
+ }
- if (!data->children)
- func (obj, " /");
+ if (!data->children)
+ func(obj, " /");
- func (obj, ">");
+ func(obj, ">");
}
static void
-__nxml_write_data (nxml_t * nxml, nxml_data_t * data,
- void (*func) (void *, char *, ...), void *obj, int indent)
+__nxml_write_data(nxml_t *nxml, nxml_data_t *data,
+ void (*func)(void *, char *, ...), void *obj, int indent)
{
- nxml_data_t *tmp;
- int i;
-
- switch (data->type)
- {
- case NXML_TYPE_TEXT:
- if (data->children || data->next || __nxml_write_haslines (data->value)
- || (data->parent && data->parent->children != data))
- {
- i = 1;
- __nxml_write_indent (func, obj, indent);
- }
- else
- i = 0;
-
- __nxml_write_data_text (data, func, obj);
+ nxml_data_t *tmp;
+ int i;
- if (i)
- __nxml_write_newline (func, obj);
- break;
-
- case NXML_TYPE_COMMENT:
- __nxml_write_indent (func, obj, indent);
- __nxml_write_data_comment (data, func, obj);
- __nxml_write_newline (func, obj);
- break;
-
- case NXML_TYPE_PI:
- __nxml_write_indent (func, obj, indent);
- __nxml_write_data_pi (data, func, obj);
- __nxml_write_newline (func, obj);
- break;
-
- default:
- __nxml_write_indent (func, obj, indent);
- __nxml_write_data_element (data, func, obj);
-
- if (!data->children || data->children->type != NXML_TYPE_TEXT
- || data->children->next
- || __nxml_write_haslines (data->children->value))
- __nxml_write_newline (func, obj);
-
- break;
- }
-
- if (data->children)
- {
- tmp = data->children;
-
- while (tmp)
+ switch (data->type)
{
- __nxml_write_data (nxml, tmp, func, obj, indent + 1);
- tmp = tmp->next;
+ case NXML_TYPE_TEXT:
+ if (data->children || data->next || __nxml_write_haslines(data->value) || (data->parent && data->parent->children != data))
+ {
+ i = 1;
+ __nxml_write_indent(func, obj, indent);
+ }
+ else
+ i = 0;
+
+ __nxml_write_data_text(data, func, obj);
+
+ if (i)
+ __nxml_write_newline(func, obj);
+ break;
+
+ case NXML_TYPE_COMMENT:
+ __nxml_write_indent(func, obj, indent);
+ __nxml_write_data_comment(data, func, obj);
+ __nxml_write_newline(func, obj);
+ break;
+
+ case NXML_TYPE_PI:
+ __nxml_write_indent(func, obj, indent);
+ __nxml_write_data_pi(data, func, obj);
+ __nxml_write_newline(func, obj);
+ break;
+
+ default:
+ __nxml_write_indent(func, obj, indent);
+ __nxml_write_data_element(data, func, obj);
+
+ if (!data->children || data->children->type != NXML_TYPE_TEXT || data->children->next || __nxml_write_haslines(data->children->value))
+ __nxml_write_newline(func, obj);
+
+ break;
}
- if (data->type == NXML_TYPE_ELEMENT)
+ if (data->children)
{
- if (!data->children || data->children->type != NXML_TYPE_TEXT
- || data->children->next || data->children->children
- || __nxml_write_haslines (data->children->value))
- __nxml_write_indent (func, obj, indent);
-
- func (obj, "</");
- if (data->ns && data->ns->prefix)
- func (obj, "%s:", data->ns->prefix);
- func (obj, "%s>", data->value);
-
- __nxml_write_newline (func, obj);
+ tmp = data->children;
+
+ while (tmp)
+ {
+ __nxml_write_data(nxml, tmp, func, obj, indent + 1);
+ tmp = tmp->next;
+ }
+
+ if (data->type == NXML_TYPE_ELEMENT)
+ {
+ if (!data->children || data->children->type != NXML_TYPE_TEXT || data->children->next || data->children->children || __nxml_write_haslines(data->children->value))
+ __nxml_write_indent(func, obj, indent);
+
+ func(obj, "</");
+ if (data->ns && data->ns->prefix)
+ func(obj, "%s:", data->ns->prefix);
+ func(obj, "%s>", data->value);
+
+ __nxml_write_newline(func, obj);
+ }
}
- }
}
static nxml_error_t
-__nxml_write_real (nxml_t * nxml, void (*func) (void *, char *, ...),
- void *obj)
+__nxml_write_real(nxml_t *nxml, void (*func)(void *, char *, ...),
+ void *obj)
{
- nxml_data_t *data;
- nxml_doctype_t *doctype;
+ nxml_data_t *data;
+ nxml_doctype_t *doctype;
- func (obj, "<?xml");
+ func(obj, "<?xml");
- func (obj, " version=\"");
+ func(obj, " version=\"");
- switch (nxml->version)
- {
- case NXML_VERSION_1_0:
- func (obj, "1.0");
- break;
- default:
- func (obj, "1.1");
- }
+ switch (nxml->version)
+ {
+ case NXML_VERSION_1_0:
+ func(obj, "1.0");
+ break;
+ default:
+ func(obj, "1.1");
+ }
- func (obj, "\"");
+ func(obj, "\"");
- if (nxml->encoding)
- func (obj, " encoding=\"%s\"", nxml->encoding);
+ if (nxml->encoding)
+ func(obj, " encoding=\"%s\"", nxml->encoding);
- func (obj, " standalone=\"%s\"?>\n\n", nxml->standalone ? "yes" : "no");
+ func(obj, " standalone=\"%s\"?>\n\n", nxml->standalone ? "yes" : "no");
- doctype = nxml->doctype;
+ doctype = nxml->doctype;
- while (doctype)
- {
- __nxml_write_indent (func, obj, 0);
- __nxml_write_data_doctype (doctype, func, obj);
- __nxml_write_newline (func, obj);
+ while (doctype)
+ {
+ __nxml_write_indent(func, obj, 0);
+ __nxml_write_data_doctype(doctype, func, obj);
+ __nxml_write_newline(func, obj);
- doctype = doctype->next;
- }
+ doctype = doctype->next;
+ }
- data = nxml->data;
+ data = nxml->data;
- while (data)
- {
- __nxml_write_data (nxml, data, func, obj, 0);
+ while (data)
+ {
+ __nxml_write_data(nxml, data, func, obj, 0);
- data = data->next;
- }
+ data = data->next;
+ }
- return NXML_OK;
+ return NXML_OK;
}
static void
-__nxml_file_write (void *obj, char *str, ...)
+__nxml_file_write(void *obj, char *str, ...)
{
- va_list va;
+ va_list va;
- va_start (va, str);
- vfprintf ((FILE *) obj, str, va);
- va_end (va);
+ va_start(va, str);
+ vfprintf((FILE *)obj, str, va);
+ va_end(va);
}
static void
-__nxml_buffer_write (void *obj, char *str, ...)
+__nxml_buffer_write(void *obj, char *str, ...)
{
- va_list va;
- char s[4096];
- int len;
- char **buffer = (char **) obj;
-
- va_start (va, str);
- len = vsnprintf (s, sizeof (s), str, va);
- va_end (va);
-
- if (!*buffer)
- {
- if (!(*buffer = (char *) malloc (sizeof (char) * (len + 1))))
- return;
-
- strcpy (*buffer, s);
- }
- else
- {
- if (!(*buffer = (char *) realloc (*buffer,
- sizeof (char) * (strlen (*buffer) +
- len + 1))))
- return;
-
- strcat (*buffer, s);
- }
+ va_list va;
+ char s[4096];
+ int len;
+ char **buffer = (char **)obj;
+
+ va_start(va, str);
+ len = vsnprintf(s, sizeof(s), str, va);
+ va_end(va);
+
+ if (!*buffer)
+ {
+ if (!(*buffer = (char *)malloc(sizeof(char) * (len + 1))))
+ return;
+
+ strcpy(*buffer, s);
+ }
+ else
+ {
+ if (!(*buffer = (char *)realloc(*buffer,
+ sizeof(char) * (strlen(*buffer) +
+ len + 1))))
+ return;
+
+ strcat(*buffer, s);
+ }
}
/*************************** EXTERNAL FUNCTION ******************************/
nxml_error_t
-nxml_write_file (nxml_t * nxml, char *file)
+nxml_write_file(nxml_t *nxml, char *file)
{
- FILE *fl;
- nxml_error_t ret;
+ FILE *fl;
+ nxml_error_t ret;
- if (!nxml || !file)
- return NXML_ERR_DATA;
+ if (!nxml || !file)
+ return NXML_ERR_DATA;
- if (!(fl = fopen (file, "wb")))
- return NXML_ERR_POSIX;
+ if (!(fl = fopen(file, "wb")))
+ return NXML_ERR_POSIX;
- ret = __nxml_write_real (nxml, __nxml_file_write, fl);
- fclose (fl);
+ ret = __nxml_write_real(nxml, __nxml_file_write, fl);
+ fclose(fl);
- return ret;
+ return ret;
}
nxml_error_t
-nxml_write_buffer (nxml_t * nxml, char **buffer)
+nxml_write_buffer(nxml_t *nxml, char **buffer)
{
- if (!nxml || !buffer)
- return NXML_ERR_DATA;
+ if (!nxml || !buffer)
+ return NXML_ERR_DATA;
- return __nxml_write_real (nxml, __nxml_buffer_write, buffer);
+ return __nxml_write_real(nxml, __nxml_buffer_write, buffer);
}
/* EOF */
diff --git a/plugins/backend/local/local.gresource.xml b/plugins/backend/local/local.gresource.xml
index 65027d08..11fca7cf 100644
--- a/plugins/backend/local/local.gresource.xml
+++ b/plugins/backend/local/local.gresource.xml
@@ -3,7 +3,7 @@
<gresource prefix="/org/gnome/FeedReader">
<file preprocess="xml-stripblanks">icons/64x64/places/feed-service-local.svg</file>
<file preprocess="xml-stripblanks">icons/64x64/places/feed-service-local-symbolic.svg</file>
-
+
<file compressed="true">recommendedFeeds.json</file>
</gresource>
</gresources>
diff --git a/plugins/backend/local/local.plugin b/plugins/backend/local/local.plugin
index 66c7c9de..6f15c8cd 100644
--- a/plugins/backend/local/local.plugin
+++ b/plugins/backend/local/local.plugin
@@ -2,6 +2,7 @@
Module=local
Loader=C
Name=Local RSS Backend
+Version=0.1
Description=Adds a local RSS back-end to FeedReader. No RSS-service required.
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/local/localInterface.vala b/plugins/backend/local/localInterface.vala
index a2d14694..2f80a7ca 100644
--- a/plugins/backend/local/localInterface.vala
+++ b/plugins/backend/local/localInterface.vala
@@ -16,10 +16,222 @@
public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface {
private localUtils m_utils;
+ private Soup.Session m_session;
+ private Gtk.ListBox m_feedlist;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
+ m_db = db;
+ m_db_write = db_write;
m_utils = new localUtils();
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ m_session.timeout = 5;
+ }
+
+ public string getWebsite()
+ {
+ return "http://jangernert.github.io/FeedReader/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.LOCAL | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
+ }
+
+ public string getID()
+ {
+ return "local";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-local";
+ }
+
+ public string serviceName()
+ {
+ return "Local RSS";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var doneLabel = new Gtk.Label(_("Done"));
+ var waitingLabel = new Gtk.Label(_("Adding Feeds"));
+ var waitingSpinner = new Gtk.Spinner();
+ var waitingBox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 5);
+ waitingBox.pack_start(waitingSpinner, false, false, 0);
+ waitingBox.pack_start(waitingLabel, true, false, 0);
+ var loginStack = new Gtk.Stack();
+ loginStack.add_named(doneLabel, "label");
+ loginStack.add_named(waitingBox, "waiting");
+ var loginButton = new Gtk.Button();
+ loginButton.add(loginStack);
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => {
+ tryLogin();
+ loginButton.set_sensitive(false);
+ waitingSpinner.start();
+ loginButton.get_style_context().remove_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginStack.set_visible_child_name("waiting");
+ });
+ loginButton.show_all();
+
+ var headlineLabel = new Gtk.Label("Recommended Feeds:");
+ headlineLabel.get_style_context().add_class("h1");
+ headlineLabel.set_justify(Gtk.Justification.CENTER);
+
+ var loginLabel = new Gtk.Label("Fill your library with feeds. Here are some recommendations.");
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ m_feedlist = new Gtk.ListBox();
+ m_feedlist.set_selection_mode(Gtk.SelectionMode.NONE);
+ m_feedlist.set_sort_func(sortFunc);
+ m_feedlist.set_header_func(headerFunc);
+
+ try
+ {
+ uint8[] contents;
+ var file = File.new_for_uri("resource:///org/gnome/FeedReader/recommendedFeeds.json");
+ file.load_contents(null, out contents, null);
+
+ var parser = new Json.Parser();
+ parser.load_from_data((string)contents);
+
+ Json.Array array = parser.get_root().get_array();
+
+ for (int i = 0; i < array.get_length (); i++)
+ {
+ Json.Object object = array.get_object_element(i);
+
+ m_feedlist.add(
+ new SuggestedFeedRow(
+ object.get_string_member("url"),
+ object.get_string_member("icon"),
+ object.get_string_member("category"),
+ object.get_string_member("name"),
+ object.get_string_member("description"),
+ object.get_string_member("language")
+ )
+ );
+ }
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("localLoginWidget: loading json filed");
+ Logger.error(e.message);
+ }
+
+ var scroll = new Gtk.ScrolledWindow(null, null);
+ scroll.set_size_request(450, 0);
+ scroll.set_halign(Gtk.Align.CENTER);
+ scroll.get_style_context().add_class(Gtk.STYLE_CLASS_FRAME);
+ scroll.add(m_feedlist);
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ box.margin = 50;
+ box.valign = Gtk.Align.FILL;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(headlineLabel, false, false, 0);
+ box.pack_start(loginLabel, false, false, 2);
+ box.pack_start(scroll, true, true, 20);
+ box.pack_end(loginButton, false, false, 0);
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+ return;
+ }
+
+ public void writeData()
+ {
+ return;
+ }
+
+ public async void postLoginAction()
+ {
+ SourceFunc callback = postLoginAction.callback;
+ new GLib.Thread<void*>(null, () => {
+ var children = m_feedlist.get_children();
+ foreach(var r in children)
+ {
+ var row = r as SuggestedFeedRow;
+ if(row.checked())
+ {
+ FeedReaderBackend.get_default().addFeed(row.getURL(), row.getCategory(), false, false);
+ }
+ }
+ Idle.add((owned) callback);
+ return null;
+ });
+ yield;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ private int sortFunc(Gtk.ListBoxRow row1, Gtk.ListBoxRow row2)
+ {
+ var r1 = row1 as SuggestedFeedRow;
+ var r2 = row2 as SuggestedFeedRow;
+
+ string cat1 = r1.getCategory();
+ string cat2 = r2.getCategory();
+
+ string name1 = r1.getName();
+ string name2 = r2.getName();
+
+ if(cat1 != cat2)
+ return cat1.collate(cat2);
+
+ return name1.collate(name2);
+ }
+
+ private void headerFunc(Gtk.ListBoxRow row, Gtk.ListBoxRow? before)
+ {
+ var r1 = row as SuggestedFeedRow;
+ string cat1 = r1.getCategory();
+
+ var label = new Gtk.Label(cat1);
+ label.get_style_context().add_class("bold");
+ label.margin_top = 20;
+ label.margin_bottom = 5;
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ box.pack_start(label, true, true, 0);
+ box.pack_end(new Gtk.Separator(Gtk.Orientation.HORIZONTAL), false, false, 0);
+ box.show_all();
+
+ if(before == null)
+ {
+ row.set_header(box);
+ return;
+ }
+
+ var r2 = before as SuggestedFeedRow;
+ string cat2 = r2.getCategory();
+
+ if(cat1 != cat2)
+ row.set_header(box);
}
@@ -53,7 +265,7 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
return "0";
}
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
return false;
}
@@ -78,6 +290,11 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
return false;
}
+ public bool syncFeedsAndCategories()
+ {
+ return false;
+ }
+
public bool tagIDaffectedByNameChange()
{
return false;
@@ -123,7 +340,7 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
return;
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
return;
}
@@ -147,8 +364,8 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
{
string tagID = "1";
- if(!dbDaemon.get_default().isTableEmpty("tags"))
- tagID = (int.parse(dbDaemon.get_default().getMaxID("tags", "tagID")) + 1).to_string();
+ if(!m_db.isTableEmpty("tags"))
+ tagID = (int.parse(m_db.getMaxID("tags", "tagID")) + 1).to_string();
Logger.info("createTag: ID = " + tagID);
return tagID;
@@ -164,65 +381,67 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
return;
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
- string[] catIDs = {};
-
+ var catIDs = new Gee.ArrayList<string>();
if(catID == null && newCatName != null)
{
string cID = createCategory(newCatName, null);
- var cat = new category(cID, newCatName, 0, 99, CategoryID.MASTER.to_string(), 1);
- var list = new Gee.LinkedList<category>();
+ var cat = new Category(cID, newCatName, 0, 99, CategoryID.MASTER.to_string(), 1);
+ var list = new Gee.LinkedList<Category>();
list.add(cat);
- dbDaemon.get_default().write_categories(list);
- catIDs += cID;
+ m_db_write.write_categories(list);
+ catIDs.add(cID);
}
else if(catID != null && newCatName == null)
{
- catIDs += catID;
+ catIDs.add(catID);
}
else
{
- catIDs += "0";
+ catIDs.add("0");
}
- string feedID = "feedID00001";
+ feedID = "feedID00001";
- if(!dbDaemon.get_default().isTableEmpty("feeds"))
+ if(!m_db.isTableEmpty("feeds"))
{
- feedID = "feedID%05d".printf(int.parse(dbDaemon.get_default().getHighestFeedID().substring(6)) + 1);
+ feedID = "feedID%05d".printf(int.parse(m_db.getMaxID("feeds", "feed_id").substring(6)) + 1);
}
Logger.info(@"addFeed: ID = $feedID");
- feed? Feed = m_utils.downloadFeed(feedURL, feedID, catIDs);
+ Feed? Feed = m_utils.downloadFeed(m_session, feedURL, feedID, catIDs, out errmsg);
if(Feed != null)
{
- var list = new Gee.LinkedList<feed>();
- list.add(Feed);
- dbDaemon.get_default().write_feeds(list);
- return feedID;
+ if(!m_db.feed_exists(Feed.getURL())) {
+ var list = new Gee.LinkedList<Feed>();
+ list.add(Feed);
+ m_db_write.write_feeds(list);
+ return true;
+ }
}
- return "";
+ return false;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
- var finishedFeeds = new Gee.LinkedList<feed>();
+ var finishedFeeds = new Gee.LinkedList<Feed>();
int highestID = 0;
- if(!dbDaemon.get_default().isTableEmpty("feeds"))
- highestID = int.parse(dbDaemon.get_default().getHighestFeedID().substring(6)) + 1;
+ if(!m_db.isTableEmpty("feeds"))
+ highestID = int.parse(m_db.getMaxID("feeds", "feed_id").substring(6)) + 1;
- foreach(feed f in feeds)
+ foreach(Feed f in feeds)
{
string feedID = "feedID" + highestID.to_string("%05d");
highestID++;
Logger.info(@"addFeed: ID = $feedID");
- feed? Feed = m_utils.downloadFeed(f.getXmlUrl(), feedID, f.getCatIDs());
+ string errmsg = "";
+ Feed? Feed = m_utils.downloadFeed(m_session, f.getXmlUrl(), feedID, f.getCatIDs(), out errmsg);
if(Feed != null)
{
@@ -240,7 +459,7 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
Logger.debug("finishedFeed: " + feed.getTitle());
}
- dbDaemon.get_default().write_feeds(finishedFeeds);
+ m_db_write.write_feeds(finishedFeeds);
}
public void removeFeed(string feedID)
@@ -263,12 +482,12 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
{
string catID = "catID00001";
- if(!dbDaemon.get_default().isTableEmpty("categories"))
+ if(!m_db.isTableEmpty("categories"))
{
- string? id = dbDaemon.get_default().getCategoryID(title);
+ string? id = m_db.getCategoryID(title);
if(id == null)
{
- catID = "catID%05d".printf(int.parse(dbDaemon.get_default().getMaxID("categories", "categorieID").substring(5)) + 1);
+ catID = "catID%05d".printf(int.parse(m_db.getMaxID("categories", "categorieID").substring(5)) + 1);
}
else
{
@@ -306,26 +525,8 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
parser.parse();
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- var cats = dbDaemon.get_default().read_categories();
- foreach(category cat in cats)
- {
- categories.add(cat);
- }
-
- var t = dbDaemon.get_default().read_tags();
- foreach(tag Tag in t)
- {
- tags.add(Tag);
- }
-
- var f = dbDaemon.get_default().read_feeds();
- foreach(feed Feed in f)
- {
- feeds.add(Feed);
- }
-
return true;
}
@@ -334,121 +535,156 @@ public class FeedReader.localInterface : Peas.ExtensionBase, FeedServerInterface
return 0;
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
- var f = dbDaemon.get_default().read_feeds();
- var articleArray = new Gee.LinkedList<article>();
+ var feeds = m_db.read_feeds();
+ var articles = new Gee.ArrayList<Article>();
+ GLib.Mutex mutex = GLib.Mutex();
- foreach(feed Feed in f)
+ try
{
- Logger.debug("getArticles for feed: " + Feed.getTitle());
- string url = Feed.getXmlUrl().escape("");
+ var threads = new ThreadPool<Feed>.with_owned_data((feed) => {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
- if(url == null || url == "" || GLib.Uri.parse_scheme(url) == null)
- {
- Logger.error("no valid URL");
- continue;
- }
+ Logger.debug("getArticles for feed: " + feed.getTitle());
+ string url = feed.getXmlUrl().escape("");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.timeout = 5;
- var msg = new Soup.Message("GET", url);
- session.send_message(msg);
- string xml = (string)msg.response_body.flatten().data;
+ if(url == null || url == "" || GLib.Uri.parse_scheme(url) == null)
+ {
+ Logger.error("no valid URL");
+ return;
+ }
- // parse
- Rss.Parser parser = new Rss.Parser();
- try
- {
- parser.load_from_data(xml, xml.length);
- }
- catch(GLib.Error e)
- {
- Logger.error("localInterface.getArticles: %s".printf(e.message));
- }
- var doc = parser.get_document();
- string? locale = null;
- if(doc.encoding != null
- && doc.encoding != "")
- {
- locale = doc.encoding;
- }
+ var msg = new Soup.Message("GET", url);
+ var session = new Soup.Session();
+ session.user_agent = Constants.USER_AGENT;
+ session.timeout = 5;
+ session.send_message(msg);
+ string xml = (string)msg.response_body.flatten().data;
- var articles = doc.get_items();
- foreach(Rss.Item item in articles)
- {
- string? articleID = item.guid;
+ // parse
+ Rss.Parser parser = new Rss.Parser();
+ try
+ {
+ parser.load_from_data(xml, xml.length);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("localInterface.getArticles: %s".printf(e.message));
+ return;
+ }
+ var doc = parser.get_document();
+
+ string? locale = null;
+ if(doc.encoding != null
+ && doc.encoding != "")
+ {
+ locale = doc.encoding;
+ }
- if(articleID != null)
- articleID = articleID.replace(":", "_").replace("/", "_").replace(" ", "").replace(",", "_");
- else
+ Logger.debug("Got %u articles".printf(doc.get_items().length()));
+ var newArticles = new Gee.ArrayList<Article>();
+ foreach(Rss.Item item in doc.get_items())
{
- Logger.warning("no valid ID - using URL as ID");
- if(item.link == null)
+ string? articleID = item.guid;
+
+ if(articleID == null)
{
- Logger.warning("no valid URL as well? what the hell man? I'm giving up");
- continue;
+ if(item.link == null)
+ {
+ Logger.warning("no valid id and no valid URL as well? what the hell man? I'm giving up");
+ continue;
+ }
+
+ articleID = item.link;
}
- articleID = item.link;
- }
+ var date = Rfc822.parseDate(item.pub_date);
+ if (date != null)
+ {
+ Logger.info(@"Parsed $(item.pub_date) as $(date.to_string())");
+ }
+ else
+ {
+ if (item.pub_date != null)
+ Logger.warning(@"RFC 822 date parser failed to parse $(item.pub_date). Falling back to DateTime.now()");
+ date = new DateTime.now_local();
+ }
+ //Logger.info("Got content: " + item.description);
+ string? content = m_utils.convert(item.description, locale);
+ //Logger.info("Converted to: " + item.description);
+ if(content == null)
+ content = _("Nothing to read here.");
- var date = new GLib.DateTime.now_local();
+ var enclosures = new Gee.ArrayList<Enclosure>();
- if(item.pub_date != null)
- {
- GLib.Time time = GLib.Time();
- time.strptime(item.pub_date, "%a, %d %b %Y %H:%M:%S %Z");
- date = new GLib.DateTime.local(1900 + time.year, 1 + time.month, time.day, time.hour, time.minute, time.second);
+ if(item.enclosure_url != null)
+ {
+ // FIXME: check what type of media we actually got
+ enclosures.add(new Enclosure(articleID, item.enclosure_url, EnclosureType.FILE));
+ }
- if(date == null)
- date = new GLib.DateTime.now_local();
+ string articleURL = item.link;
+ if(articleURL.has_prefix("/"))
+ articleURL = feed.getURL() + articleURL.substring(1);
+
+ var article = new Article(
+ articleID,
+ (item.title != null) ? m_utils.convert(item.title, locale) : null,
+ articleURL,
+ feed.getFeedID(),
+ ArticleStatus.UNREAD,
+ ArticleStatus.UNMARKED,
+ content,
+ content,
+ m_utils.convert(item.author, locale),
+ date,
+ 0,
+ null,
+ enclosures
+ );
+
+ Logger.debug("Got new article: " + article.getTitle());
+
+ newArticles.add(article);
}
- string? content = m_utils.convert(item.description, locale);
-
- if(content == null)
- content = _("Nothing to read here.");
-
- string media = "";
- if(item.enclosure_url != null)
- media = item.enclosure_url;
-
- string articleURL = item.link;
- if(articleURL.has_prefix("/"))
- articleURL = Feed.getURL() + articleURL.substring(1);
-
- var Article = new article
- (
- articleID,
- (item.title != null) ? m_utils.convert(item.title, locale) : "No Title :(",
- articleURL,
- Feed.getFeedID(),
- ArticleStatus.UNREAD,
- ArticleStatus.UNMARKED,
- content,
- Utils.UTF8fix(content, true),
- m_utils.convert(item.author, locale),
- date,
- 0,
- "",
- media
- );
+ mutex.lock();
+ articles.add_all(newArticles);
+ mutex.unlock();
+ }, (int)GLib.get_num_processors(), true);
- articleArray.add(Article);
+ foreach(Feed feed in feeds)
+ {
+ try
+ {
+ threads.add(feed);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Error creating thread to download Feed %s: %s".printf(feed.getTitle(), e.message));
+ }
}
+
+ bool immediate = false; // allow to queue up additional tasks
+ bool wait = true; // function will block until all tasks are done
+ ThreadPool.free((owned)threads, immediate, wait);
+ }
+ catch(Error e)
+ {
+ Logger.error("Error creating threads to download Feeds: " + e.message);
}
- articleArray.sort((a, b) => {
- return strcmp(a.getArticleID(), b.getArticleID());
+ articles.sort((a, b) => {
+ return strcmp(a.getArticleID(), b.getArticleID());
});
- if(articleArray.size > 0)
+ if(articles.size > 0)
{
- dbDaemon.get_default().write_articles(articleArray);
- Logger.debug("localInterface: %i articles written".printf(articleArray.size));
- updateFeedList();
+ m_db_write.write_articles(articles);
+ Logger.debug("localInterface: %i articles written".printf(articles.size));
+ refreshFeedListCounter();
updateArticleList();
}
}
diff --git a/plugins/backend/local/localLoginWidget.vala b/plugins/backend/local/localLoginWidget.vala
deleted file mode 100644
index 4039c793..00000000
--- a/plugins/backend/local/localLoginWidget.vala
+++ /dev/null
@@ -1,248 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.localLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- public Logger m_logger { get; construct set; }
- private Gtk.ListBox m_feedlist;
-
- public void init()
- {
- logger = m_logger;
- }
-
- public string getWebsite()
- {
- return "http://jangernert.github.io/FeedReader/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.LOCAL | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
- }
-
- public string getID()
- {
- return "local";
- }
-
- public string iconName()
- {
- return "feed-service-local";
- }
-
- public string serviceName()
- {
- return "Local RSS";
- }
-
- public bool needWebLogin()
- {
- return false;
- }
-
- public Gtk.Box? getWidget()
- {
- var doneLabel = new Gtk.Label(_("Done"));
- var waitingLabel = new Gtk.Label(_("Adding Feeds"));
- var waitingSpinner = new Gtk.Spinner();
- var waitingBox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 5);
- waitingBox.pack_start(waitingSpinner, false, false, 0);
- waitingBox.pack_start(waitingLabel, true, false, 0);
- var loginStack = new Gtk.Stack();
- loginStack.add_named(doneLabel, "label");
- loginStack.add_named(waitingBox, "waiting");
- var loginButton = new Gtk.Button();
- loginButton.add(loginStack);
- loginButton.halign = Gtk.Align.END;
- loginButton.set_size_request(80, 30);
- loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginButton.clicked.connect(() => {
- login();
- loginButton.set_sensitive(false);
- waitingSpinner.start();
- loginButton.get_style_context().remove_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginStack.set_visible_child_name("waiting");
- });
- loginButton.show_all();
-
- var headlineLabel = new Gtk.Label("Recommended Feeds:");
- headlineLabel.get_style_context().add_class("h1");
- headlineLabel.set_justify(Gtk.Justification.CENTER);
-
- var loginLabel = new Gtk.Label("Fill your library with feeds. Here are some recommendations.");
- loginLabel.get_style_context().add_class("h2");
- loginLabel.set_justify(Gtk.Justification.CENTER);
- loginLabel.set_lines(3);
-
- m_feedlist = new Gtk.ListBox();
- m_feedlist.set_selection_mode(Gtk.SelectionMode.NONE);
- m_feedlist.set_sort_func(sortFunc);
- m_feedlist.set_header_func(headerFunc);
-
- try
- {
- uint8[] contents;
- var file = File.new_for_uri("resource:///org/gnome/FeedReader/recommendedFeeds.json");
- file.load_contents(null, out contents, null);
-
- var parser = new Json.Parser();
- parser.load_from_data((string)contents);
-
- Json.Array array = parser.get_root().get_array();
-
- for (int i = 0; i < array.get_length (); i++)
- {
- Json.Object object = array.get_object_element(i);
-
- m_feedlist.add(
- new SuggestedFeedRow(
- object.get_string_member("url"),
- object.get_string_member("category"),
- object.get_string_member("name"),
- object.get_string_member("description"),
- object.get_string_member("language")
- )
- );
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("localLoginWidget: loading json filed");
- Logger.error(e.message);
- }
-
- var scroll = new Gtk.ScrolledWindow(null, null);
- scroll.set_size_request(450, 0);
- scroll.set_halign(Gtk.Align.CENTER);
- scroll.get_style_context().add_class(Gtk.STYLE_CLASS_FRAME);
- scroll.add(m_feedlist);
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
- box.margin = 50;
- box.valign = Gtk.Align.FILL;
- box.halign = Gtk.Align.CENTER;
- box.pack_start(headlineLabel, false, false, 0);
- box.pack_start(loginLabel, false, false, 2);
- box.pack_start(scroll, true, true, 20);
- box.pack_end(loginButton, false, false, 0);
- return box;
- }
-
- public void showHtAccess()
- {
- return;
- }
-
- public void writeData()
- {
- return;
- }
-
- public async void postLoginAction()
- {
- SourceFunc callback = postLoginAction.callback;
- new GLib.Thread<void*>(null, () => {
- var children = m_feedlist.get_children();
- foreach(var r in children)
- {
- var row = r as SuggestedFeedRow;
- if(row.checked())
- {
- try
- {
- DBusConnection.get_default().addFeed(row.getURL(), row.getCategory(), false, false);
- }
- catch(GLib.Error e)
- {
- Logger.error("localLoginWidget.postLoginAction: %s".printf(e.message));
- }
- }
- }
- Idle.add((owned) callback);
- return null;
- });
- yield;
- }
-
- public string buildLoginURL()
- {
- return "";
- }
-
- public bool extractCode(string redirectURL)
- {
- return false;
- }
-
- private int sortFunc(Gtk.ListBoxRow row1, Gtk.ListBoxRow row2)
- {
- var r1 = row1 as SuggestedFeedRow;
- var r2 = row2 as SuggestedFeedRow;
-
- string cat1 = r1.getCategory();
- string cat2 = r2.getCategory();
-
- string name1 = r1.getName();
- string name2 = r2.getName();
-
- if(cat1 != cat2)
- return cat1.collate(cat2);
-
- return name1.collate(name2);
- }
-
- private void headerFunc(Gtk.ListBoxRow row, Gtk.ListBoxRow? before)
- {
- var r1 = row as SuggestedFeedRow;
- string cat1 = r1.getCategory();
-
- var label = new Gtk.Label(cat1);
- label.get_style_context().add_class("bold");
- label.margin_top = 20;
- label.margin_bottom = 5;
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
- box.pack_start(label, true, true, 0);
- box.pack_end(new Gtk.Separator(Gtk.Orientation.HORIZONTAL), false, false, 0);
- box.show_all();
-
- if(before == null)
- {
- row.set_header(box);
- return;
- }
-
- var r2 = before as SuggestedFeedRow;
- string cat2 = r2.getCategory();
-
- if(cat1 != cat2)
- row.set_header(box);
- }
-}
-
-
-//--------------------------------------------------------------------------------------
-// Boilerplate code for the plugin. Replace "demoLoginWidget" with the name
-// of your interface-class.
-//--------------------------------------------------------------------------------------
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.localLoginWidget));
-}
diff --git a/plugins/backend/local/localUI.plugin b/plugins/backend/local/localUI.plugin
deleted file mode 100644
index f10d3c7e..00000000
--- a/plugins/backend/local/localUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=localUI
-Loader=C
-Name=Local RSS Backend
-Description=Adds a local RSS back-end to FeedReader. No RSS-service required.
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/local/localUtils.vala b/plugins/backend/local/localUtils.vala
index 9e807251..d4e22f8b 100644
--- a/plugins/backend/local/localUtils.vala
+++ b/plugins/backend/local/localUtils.vala
@@ -20,79 +20,59 @@ public class FeedReader.localUtils : GLib.Object {
}
- public feed? downloadFeed(string xmlURL, string feedID, string[] catIDs)
+ public Feed? downloadFeed(Soup.Session session, string xmlURL, string feedID, Gee.List<string> catIDs, out string errmsg)
{
- if(xmlURL == "" || xmlURL == null || GLib.Uri.parse_scheme(xmlURL) == null)
- return null;
+ errmsg = "";
+
+ // download
+ //Logger.debug(@"Requesting: $xmlURL");
+ var msg = new Soup.Message("GET", xmlURL);
+ if (msg == null)
+ {
+ errmsg = @"Couldn't parse feed URL: $xmlURL";
+ Logger.warning(errmsg);
+ return null;
+ }
+ uint status = session.send_message(msg);
+ if(status != 200)
+ {
+ errmsg = "Could not download feed";
+ Logger.warning(errmsg);
+ return null;
+ }
+ string xml = (string)msg.response_body.flatten().data;
+ string url = "https://google.com";
+
+ // parse
+ Rss.Parser parser = new Rss.Parser();
try
{
- // download
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.timeout = 5;
- var msg = new Soup.Message("GET", xmlURL.escape(""));
- session.send_message(msg);
- string xml = (string)msg.response_body.flatten().data;
- bool hasIcon = true;
- string url = "https://google.com";
-
- // parse
- Rss.Parser parser = new Rss.Parser();
parser.load_from_data(xml, xml.length);
- var doc = parser.get_document();
-
- if(doc.link != null
- && doc.link != "")
- url = doc.link;
-
- if(doc.image_url != null
- && doc.image_url != "")
- {
- if(downloadIcon(feedID, doc.image_url))
- {
- // success
- }
- else
- {
- Utils.downloadIcon(feedID, doc.link);
- }
- }
- else if(doc.link != null
- && doc.link != "")
- {
- Utils.downloadIcon(feedID, doc.link);
- }
- else
- hasIcon = false;
-
- string? title = doc.title;
- if(title == null)
- {
- var uri = new Soup.URI(xmlURL);
- if(uri == null)
- title = _("unknown Feed");
- else
- title = uri.get_host();
- }
-
- var Feed = new feed(
- feedID,
- title,
- url,
- hasIcon,
- 0,
- catIDs,
- xmlURL);
-
- return Feed;
}
- catch(GLib.Error e)
+ catch(Error e)
{
- Logger.error("localInterface - addFeed " + xmlURL + " : " + e.message);
+ errmsg = "Could not parse feed";
+ Logger.warning(errmsg);
+ return null;
}
- return null;
+ var doc = parser.get_document();
+
+ if(doc.link != null
+ && doc.link != "")
+ url = doc.link;
+
+ var Feed = new Feed(
+ feedID,
+ doc.title,
+ url,
+ 0,
+ catIDs,
+ doc.image_url,
+ xmlURL);
+
+ return Feed;
}
public string? convert(string? text, string? locale)
@@ -101,11 +81,13 @@ public class FeedReader.localUtils : GLib.Object {
return null;
if(locale == null)
- return Utils.UTF8fix(text, false);
+ //return Utils.UTF8fix(text, false);
+ return text;
try
{
- return Utils.UTF8fix(GLib.convert(text, -1, "utf-8", locale), false);
+ //return Utils.UTF8fix(GLib.convert(text, -1, "utf-8", locale), false);
+ return GLib.convert(text, -1, "utf-8", locale);
}
catch(ConvertError e)
{
@@ -130,62 +112,4 @@ public class FeedReader.localUtils : GLib.Object {
}
return false;
}
-
- private bool downloadIcon(string feed_id, string icon_url)
- {
- if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
- return false;
-
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e){
- Logger.debug(e.message);
- }
- }
-
- string local_filename = icon_path + feed_id + ".ico";
-
- if(!FileUtils.test(local_filename, GLib.FileTest.EXISTS))
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message("GET", icon_url);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.ssl_strict = false;
- var status = session.send_message(message_dlIcon);
- if(status == 200)
- {
- try{
- FileUtils.set_contents( local_filename,
- (string)message_dlIcon.response_body.flatten().data,
- (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- return true;
- }
- else
- {
- Logger.error(@"Error downloading icon for feed: $feed_id - $icon_url");
- }
-
- return false;
- }
-
- // file already exists
- return true;
- }
}
diff --git a/plugins/backend/local/meson.build b/plugins/backend/local/meson.build
new file mode 100644
index 00000000..6a51f8a0
--- /dev/null
+++ b/plugins/backend/local/meson.build
@@ -0,0 +1,95 @@
+local_resources = gnome.compile_resources(
+ 'local_res',
+ 'local.gresource.xml'
+)
+
+subdir('libnxml')
+subdir('libmrss')
+subdir('rss-glib')
+
+
+rss_glib_dir = join_paths(meson.current_source_dir(), 'rss-glib/')
+rss_glib_vapi = vala_compiler.find_library('rss-glib-1.0', dirs: rss_glib_dir)
+lib_rss_glib = declare_dependency(
+ link_with: rss_glib_lib,
+ include_directories: rss_glib_inc,
+ dependencies: rss_glib_vapi
+)
+
+plugin_lib = shared_library(
+ 'local',
+ [
+ 'localInterface.vala',
+ 'localUtils.vala',
+ 'Rfc822.vala',
+ 'SuggestedFeedRow.vala'
+ ],
+ local_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ libcurl,
+ lib_rss_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib,
+ mrss_lib,
+ nxml_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'local.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
+
+plugin_test = executable(
+ 'test_local',
+ [
+ 'TestLocalRSS.vala'
+ ],
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ libcurl,
+ lib_rss_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ plugin_lib,
+ feedreader_lib,
+ mrss_lib,
+ nxml_lib
+ ],
+ include_directories: include_directories('../../..')
+)
+
+if gtester.found()
+ test('Local plugin', gtester, args:['-k', '-o', meson.build_root() + '/local.gtester.log', plugin_test])
+else
+ test('Local plugin', plugin_test)
+endif
diff --git a/plugins/backend/local/recommendedFeeds.json b/plugins/backend/local/recommendedFeeds.json
index 95b40da1..e1013299 100644
--- a/plugins/backend/local/recommendedFeeds.json
+++ b/plugins/backend/local/recommendedFeeds.json
@@ -1,94 +1,115 @@
[
- {
- "url": "http://planet.gnome.org/atom.xml",
- "name": "Planet GNOME",
- "description": "All your favorite blogs about the GNOME project in one place.",
- "category": "Free Software",
- "language": "English"
- },
- {
- "url": "http://blog.elementary.io/rss",
- "name": "elementary OS Blog",
- "description": "The latest updates from the makers of the fast and open replacement for Windows and OS X.",
- "category": "Free Software",
- "language": "English"
- },
- {
- "url": "https://feeds.feedburner.com/d0od",
- "name": "OMG! Ubuntu!",
- "description": "Ubuntu/Linux News",
- "category": "Free Software",
- "language": "English"
- },
-
- {
- "url": "http://rss.golem.de/rss.php?feed=ATOM1.0",
- "name": "Golem.de",
- "description": "Ständig aktuelle IT-News für Profis und Videos aus Politik, Wirtschaft und Wissenschaft über Hardware, Software, Telekommunikation, Games",
- "category": "Technology",
- "language": "German"
- },
- {
- "url": "http://www.heise.de/newsticker/heise-atom.xml",
- "name": "Heise.de",
- "description": "News und Foren zu Computer, IT, Wissenschaft, Medien und Politik. Preisvergleich von Hardware und Software sowie Downloads bei Heise Medien.",
- "category": "Technology",
- "language": "German"
- },
- {
- "url": "http://rss.sueddeutsche.de/rss/Topthemen",
- "name": "Sueddeutsche Zeitung",
- "description": "Nachrichten aus Politik, Kultur, Wirtschaft und Sport",
- "category": "News",
- "language": "German"
- },
- {
- "url": "http://planetkde.org/rss20.xml",
- "name": "Planet KDE",
- "description": "All your favorite blogs about the KDE project in one place.",
- "category": "Free Software",
- "language": "English"
- },
- {
- "url": "http://www.phoronix.com/rss.php",
- "name": "Phoronix",
- "description": "Phoronix is the leading technology website for Linux hardware reviews, open-source news, Linux benchmarks, open-source benchmarks, and computer hardware tests.",
- "category": "Free Software",
- "language": "English"
- },
- {
- "url": "http://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml",
- "name": "New York Times",
- "description": "The New York Times: Find breaking news, multimedia, reviews & opinion on Washington, business, sports, movies, travel, books, jobs, education, real estate, cars & more at nytimes.com.",
- "category": "News",
- "language": "English"
- },
- {
- "url": "http://feeds.bbci.co.uk/news/rss.xml",
- "name": "BBC News",
- "description": "Visit BBC News for up-to-the-minute news, breaking news, video, audio and feature stories. BBC News provides trusted World and UK news as well as local and regional perspectives. Also entertainment, business, science, technology and health news.",
- "category": "News",
- "language": "English"
- },
- {
- "url": "http://feed.cnet.com/feed/topics/tech-industry",
- "name": "CNET",
- "description": "CNET is the world's leader in tech product reviews, news, prices, videos, forums, how-tos and more.",
- "category": "Technology",
- "language": "English"
- },
- {
- "url": "http://feeds.gawker.com/lifehacker/full",
- "name": "Lifehacker",
- "description": "Lifehacker is a weblog about life hacks and software and covers a wide range of topics including: Microsoft Windows, Mac, Linux programs, iOS and Android, as well as general life tips and tricks.",
- "category": "Technology",
- "language": "English"
- },
- {
- "url": "http://feeds.arstechnica.com/arstechnica/index?format=xml",
- "name": "Ars Technica",
- "description": "Ars Technica is a weblog for technology news, tech policy analysis, breakdowns of the latest scientific advancements, gadget reviews, software, hardware, and nearly everything else found in between layers of silicon.",
- "category": "Technology",
- "language": "English"
- }
+ {
+ "url": "http://planet.gnome.org/atom.xml",
+ "icon": "http://planet.gnome.org/img/30/favicon.png",
+ "name": "Planet GNOME",
+ "description": "All your favorite blogs about the GNOME project in one place.",
+ "category": "Free Software",
+ "language": "English"
+ },
+ {
+ "url": "http://blog.elementary.io/rss",
+ "icon": "http://68.media.tumblr.com/avatar_edb79deb3524_128.png",
+ "name": "elementary OS Blog",
+ "description": "The latest updates from the makers of the fast and open replacement for Windows and OS X.",
+ "category": "Free Software",
+ "language": "English"
+ },
+ {
+ "url": "https://feeds.feedburner.com/d0od",
+ "icon": "http://www.omgubuntu.co.uk/wp-content/uploads/2012/07/omg-ubuntu-logo-32x32.jpg",
+ "name": "OMG! Ubuntu!",
+ "description": "Ubuntu/Linux News",
+ "category": "Free Software",
+ "language": "English"
+ },
+
+ {
+ "url": "http://rss.golem.de/rss.php?feed=ATOM1.0",
+ "icon": "https://www.golem.de/favicon.ico",
+ "name": "Golem.de",
+ "description": "Ständig aktuelle IT-News für Profis und Videos aus Politik, Wirtschaft und Wissenschaft über Hardware, Software, Telekommunikation, Games",
+ "category": "Technology",
+ "language": "German"
+ },
+ {
+ "url": "http://www.heise.de/newsticker/heise-atom.xml",
+ "icon": "https://www.heise.de/favicon.ico",
+ "name": "Heise.de",
+ "description": "News und Foren zu Computer, IT, Wissenschaft, Medien und Politik. Preisvergleich von Hardware und Software sowie Downloads bei Heise Medien.",
+ "category": "Technology",
+ "language": "German"
+ },
+ {
+ "url": "http://rss.sueddeutsche.de/rss/Topthemen",
+ "icon": "http://www.sueddeutsche.de/favicon.ico",
+ "name": "Sueddeutsche Zeitung",
+ "description": "Nachrichten aus Politik, Kultur, Wirtschaft und Sport",
+ "category": "News",
+ "language": "German"
+ },
+ {
+ "url": "http://planetkde.org/rss20.xml",
+ "icon": "https://planet.kde.org/favicon.ico",
+ "name": "Planet KDE",
+ "description": "All your favorite blogs about the KDE project in one place.",
+ "category": "Free Software",
+ "language": "English"
+ },
+ {
+ "url": "http://www.phoronix.com/rss.php",
+ "icon": "http://phoronix.com/favicon.ico",
+ "name": "Phoronix",
+ "description": "Phoronix is the leading technology website for Linux hardware reviews, open-source news, Linux benchmarks, open-source benchmarks, and computer hardware tests.",
+ "category": "Free Software",
+ "language": "English"
+ },
+ {
+ "url": "http://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml",
+ "icon": "http://www.nytimes.com/favicon.ico",
+ "name": "New York Times",
+ "description": "The New York Times: Find breaking news, multimedia, reviews & opinion on Washington, business, sports, movies, travel, books, jobs, education, real estate, cars & more at nytimes.com.",
+ "category": "News",
+ "language": "English"
+ },
+ {
+ "url": "http://feeds.bbci.co.uk/news/rss.xml",
+ "icon": "http://static.bbci.co.uk/wwhp/1.117.0/responsive/img/apple-touch/apple-touch-180.jpg",
+ "name": "BBC News",
+ "description": "Visit BBC News for up-to-the-minute news, breaking news, video, audio and feature stories. BBC News provides trusted World and UK news as well as local and regional perspectives. Also entertainment, business, science, technology and health news.",
+ "category": "News",
+ "language": "English"
+ },
+ {
+ "url": "http://feed.cnet.com/feed/topics/tech-industry",
+ "icon": "https://www.cnet.com/favicon.ico",
+ "name": "CNET",
+ "description": "CNET is the world's leader in tech product reviews, news, prices, videos, forums, how-tos and more.",
+ "category": "Technology",
+ "language": "English"
+ },
+ {
+ "url": "http://feeds.gawker.com/lifehacker/full",
+ "icon": "https://i.kinja-img.com/gawker-media/image/upload/s--N2eqEvT8--/c_fill,fl_progressive,g_center,h_80,q_80,w_80/u0939doeuioaqhspkjyc.png",
+ "name": "Lifehacker",
+ "description": "Lifehacker is a weblog about life hacks and software and covers a wide range of topics including: Microsoft Windows, Mac, Linux programs, iOS and Android, as well as general life tips and tricks.",
+ "category": "Technology",
+ "language": "English"
+ },
+ {
+ "url": "http://feeds.arstechnica.com/arstechnica/index?format=xml",
+ "icon": "https://cdn.arstechnica.net/favicon.ico",
+ "name": "Ars Technica",
+ "description": "Ars Technica is a weblog for technology news, tech policy analysis, breakdowns of the latest scientific advancements, gadget reviews, software, hardware, and nearly everything else found in between layers of silicon.",
+ "category": "Technology",
+ "language": "English"
+ },
+ {
+ "url": "https://www.gamingonlinux.com/article_rss.php",
+ "icon": "view-source:https://www.gamingonlinux.com/templates/default/images/favicons/favicon.ico",
+ "name": "GamingOnLinux",
+ "description": "GamingOnLinux is the home of Linux and SteamOS gaming. Covering Linux Games, SteamOS, Reviews and more.",
+ "category": "Games",
+ "language": "English"
+ }
]
diff --git a/plugins/backend/local/rss-glib/CMakeLists.txt b/plugins/backend/local/rss-glib/CMakeLists.txt
deleted file mode 100644
index 4618e834..00000000
--- a/plugins/backend/local/rss-glib/CMakeLists.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
-find_package(GLIB)
-include_directories(${GLIB_INCLUDE_DIRS})
-include_directories(../libmrss)
-
-add_library(rss-glib STATIC
- rss-document.c
- rss-document.h
- rss-document-private.h
- rss-marshal.c
- rss-marshal.h
- rss-glib.h
- rss-item.c
- rss-item.h
- rss-item-private.h
- rss-parser.c
- rss-parser.h
- rss-parser-private.h
- rss-version.h)
diff --git a/plugins/backend/local/rss-glib/meson.build b/plugins/backend/local/rss-glib/meson.build
new file mode 100644
index 00000000..05c5be84
--- /dev/null
+++ b/plugins/backend/local/rss-glib/meson.build
@@ -0,0 +1,12 @@
+rss_glib_inc = include_directories(['.', '../libmrss'])
+rss_glib_lib = static_library(
+ 'rss-glib',
+ [
+ 'rss-document.c',
+ 'rss-marshal.c',
+ 'rss-item.c',
+ 'rss-parser.c'
+ ],
+ include_directories: rss_glib_inc,
+ dependencies: glib
+)
diff --git a/plugins/backend/meson.build b/plugins/backend/meson.build
new file mode 100644
index 00000000..ff8f0f04
--- /dev/null
+++ b/plugins/backend/meson.build
@@ -0,0 +1,22 @@
+supported_backend_plugins = [
+ 'bazqux',
+ 'feedbin',
+ 'feedhq',
+ 'feedly',
+ 'fresh',
+ 'inoreader',
+ 'local',
+ 'oldreader',
+ 'owncloud',
+ 'ttrss'
+]
+backend_plugins = get_option('backend-plugins')
+
+foreach backend_plugin: supported_backend_plugins
+ if backend_plugins.contains(backend_plugin.to_lower())
+ message('Backend Plugin: ' + backend_plugin + ' ON')
+ subdir(backend_plugin)
+ else
+ message('Backend Plugin: ' + backend_plugin + ' OFF')
+ endif
+endforeach
diff --git a/plugins/backend/oldreader/CMakeLists.txt b/plugins/backend/oldreader/CMakeLists.txt
deleted file mode 100644
index 4a5aca9b..00000000
--- a/plugins/backend/oldreader/CMakeLists.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-set (NAME oldreader)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- oldreaderAPI.vala
- oldreaderInterface.vala
- oldreaderUtils.vala
- oldreaderConnection.vala
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- oldreaderLoginWidget.vala
- oldreaderUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
-
diff --git a/plugins/backend/oldreader/meson.build b/plugins/backend/oldreader/meson.build
new file mode 100644
index 00000000..f0738858
--- /dev/null
+++ b/plugins/backend/oldreader/meson.build
@@ -0,0 +1,49 @@
+oldreader_resources = gnome.compile_resources(
+ 'oldreader_res',
+ 'oldreader.gresource.xml'
+)
+
+shared_library(
+ 'oldreader',
+ [
+ 'oldreaderAPI.vala',
+ 'oldreaderInterface.vala',
+ 'oldreaderUtils.vala',
+ 'oldreaderConnection.vala'
+ ],
+ oldreader_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.oldreader.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'oldreader.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/oldreader/oldreader.plugin b/plugins/backend/oldreader/oldreader.plugin
index c2d8e632..1f6312f3 100644
--- a/plugins/backend/oldreader/oldreader.plugin
+++ b/plugins/backend/oldreader/oldreader.plugin
@@ -2,6 +2,7 @@
Module=oldreader
Loader=C
Name=TheOldReader
+Version=0.1
Description=Add TheOldReader backend to FeedReader
Authors=Anwesh Reddy <kanishkablack@gmx.com>
Copyright=Copyright © 2015-16 Anwesh Reddy
diff --git a/plugins/backend/oldreader/oldreaderAPI.vala b/plugins/backend/oldreader/oldreaderAPI.vala
index 7d650d8a..68be1030 100644
--- a/plugins/backend/oldreader/oldreaderAPI.vala
+++ b/plugins/backend/oldreader/oldreaderAPI.vala
@@ -24,11 +24,13 @@ public class FeedReader.OldReaderAPI : GLib.Object {
private OldReaderConnection m_connection;
private OldReaderUtils m_utils;
private string m_userID;
+ private DataBaseReadOnly m_db;
- public OldReaderAPI()
+ public OldReaderAPI(OldReaderUtils utils, DataBaseReadOnly db)
{
- m_utils = new OldReaderUtils();
- m_connection = new OldReaderConnection();
+ m_db = db;
+ m_utils = utils;
+ m_connection = new OldReaderConnection(m_utils);
}
public LoginResponse login()
@@ -54,11 +56,15 @@ public class FeedReader.OldReaderAPI : GLib.Object {
private bool getUserID()
{
Logger.debug("getUserID: getting user info");
- string response = m_connection.send_get_request("user-info?output=json");
+ var response = m_connection.send_get_request("user-info?output=json");
+
+ if(response.status != 200)
+ return false;
+
var parser = new Json.Parser();
try
{
- parser.load_from_data(response, -1);
+ parser.load_from_data(response.data, -1);
}
catch(Error e)
{
@@ -79,17 +85,21 @@ public class FeedReader.OldReaderAPI : GLib.Object {
return false;
}
- public bool getFeeds(Gee.LinkedList<feed> feeds)
+ public bool getFeeds(Gee.List<Feed> feeds)
{
- string response = m_connection.send_get_request("subscription/list?output=json");
- if(response == "" || response == null)
+ var response = m_connection.send_get_request("subscription/list?output=json");
+
+ if(response.status != 200)
return false;
+
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getFeeds: Could not load message response");
Logger.error(e.message);
return false;
@@ -104,53 +114,42 @@ public class FeedReader.OldReaderAPI : GLib.Object {
string feedID = object.get_string_member("id");
string url = object.has_member("htmlUrl") ? object.get_string_member("htmlUrl") : object.get_string_member("url");
- string icon_url = object.has_member("iconUrl") ? object.get_string_member("iconUrl") : "";
- if(icon_url != "" && !m_utils.downloadIcon(feedID, "https:"+icon_url))
- {
- icon_url = "";
- }
-
- string title = "No Title";
- if(object.has_member("title"))
- {
- title = object.get_string_member("title");
- }
- else
- {
- title = Utils.URLtoFeedName(url);
- }
uint catCount = object.get_array_member("categories").get_length();
- string[] categories = {};
-
+ var categories = new Gee.ArrayList<string>();
for(uint j = 0; j < catCount; ++j)
{
- categories += object.get_array_member("categories").get_object_element(j).get_string_member("id");
+ categories.add(object.get_array_member("categories").get_object_element(j).get_string_member("id"));
}
+
feeds.add(
- new feed (
+ new Feed(
feedID,
- title,
+ object.get_string_member("title"),
url,
- (icon_url == "") ? false : true,
0,
- categories
+ categories,
+ object.get_string_member("iconUrl")
)
);
}
return true;
}
- public bool getCategoriesAndTags(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getCategoriesAndTags(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags)
{
- string response = m_connection.send_get_request("tag/list?output=json");
- if(response == "" || response == null)
+ var response = m_connection.send_get_request("tag/list?output=json");
+
+ if(response.status != 200)
return false;
+
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getCategoriesAndTags: Could not load message response");
Logger.error(e.message);
return false;
@@ -170,7 +169,7 @@ public class FeedReader.OldReaderAPI : GLib.Object {
if(id.contains("/label/"))
{
categories.add(
- new category(
+ new Category(
id,
title,
0,
@@ -188,13 +187,18 @@ public class FeedReader.OldReaderAPI : GLib.Object {
public int getTotalUnread()
{
- string response = m_connection.send_get_request("unread-count?output=json");
+ var response = m_connection.send_get_request("unread-count?output=json");
+
+ if(response.status != 200)
+ return 0;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getTotalUnread: Could not load message response");
Logger.error(e.message);
}
@@ -219,21 +223,28 @@ public class FeedReader.OldReaderAPI : GLib.Object {
}
- public string? updateArticles(Gee.LinkedList<string> ids, int count, string? continuation = null)
+ public string? updateArticles(Gee.List<string> ids, int count, string? continuation = null)
{
var message_string = "n=" + count.to_string();
message_string += "&xt=user/-/state/com.google/read";
if(continuation != null)
message_string += "&c=" + continuation;
- string response = m_connection.send_get_request("stream/items/ids?output=json&"+message_string);
+
+ var response = m_connection.send_get_request("stream/items/ids?output=json&"+message_string);
+
+ if(response.status != 200)
+ return null;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("updateArticles: Could not load message response");
Logger.error(e.message);
+ return null;
}
var root = parser.get_root().get_object();
@@ -252,7 +263,7 @@ public class FeedReader.OldReaderAPI : GLib.Object {
return null;
}
- public string? getArticles(Gee.LinkedList<article> articles, int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? continuation = null, string? tagID = null, string? feed_id = null)
+ public string? getArticles(Gee.List<Article> articles, int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? continuation = null, string? tagID = null, string? feed_id = null)
{
var message_string = "n=" + count.to_string();
@@ -271,13 +282,18 @@ public class FeedReader.OldReaderAPI : GLib.Object {
api_endpoint += "/" + GLib.Uri.escape_string(feed_id);
else if(tagID != null)
api_endpoint += "/" + GLib.Uri.escape_string(tagID);
- string response = m_connection.send_get_request(api_endpoint+"?output=json&"+message_string);
+ var response = m_connection.send_get_request(api_endpoint+"?output=json&"+message_string);
+
+ if(response.status != 200)
+ return null;
var parser = new Json.Parser();
- try{
- parser.load_from_data(response, -1);
+ try
+ {
+ parser.load_from_data(response.data, -1);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("getCategoriesAndTags: Could not load message response");
Logger.error(e.message);
}
@@ -290,13 +306,13 @@ public class FeedReader.OldReaderAPI : GLib.Object {
{
Json.Object object = array.get_object_element(i);
string id = object.get_string_member("id");
- id = id.substring(id.last_index_of_char('/')+1);
- string tagString = "";
+ id = id.substring(id.last_index_of_char('/') + 1);
bool marked = false;
bool read = false;
var cats = object.get_array_member("categories");
uint cat_length = cats.get_length();
+ var tags = new Gee.ArrayList<string>();
for (uint j = 0; j < cat_length; j++)
{
string cat = cats.get_string_element(j);
@@ -304,11 +320,11 @@ public class FeedReader.OldReaderAPI : GLib.Object {
marked = true;
else if(cat.has_suffix("com.google/read"))
read = true;
- else if(cat.contains("/label/") && dbDaemon.get_default().getTagName(cat) != null)
- tagString += cat;
+ else if(cat.contains("/label/") && m_db.getTagName(cat) != null)
+ tags.add(cat);
}
- string mediaString = "";
+ var enclosures = new Gee.ArrayList<Enclosure>();
if(object.has_member("enclosure"))
{
var attachments = object.get_array_member("enclosure");
@@ -320,15 +336,14 @@ public class FeedReader.OldReaderAPI : GLib.Object {
for(int j = 0; j < mediaCount; ++j)
{
var attachment = attachments.get_object_element(j);
- if(attachment.get_string_member("type").contains("audio")
- || attachment.get_string_member("type").contains("video"))
- {
- mediaString = mediaString + attachment.get_string_member("href") + ",";
- }
+ enclosures.add(
+ new Enclosure(id, attachment.get_string_member("href"),
+ EnclosureType.from_string(attachment.get_string_member("type")))
+ );
}
}
- articles.add(new article(
+ articles.add(new Article(
id,
object.get_string_member("title"),
object.get_array_member("alternate").get_object_element(0).get_string_member("href"),
@@ -336,12 +351,12 @@ public class FeedReader.OldReaderAPI : GLib.Object {
read ? ArticleStatus.READ : ArticleStatus.UNREAD,
marked ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
object.get_object_member("summary").get_string_member("content"),
- "",
- (object.get_string_member("author") == "") ? null : object.get_string_member("author"),
+ null,
+ object.get_string_member("author"),
new DateTime.from_unix_local(object.get_int_member("published")),
-1,
- tagString,
- mediaString
+ tags,
+ enclosures
)
);
}
@@ -391,7 +406,7 @@ public class FeedReader.OldReaderAPI : GLib.Object {
m_connection.send_post_request("rename-tag?output=json", message_string);
}
- public void editSubscription(OldreaderSubscriptionAction action, string[] feedID, string? title = null, string? add = null, string? remove = null)
+ public bool editSubscription(OldreaderSubscriptionAction action, string[] feedID, string? title = null, string? add = null, string? remove = null)
{
var message_string = "ac=";
@@ -421,6 +436,8 @@ public class FeedReader.OldReaderAPI : GLib.Object {
message_string += "&r=" + remove;
- m_connection.send_post_request("subscription/edit?output=json", message_string);
+ var response = m_connection.send_post_request("subscription/edit?output=json", message_string);
+
+ return response.status == 200;
}
}
diff --git a/plugins/backend/oldreader/oldreaderConnection.vala b/plugins/backend/oldreader/oldreaderConnection.vala
index 3c32c9a4..7f189de4 100644
--- a/plugins/backend/oldreader/oldreaderConnection.vala
+++ b/plugins/backend/oldreader/oldreaderConnection.vala
@@ -18,21 +18,22 @@ public class FeedReader.OldReaderConnection {
private string m_api_code;
private string m_passwd;
private OldReaderUtils m_utils;
+ private Soup.Session m_session;
- public OldReaderConnection()
+ public OldReaderConnection(OldReaderUtils utils)
{
- m_utils = new OldReaderUtils();
+ m_utils = utils;
m_api_username = m_utils.getUser();
m_api_code = m_utils.getAccessToken();
m_passwd = m_utils.getPasswd();
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
}
public LoginResponse getToken()
{
Logger.debug("OldReader Connection: getToken()");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message("POST", "https://theoldreader.com/accounts/ClientLogin/");
string message_string = "Email=" + m_api_username
+ "&Passwd=" + m_passwd
@@ -40,7 +41,11 @@ public class FeedReader.OldReaderConnection {
+ "&accountType=HOSTED_OR_GOOGLE"
+ "&client=FeedReader";
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ return LoginResponse.NO_CONNECTION;
+
string response = (string)message.response_body.flatten().data;
try
{
@@ -68,21 +73,18 @@ public class FeedReader.OldReaderConnection {
}
}
- public string send_get_request(string path, string? message_string = null)
+ public Response send_get_request(string path, string? message_string = null)
{
return send_request(path, "GET", message_string);
}
- public string send_post_request(string path, string? message_string = null)
+ public Response send_post_request(string path, string? message_string = null)
{
return send_request(path, "POST", message_string);
}
- private string send_request(string path, string type, string? message_string = null)
+ private Response send_request(string path, string type, string? message_string = null)
{
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
var message = new Soup.Message(type, OldReaderSecret.base_uri + path);
string oldauth = "GoogleLogin auth=" + m_utils.getAccessToken();
@@ -91,8 +93,17 @@ public class FeedReader.OldReaderConnection {
if(message_string != null)
message.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message_string.data);
- session.send_message(message);
- return (string)message.response_body.data;
+ m_session.send_message(message);
+
+ if(message.status_code != 200)
+ {
+ Logger.warning("OldReaderConnection: unexpected response %u".printf(message.status_code));
+ }
+
+ return Response() {
+ status = message.status_code,
+ data = (string)message.response_body.flatten().data
+ };
}
}
diff --git a/plugins/backend/oldreader/oldreaderInterface.vala b/plugins/backend/oldreader/oldreaderInterface.vala
index 05007582..40777e24 100644
--- a/plugins/backend/oldreader/oldreaderInterface.vala
+++ b/plugins/backend/oldreader/oldreaderInterface.vala
@@ -17,11 +17,131 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
private OldReaderAPI m_api;
private OldReaderUtils m_utils;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new OldReaderAPI();
- m_utils = new OldReaderUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new OldReaderUtils(settings_backend, secrets);
+ m_api = new OldReaderAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "https://theoldreader.com/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID_PREMIUM);
+ }
+
+ public string getID()
+ {
+ return "oldreader";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-oldreader";
+ }
+
+ public string serviceName()
+ {
+ return "The Old Reader";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var user_label = new Gtk.Label(_("Username:"));
+ var password_label = new Gtk.Label(_("Password:"));
+
+ user_label.set_alignment(1.0f, 0.5f);
+ password_label.set_alignment(1.0f, 0.5f);
+
+ user_label.set_hexpand(true);
+ password_label.set_hexpand(true);
+
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+
+ m_userEntry.activate.connect(() => { tryLogin(); });
+ m_passwordEntry.activate.connect(() => { tryLogin(); });
+
+ m_passwordEntry.set_invisible_char('*');
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ grid.attach(user_label, 0, 0, 1, 1);
+ grid.attach(m_userEntry, 1, 0, 1, 1);
+ grid.attach(password_label, 0, 1, 1, 1);
+ grid.attach(m_passwordEntry, 1, 1, 1, 1);
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-oldreader", Gtk.IconSize.MENU);
+
+ var loginLabel = new Gtk.Label(_("Please log in to the Old Reader and enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => { tryLogin(); });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPasswd());
+
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+ return;
+ }
+
+ public void writeData()
+ {
+ m_utils.setUser(m_userEntry.get_text().strip());
+ m_utils.setPassword(m_passwordEntry.get_text().strip());
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
}
public bool supportTags()
@@ -54,7 +174,7 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
return "";
}
- public bool hideCagetoryWhenEmtpy(string cadID)
+ public bool hideCategoryWhenEmpty(string cadID)
{
return false;
}
@@ -79,15 +199,20 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
return false;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
return true;
}
public void resetAccount()
- {
- m_utils.resetAccount();
- }
+ {
+ m_utils.resetAccount();
+ }
public bool useMaxArticles()
{
@@ -125,23 +250,23 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
m_api.markAsRead(feedID);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
m_api.markAsRead(catID);
}
public void markAllItemsRead()
{
- var categories = dbDaemon.get_default().read_categories();
- foreach(category cat in categories)
+ var categories = m_db.read_categories();
+ foreach(Category cat in categories)
{
m_api.markAsRead(cat.getCatID());
}
- var feeds = dbDaemon.get_default().read_feeds_without_cat();
- foreach(feed Feed in feeds)
+ var feeds = m_db.read_feeds_without_cat();
+ foreach(Feed feed in feeds)
{
- m_api.markAsRead(Feed.getFeedID());
+ m_api.markAsRead(feed.getFeedID());
}
m_api.markAsRead();
}
@@ -176,26 +301,34 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
return m_api.ping();
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
+ feedID = "feed/" + feedURL;
+ errmsg = "";
+ bool success = false;
+
if(catID == null && newCatName != null)
{
string newCatID = m_api.composeTagID(newCatName);
- m_api.editSubscription(OldReaderAPI.OldreaderSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, newCatID);
+ success = m_api.editSubscription(OldReaderAPI.OldreaderSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, newCatID);
}
else
{
- m_api.editSubscription(OldReaderAPI.OldreaderSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, catID);
+ success = m_api.editSubscription(OldReaderAPI.OldreaderSubscriptionAction.SUBSCRIBE, {"feed/"+feedURL}, null, catID);
}
- return "feed/" + feedURL;
+
+ if(!success)
+ errmsg = @"The old reader could not add $feedURL";
+
+ return success;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
string cat = "";
string[] urls = {};
- foreach(feed f in feeds)
+ foreach(Feed f in feeds)
{
if(f.getCatIDs()[0] != cat)
{
@@ -257,11 +390,17 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
parser.parse();
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- if(m_api.getFeeds(feeds)
- && m_api.getCategoriesAndTags(feeds, categories, tags))
- return true;
+ if(m_api.getFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getCategoriesAndTags(feeds, categories, tags))
+ return true;
+ }
+
return false;
}
@@ -270,7 +409,7 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
return m_api.getTotalUnread();
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
if(whatToGet == ArticleStatus.READ)
{
@@ -284,6 +423,9 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
while(left > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(left > 1000)
{
continuation = m_api.updateArticles(unreadIDs, 1000, continuation);
@@ -295,11 +437,11 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
left = 0;
}
}
- dbDaemon.get_default().updateArticlesByID(unreadIDs, "unread");
+ m_db_write.updateArticlesByID(unreadIDs, "unread");
updateArticleList();
}
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
string? continuation = null;
int left = count;
string? OldReader_feedID = (isTagID) ? null : feedID;
@@ -307,6 +449,9 @@ public class FeedReader.OldReaderInterface : Peas.ExtensionBase, FeedServerInter
while(left > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(left > 1000)
{
continuation = m_api.getArticles(articles, 1000, whatToGet, continuation, OldReader_tagID, OldReader_feedID);
diff --git a/plugins/backend/oldreader/oldreaderLoginWidget.vala b/plugins/backend/oldreader/oldreaderLoginWidget.vala
deleted file mode 100644
index b80c98d9..00000000
--- a/plugins/backend/oldreader/oldreaderLoginWidget.vala
+++ /dev/null
@@ -1,148 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.oldreaderLoginWidget : Peas.ExtensionBase, LoginInterface {
-
-
- private Gtk.Entry m_userEntry;
- private Gtk.Entry m_passwordEntry;
- private OldReaderUtils m_utils;
-
- public void init()
- {
- m_utils = new OldReaderUtils();
- }
-
- public string getWebsite()
- {
- return "https://theoldreader.com/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.HOSTED | BackendFlags.PROPRIETARY | BackendFlags.PAID_PREMIUM);
- }
-
- public string getID()
- {
- return "oldreader";
- }
-
- public string iconName()
- {
- return "feed-service-oldreader";
- }
-
- public string serviceName()
- {
- return "The Old Reader";
- }
-
- public bool needWebLogin()
- {
- return false;
- }
-
- public Gtk.Box? getWidget()
- {
- var user_label = new Gtk.Label(_("Username:"));
- var password_label = new Gtk.Label(_("Password:"));
-
- user_label.set_alignment(1.0f, 0.5f);
- password_label.set_alignment(1.0f, 0.5f);
-
- user_label.set_hexpand(true);
- password_label.set_hexpand(true);
-
- m_userEntry = new Gtk.Entry();
- m_passwordEntry = new Gtk.Entry();
-
- m_userEntry.activate.connect(() => { login(); });
- m_passwordEntry.activate.connect(() => { login(); });
-
- m_passwordEntry.set_invisible_char('*');
- m_passwordEntry.set_visibility(false);
-
- var grid = new Gtk.Grid();
- grid.set_column_spacing(10);
- grid.set_row_spacing(10);
- grid.set_valign(Gtk.Align.CENTER);
- grid.set_halign(Gtk.Align.CENTER);
-
- grid.attach(user_label, 0, 0, 1, 1);
- grid.attach(m_userEntry, 1, 0, 1, 1);
- grid.attach(password_label, 0, 1, 1, 1);
- grid.attach(m_passwordEntry, 1, 1, 1, 1);
-
- var logo = new Gtk.Image.from_icon_name("feed-service-oldreader", Gtk.IconSize.MENU);
-
- var loginLabel = new Gtk.Label(_("Please log in to the Old Reader and enjoy using FeedReader"));
- loginLabel.get_style_context().add_class("h2");
- loginLabel.set_justify(Gtk.Justification.CENTER);
- loginLabel.set_lines(3);
-
- var loginButton = new Gtk.Button.with_label(_("Login"));
- loginButton.halign = Gtk.Align.END;
- loginButton.set_size_request(80, 30);
- loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginButton.clicked.connect(() => { login(); });
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
- box.valign = Gtk.Align.CENTER;
- box.halign = Gtk.Align.CENTER;
- box.pack_start(loginLabel, false, false, 10);
- box.pack_start(logo, false, false, 10);
- box.pack_start(grid, true, true, 10);
- box.pack_end(loginButton, false, false, 20);
-
- m_userEntry.set_text(m_utils.getUser());
- m_passwordEntry.set_text(m_utils.getPasswd());
-
- return box;
- }
-
- public void showHtAccess()
- {
- return;
- }
-
- public void writeData()
- {
- m_utils.setUser(m_userEntry.get_text().strip());
- m_utils.setPassword(m_passwordEntry.get_text().strip());
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public string buildLoginURL()
- {
- return "";
- }
-
- public bool extractCode(string redirectURL)
- {
- return false;
- }
-}
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.oldreaderLoginWidget));
-}
diff --git a/plugins/backend/oldreader/oldreaderUtils.vala b/plugins/backend/oldreader/oldreaderUtils.vala
index 6fe0887d..bdbef499 100644
--- a/plugins/backend/oldreader/oldreaderUtils.vala
+++ b/plugins/backend/oldreader/oldreaderUtils.vala
@@ -20,143 +20,68 @@ namespace FeedReader.OldReaderSecret {
public class FeedReader.OldReaderUtils : GLib.Object {
private GLib.Settings m_settings;
+ private Password m_password;
- public OldReaderUtils()
+ public OldReaderUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
{
- m_settings = new GLib.Settings("org.gnome.feedreader.oldreader");
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.oldreader", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.oldreader");
+
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.oldreader", Secret.SchemaFlags.NONE,
+ "type", "oldreader",
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, pwSchema, "FeedReader: oldreader login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["Username"] = getUser();
+ return attributes;
+ });
}
public string getUser()
{
- return m_settings.get_string("username");
+ return Utils.gsettingReadString(m_settings, "username");
}
public void setUser(string user)
{
- m_settings.set_string("username", user);
+ Utils.gsettingWriteString(m_settings, "username", user);
}
public string getAccessToken()
{
- return m_settings.get_string("access-token");
+ return Utils.gsettingReadString(m_settings, "access-token");
}
public void setAccessToken(string token)
{
- m_settings.set_string("access-token", token);
+ Utils.gsettingWriteString(m_settings, "access-token", token);
}
public string getUserID()
{
- return m_settings.get_string("user-id");
+ return Utils.gsettingReadString(m_settings, "user-id");
}
public void setUserID(string id)
{
- m_settings.set_string("user-id", id);
+ Utils.gsettingWriteString(m_settings, "user-id", id);
}
public void resetAccount()
{
Utils.resetSettings(m_settings);
- }
-
- public bool downloadIcon(string feed_id, string icon_url)
- {
- if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
- return false;
-
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e)
- {
- Logger.debug(e.message);
- }
- }
-
- string local_filename = icon_path + feed_id.replace("/", "_").replace(".", "_") + ".ico";
-
- if(!FileUtils.test(local_filename, GLib.FileTest.EXISTS))
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message("GET", icon_url);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.ssl_strict = false;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
- {
- try{
- FileUtils.set_contents( local_filename,
- (string)message_dlIcon.response_body.flatten().data,
- (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- return true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(feed_id));
- return false;
- }
-
- // file already exists
- return true;
+ m_password.delete_password();
}
public string getPasswd()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.oldreader", Secret.SchemaFlags.NONE,
- "type", "oldreader",
- "Username", Secret.SchemaAttributeType.STRING);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["Username"] = getUser();
- string passwd = "";
-
- try
- {
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("oldReaderUtils: getPassword: " + e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_password.get_password();
}
public void setPassword(string passwd)
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.oldreader", Secret.SchemaFlags.NONE,
- "type", "oldreader",
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["Username"] = getUser();
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "FeedReader: oldreader login", passwd, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("oldReaderUtils: setPassword: " + e.message);
- }
+ m_password.set_password(passwd);
}
}
diff --git a/plugins/backend/owncloud/CMakeLists.txt b/plugins/backend/owncloud/CMakeLists.txt
deleted file mode 100644
index ca5b9c92..00000000
--- a/plugins/backend/owncloud/CMakeLists.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-set (NAME owncloud)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- OwncloudNewsAPI.vala
- OwncloudNewsInterface.vala
- OwncloudNewsMessage.vala
- OwncloudNewsUtils.vala
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- OwncloudNewsLoginWidget.vala
- OwncloudNewsUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
-
diff --git a/plugins/backend/owncloud/OwncloudNewsAPI.vala b/plugins/backend/owncloud/OwncloudNewsAPI.vala
index 7e62279a..3d2d5354 100644
--- a/plugins/backend/owncloud/OwncloudNewsAPI.vala
+++ b/plugins/backend/owncloud/OwncloudNewsAPI.vala
@@ -15,54 +15,70 @@
public class FeedReader.OwncloudNewsAPI : GLib.Object {
- public enum OwnCloudType {
+ public enum OwnCloudType {
FEED,
FOLDER,
STARRED,
ALL
}
- private string m_OwnCloudURL;
+ private string m_OwnCloudURL;
private string m_OwnCloudVersion;
private Json.Parser m_parser;
- private string m_username;
- private string m_password;
- private OwncloudNewsUtils m_utils;
-
- public OwncloudNewsAPI()
- {
- m_parser = new Json.Parser ();
- m_utils = new OwncloudNewsUtils();
- }
-
- public LoginResponse login()
- {
- Logger.debug("OwnCloud: login");
- m_username = m_utils.getUser();
+ private string m_username;
+ private string m_password;
+ private OwncloudNewsUtils m_utils;
+ private Soup.Session m_session;
+ private DataBaseReadOnly m_db;
+
+ public OwncloudNewsAPI(OwncloudNewsUtils utils, DataBaseReadOnly db)
+ {
+ m_db = db;
+ m_parser = new Json.Parser ();
+ m_utils = utils;
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ m_session.ssl_strict = false;
+ m_session.authenticate.connect((msg, auth, retrying) => {
+ if(m_utils.getHtaccessUser() == "")
+ {
+ Logger.error("Nextcloud Session: need Authentication");
+ }
+ else if(!retrying)
+ {
+ auth.authenticate(m_utils.getHtaccessUser(), m_utils.getHtaccessPasswd());
+ }
+ });
+ }
+
+ public LoginResponse login()
+ {
+ Logger.debug("Nextcloud: login");
+ m_username = m_utils.getUser();
m_password = m_utils.getPasswd();
m_OwnCloudURL = m_utils.getURL();
if(m_OwnCloudURL == "" && m_username == "" && m_password == ""){
- m_OwnCloudURL = "example-host/owncloud";
+ m_OwnCloudURL = "example-host/nextcloud";
return LoginResponse.ALL_EMPTY;
}
- if(m_OwnCloudURL == "")
+ if(m_OwnCloudURL == "")
return LoginResponse.MISSING_URL;
- if(GLib.Uri.parse_scheme(m_OwnCloudURL) == null)
- return LoginResponse.INVALID_URL;
+ if(GLib.Uri.parse_scheme(m_OwnCloudURL) == null)
+ return LoginResponse.INVALID_URL;
if(m_username == "")
return LoginResponse.MISSING_USER;
if(m_password == "")
return LoginResponse.MISSING_PASSWD;
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + "status", m_username, m_password, "GET");
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "status", m_username, m_password, "GET");
int error = message.send();
- if(error == ConnectionError.SUCCESS)
+ if(error == ConnectionError.SUCCESS)
{
var response = message.get_response_object();
m_OwnCloudVersion = response.get_string_member("version");
- Logger.info("OwnCloud version: %s".printf(m_OwnCloudVersion));
+ Logger.info("Nextcloud version: %s".printf(m_OwnCloudVersion));
return LoginResponse.SUCCESS;
}
else if(error == ConnectionError.API_ERROR)
@@ -73,302 +89,295 @@ public class FeedReader.OwncloudNewsAPI : GLib.Object {
{
return LoginResponse.NO_CONNECTION;
}
- else if(error == ConnectionError.CA_ERROR)
- {
- return LoginResponse.CA_ERROR;
- }
- else if(error == ConnectionError.UNAUTHORIZED)
+ else if(error == ConnectionError.CA_ERROR)
+ {
+ return LoginResponse.CA_ERROR;
+ }
+ else if(error == ConnectionError.UNAUTHORIZED)
{
return LoginResponse.UNAUTHORIZED;
}
- return LoginResponse.UNKNOWN_ERROR;
- }
+ return LoginResponse.UNKNOWN_ERROR;
+ }
- public bool isloggedin()
+ public bool isloggedin()
{
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + "version", m_username, m_password, "GET");
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "version", m_username, m_password, "GET");
if(message.send() == ConnectionError.SUCCESS)
- {
- return true;
- }
+ {
+ return true;
+ }
- Logger.error("OwncloudNewsAPI.isloggedin: not logged in");
+ Logger.error("OwncloudNewsAPI.isloggedin: not logged in");
return false;
}
- public bool getFeeds(Gee.LinkedList<feed> feeds)
+ public bool getFeeds(Gee.List<Feed> feeds)
{
if(isloggedin())
{
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + "feeds", m_username, m_password, "GET");
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "feeds", m_username, m_password, "GET");
int error = message.send();
if(error == ConnectionError.SUCCESS)
{
var response = message.get_response_object();
- if(response.has_member("feeds"))
- {
- var feed_array = response.get_array_member("feeds");
- var feed_count = feed_array.get_length();
-
- for(uint i = 0; i < feed_count; i++)
- {
- var feed_node = feed_array.get_object_element(i);
- string feed_id = feed_node.get_int_member("id").to_string();
- bool hasIcon = false;
-
- if(feed_node.has_member("faviconLink"))
- {
- hasIcon = m_utils.downloadIcon(feed_id, feed_node.get_string_member("faviconLink"));
- }
-
- feeds.add(
- new feed (
- feed_id,
- feed_node.get_string_member("title"),
- feed_node.get_string_member("link"),
- hasIcon,
- (int)feed_node.get_int_member("unreadCount"),
- { feed_node.get_int_member("folderId").to_string() }
- )
- );
- }
-
- return true;
- }
- else
- {
- Logger.error("OwncloudNewsAPI.getFeeds: no member \"feeds\"");
- }
+ if(response.has_member("feeds"))
+ {
+ var feed_array = response.get_array_member("feeds");
+ var feed_count = feed_array.get_length();
+
+ for(uint i = 0; i < feed_count; i++)
+ {
+ var feed_node = feed_array.get_object_element(i);
+
+ feeds.add(
+ new Feed(
+ feed_node.get_int_member("id").to_string(),
+ feed_node.get_string_member("title"),
+ feed_node.get_string_member("link"),
+ (int)feed_node.get_int_member("unreadCount"),
+ ListUtils.single(feed_node.get_int_member("folderId").to_string()),
+ feed_node.get_string_member("faviconLink")
+ )
+ );
+ }
+
+ return true;
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getFeeds: no member \"feeds\"");
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getFeeds");
}
- else
- {
- Logger.error("OwncloudNewsAPI.getFeeds");
- }
}
- return false;
+ return false;
}
- public bool getCategories(Gee.LinkedList<category> categories, Gee.LinkedList<feed> feeds)
+ public bool getCategories(Gee.List<Category> categories, Gee.List<Feed> feeds)
{
if(isloggedin())
{
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + "folders", m_username, m_password, "GET");
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "folders", m_username, m_password, "GET");
int error = message.send();
- int orderID = 0;
+ int orderID = 0;
if(error == ConnectionError.SUCCESS)
{
var response = message.get_response_object();
- if(response.has_member("folders"))
- {
- var folder_array = response.get_array_member("folders");
- var folder_count = folder_array.get_length();
-
- for(uint i = 0; i < folder_count; i++)
- {
- ++orderID;
- var folder_node = folder_array.get_object_element(i);
- string id = folder_node.get_int_member("id").to_string();
-
- categories.add(
- new category (
- id,
- folder_node.get_string_member("name"),
- m_utils.countUnread(feeds, id),
- orderID,
- CategoryID.MASTER.to_string(),
- 1
- )
- );
- }
- return true;
- }
- else
- {
- Logger.error("OwncloudNewsAPI.getCategories: no member \"folders\"");
- }
+ if(response.has_member("folders"))
+ {
+ var folder_array = response.get_array_member("folders");
+ var folder_count = folder_array.get_length();
+
+ for(uint i = 0; i < folder_count; i++)
+ {
+ ++orderID;
+ var folder_node = folder_array.get_object_element(i);
+ string id = folder_node.get_int_member("id").to_string();
+
+ categories.add(
+ new Category (
+ id,
+ folder_node.get_string_member("name"),
+ m_utils.countUnread(feeds, id),
+ orderID,
+ CategoryID.MASTER.to_string(),
+ 1
+ )
+ );
+ }
+ return true;
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getCategories: no member \"folders\"");
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getCategories");
}
- else
- {
- Logger.error("OwncloudNewsAPI.getCategories");
- }
}
- return false;
+ return false;
}
- public void getNewArticles(Gee.LinkedList<article> articles, int lastModified, OwnCloudType type, int id)
+ public void getNewArticles(Gee.List<Article> articles, int lastModified, OwnCloudType type, int id)
{
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + "/items/updated", m_username, m_password, "GET");
- message.add_int("lastModified", lastModified);
- message.add_int("type", type);
- message.add_int("id", id);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "items/updated", m_username, m_password, "GET");
+ message.add_int("lastModified", lastModified);
+ message.add_int("type", type);
+ message.add_int("id", id);
int error = message.send();
- if(error == ConnectionError.SUCCESS)
- {
- var response = message.get_response_object();
- if(response.has_member("items"))
- {
- var article_array = response.get_array_member("items");
- var article_count = article_array.get_length();
- Logger.debug("getNewArticles: %u articles returned".printf(article_count));
-
- for(uint i = 0; i < article_count; i++)
- {
- var article_node = article_array.get_object_element(i);
- //Logger.debug(article_node.get_int_member("id").to_string());
-
- ArticleStatus unread = article_node.get_boolean_member("unread") ? ArticleStatus.UNREAD : ArticleStatus.READ;
- ArticleStatus marked = article_node.get_boolean_member("starred") ? ArticleStatus.MARKED : ArticleStatus.UNMARKED;
- string? author = article_node.has_member("author") ? article_node.get_string_member("author") : null;
- string media = "";
-
- if(article_node.has_member("enclosureLink") && article_node.get_string_member("enclosureLink") != null
- && article_node.has_member("enclosureMime") && article_node.get_string_member("enclosureMime") != null)
- {
- if(article_node.get_string_member("enclosureMime").contains("audio")
- || article_node.get_string_member("enclosureMime").contains("video"))
- {
- media = article_node.get_string_member("enclosureLink");
- }
- }
-
- var Article = new article( article_node.get_int_member("id").to_string(),
- article_node.get_string_member("title"),
- article_node.get_string_member("url"),
- article_node.get_int_member("feedId").to_string(),
- unread,
- marked,
- article_node.get_string_member("body"),
- "",
- author,
- new DateTime.from_unix_local(article_node.get_int_member("pubDate")),
- -1,
- "", // tags
- media, // media
- article_node.get_string_member("guidHash"),
- (int)article_node.get_int_member("lastModified"));
-
- articles.add(Article);
- }
- }
- else
- {
- Logger.error("OwncloudNewsAPI.getNewArticles: no member \"items\"");
- }
- }
- else
- {
- Logger.error("OwncloudNewsAPI.getNewArticles");
- }
- }
-
-
-
- public void getArticles(Gee.LinkedList<article> articles, int skip, int count, bool read, OwnCloudType type, int id)
+ if(error == ConnectionError.SUCCESS)
+ {
+ var response = message.get_response_object();
+ if(response.has_member("items"))
+ {
+ var article_array = response.get_array_member("items");
+ var article_count = article_array.get_length();
+ Logger.debug("getNewArticles: %u articles returned".printf(article_count));
+
+ for(uint i = 0; i < article_count; i++)
+ {
+ var article_node = article_array.get_object_element(i);
+ //Logger.debug(article_node.get_int_member("id").to_string());
+
+ ArticleStatus unread = article_node.get_boolean_member("unread") ? ArticleStatus.UNREAD : ArticleStatus.READ;
+ ArticleStatus marked = article_node.get_boolean_member("starred") ? ArticleStatus.MARKED : ArticleStatus.UNMARKED;
+
+ var enclosures = new Gee.ArrayList<Enclosure>();
+ if(article_node.has_member("enclosureLink") && article_node.get_string_member("enclosureLink") != null)
+ {
+ if(article_node.has_member("enclosureMime") && article_node.get_string_member("enclosureMime") != null)
+ {
+ enclosures.add(new Enclosure(
+ article_node.get_int_member("id").to_string(),
+ article_node.get_string_member("enclosureLink"),
+ EnclosureType.from_string(article_node.get_string_member("enclosureMime"))));
+ }
+ }
+
+ var Article = new Article( article_node.get_int_member("id").to_string(),
+ article_node.get_string_member("title"),
+ article_node.get_string_member("url"),
+ article_node.get_int_member("feedId").to_string(),
+ unread,
+ marked,
+ article_node.get_string_member("body"),
+ null,
+ article_node.get_string_member("author"),
+ new DateTime.from_unix_local(article_node.get_int_member("pubDate")),
+ -1,
+ null, // tags
+ enclosures,
+ article_node.get_string_member("guidHash"),
+ (int)article_node.get_int_member("lastModified"));
+
+ articles.add(Article);
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getNewArticles: no member \"items\"");
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getNewArticles");
+ }
+ }
+
+
+
+ public void getArticles(Gee.List<Article> articles, int skip, int count, bool read, OwnCloudType type, int id)
{
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + "items", m_username, m_password, "GET");
- message.add_bool("oldestFirst", false);
- message.add_int("type", type);
- message.add_bool("getRead", read);
- message.add_int("id", id);
- message.add_int("offset", skip);
- message.add_int("batchSize", count);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "items", m_username, m_password, "GET");
+ message.add_bool("oldestFirst", false);
+ message.add_int("type", type);
+ message.add_bool("getRead", read);
+ message.add_int("id", id);
+ message.add_int("offset", skip);
+ message.add_int("batchSize", count);
int error = message.send();
- if(error == ConnectionError.SUCCESS)
- {
- var response = message.get_response_object();
- if(response.has_member("items"))
- {
- var article_array = response.get_array_member("items");
- var article_count = article_array.get_length();
- Logger.debug("getArticles: %u articles returned".printf(article_count));
-
- for(uint i = 0; i < article_count; i++)
- {
- var article_node = article_array.get_object_element(i);
-
- ArticleStatus unread = article_node.get_boolean_member("unread") ? ArticleStatus.UNREAD : ArticleStatus.READ;
- ArticleStatus marked = article_node.get_boolean_member("starred") ? ArticleStatus.MARKED : ArticleStatus.UNMARKED;
- string? author = article_node.has_member("author") ? article_node.get_string_member("author") : null;
- string media = "";
-
- if(article_node.has_member("enclosureLink") && article_node.get_string_member("enclosureLink") != null
- && article_node.has_member("enclosureMime") && article_node.get_string_member("enclosureMime") != null)
- {
- if(article_node.get_string_member("enclosureMime").contains("audio")
- || article_node.get_string_member("enclosureMime").contains("video"))
- {
- media = article_node.get_string_member("enclosureLink");
- }
- }
-
- var Article = new article( article_node.get_int_member("id").to_string(),
- article_node.get_string_member("title"),
- article_node.get_string_member("url"),
- article_node.get_int_member("feedId").to_string(),
- unread,
- marked,
- article_node.get_string_member("body"),
- "",
- author,
- new DateTime.from_unix_local(article_node.get_int_member("pubDate")),
- -1,
- "", // tags
- media,
- article_node.get_string_member("guidHash"),
- (int)article_node.get_int_member("lastModified"));
-
- articles.add(Article);
- }
- }
- else
- {
- Logger.error("OwncloudNewsAPI.getArticles: no member \"items\"");
- }
- }
- else
- {
- Logger.error("OwncloudNewsAPI.getArticles");
- }
+ if(error == ConnectionError.SUCCESS)
+ {
+ var response = message.get_response_object();
+ if(response.has_member("items"))
+ {
+ var article_array = response.get_array_member("items");
+ var article_count = article_array.get_length();
+ Logger.debug("getArticles: %u articles returned".printf(article_count));
+
+ for(uint i = 0; i < article_count; i++)
+ {
+ var article_node = article_array.get_object_element(i);
+
+ ArticleStatus unread = article_node.get_boolean_member("unread") ? ArticleStatus.UNREAD : ArticleStatus.READ;
+ ArticleStatus marked = article_node.get_boolean_member("starred") ? ArticleStatus.MARKED : ArticleStatus.UNMARKED;
+
+ var enclosures = new Gee.ArrayList<Enclosure>();
+ if(article_node.has_member("enclosureLink") && article_node.get_string_member("enclosureLink") != null)
+ {
+ if(article_node.has_member("enclosureMime") && article_node.get_string_member("enclosureMime") != null)
+ {
+ enclosures.add(new Enclosure(
+ article_node.get_int_member("id").to_string(),
+ article_node.get_string_member("enclosureLink"),
+ EnclosureType.from_string(article_node.get_string_member("enclosureMime"))));
+ }
+ }
+
+ var Article = new Article( article_node.get_int_member("id").to_string(),
+ article_node.get_string_member("title"),
+ article_node.get_string_member("url"),
+ article_node.get_int_member("feedId").to_string(),
+ unread,
+ marked,
+ article_node.get_string_member("body"),
+ null,
+ article_node.get_string_member("author"),
+ new DateTime.from_unix_local(article_node.get_int_member("pubDate")),
+ -1,
+ null, // tags
+ enclosures,
+ article_node.get_string_member("guidHash"),
+ (int)article_node.get_int_member("lastModified"));
+
+ articles.add(Article);
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getArticles: no member \"items\"");
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.getArticles");
+ }
}
public bool markFeedRead(string feedID, bool isCatID)
{
string url = "%s/%s/read".printf((isCatID) ? "folders" : "feeds", feedID);
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- message.add_int("newestItemId", int.parse(dbDaemon.get_default().getNewestArticle()));
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ message.add_int("newestItemId", int.parse(m_db.getNewestArticle()));
int error = message.send();
- if(error == ConnectionError.SUCCESS)
- return true;
+ if(error == ConnectionError.SUCCESS)
+ return true;
- Logger.error("OwncloudNewsAPI.markFeedRead");
- return false;
+ Logger.error("OwncloudNewsAPI.markFeedRead");
+ return false;
}
public bool markAllItemsRead()
{
- string url = "items/read";
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- message.add_int("newestItemId", int.parse(dbDaemon.get_default().getNewestArticle()));
- int error = message.send();
+ string url = "items/read";
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ message.add_int("newestItemId", int.parse(m_db.getNewestArticle()));
+ int error = message.send();
- if(error == ConnectionError.SUCCESS)
- return true;
+ if(error == ConnectionError.SUCCESS)
+ return true;
- Logger.error("OwncloudNewsAPI.markAllItemsRead");
- return false;
+ Logger.error("OwncloudNewsAPI.markAllItemsRead");
+ return false;
}
@@ -377,163 +386,179 @@ public class FeedReader.OwncloudNewsAPI : GLib.Object {
string url = "";
if(unread == ArticleStatus.UNREAD)
- url = "/items/unread/multiple";
+ url = "items/unread/multiple";
else if(unread == ArticleStatus.READ)
- url = "/items/read/multiple";
+ url = "items/read/multiple";
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- message.add_int_array("items", articleIDs);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ message.add_int_array("items", articleIDs);
int error = message.send();
- if(error == ConnectionError.SUCCESS)
- return true;
+ if(error == ConnectionError.SUCCESS)
+ return true;
- Logger.error("OwncloudNewsAPI.updateArticleUnread");
- return false;
+ Logger.error("OwncloudNewsAPI.updateArticleUnread");
+ return false;
}
- public bool updateArticleMarked(string articleID, ArticleStatus marked)
+ public bool updateArticleMarked(string articleID, ArticleStatus marked)
{
- var article = dbDaemon.get_default().read_article(articleID);
- string url = "/items/%s/%s/".printf(article.getFeedID(), article.getHash());
+ var article = m_db.read_article(articleID);
+ string url = "items/%s/%s/".printf(article.getFeedID(), article.getHash());
- if(marked == ArticleStatus.MARKED)
- url += "star";
- else if(marked == ArticleStatus.UNMARKED)
- url += "unstar";
+ if(marked == ArticleStatus.MARKED)
+ url += "star";
+ else if(marked == ArticleStatus.UNMARKED)
+ url += "unstar";
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- int error = message.send();
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ int error = message.send();
- if(error == ConnectionError.SUCCESS)
- return true;
+ if(error == ConnectionError.SUCCESS)
+ return true;
- Logger.error("OwncloudNewsAPI.updateArticleMarked");
- return false;
+ Logger.error("OwncloudNewsAPI.updateArticleMarked");
+ return false;
}
- public int64 addFeed(string feedURL, string? catID = null)
- {
- string url = "/feeds";
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "POST");
- message.add_string("url", feedURL);
- message.add_int("folderId", (catID != null) ? int.parse(catID) : 0);
- int error = message.send();
-
- if(error == ConnectionError.SUCCESS)
- {
- var response = message.get_response_object();
- if(response.has_member("feeds"))
- {
- return response.get_array_member("feeds").get_object_element(0).get_int_member("id");
- }
- }
- else
- {
- Logger.error("OwncloudNewsAPI.addFeed");
- }
+ public bool addFeed(string feedURL, string? catID, out int64 feedID, out string errmsg)
+ {
+ string url = "feeds";
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "POST");
+ message.add_string("url", feedURL);
+ message.add_int("folderId", (catID != null) ? int.parse(catID) : 0);
+ int error = message.send();
- return 0;
- }
-
- public void removeFeed(string feedID)
- {
- string url = "/feeds/%s".printf(feedID);
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "DELETE");
- int error = message.send();
-
- if(error != ConnectionError.SUCCESS)
- {
- Logger.error("OwncloudNewsAPI.removeFeed");
- }
- }
-
- public void renameFeed(string feedID, string title)
- {
- string url = "/feeds/%s/rename".printf(feedID);
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- message.add_string("feedTitle", title);
- int error = message.send();
-
- if(error != ConnectionError.SUCCESS)
- {
- Logger.error("OwncloudNewsAPI.renameFeed");
- }
- }
-
- public void moveFeed(string feedID, string? newCatID = null)
- {
- string url = "/feeds/%s/move".printf(feedID);
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- message.add_int("folderId", (newCatID != null) ? int.parse(newCatID) : 0);
- int error = message.send();
-
- if(error != ConnectionError.SUCCESS)
- {
- Logger.error("OwncloudNewsAPI.moveFeed");
- }
- }
-
- public int64 addFolder(string title)
- {
- string url = "/folders";
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "POST");
- message.add_string("name", title);
- int error = message.send();
-
- if(error != ConnectionError.SUCCESS)
- {
- var response = message.get_response_object();
- if(response.has_member("folders"))
- {
- return response.get_array_member("folders").get_object_element(0).get_int_member("id");
- }
- }
- else
- {
- Logger.error("OwncloudNewsAPI.addFolder");
- }
+ if(error == ConnectionError.SUCCESS)
+ {
+ var response = message.get_response_object();
+ if(response.has_member("feeds"))
+ {
+ errmsg = "";
+ feedID = response.get_array_member("feeds").get_object_element(0).get_int_member("id");
+ return true;
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.addFeed");
+ }
+
+
+ errmsg = "Nextcloud could not add the feed";
+ feedID = 0;
+
+ switch(message.getStatusCode())
+ {
+ case 409:
+ errmsg = "Feed already added (409)";
+ return true;
+ case 422:
+ errmsg = "Nextcloud can't read the feed (422)";
+ break;
+ }
+
+ return false;
+ }
+
+ public void removeFeed(string feedID)
+ {
+ string url = "feeds/%s".printf(feedID);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "DELETE");
+ int error = message.send();
+
+ if(error != ConnectionError.SUCCESS)
+ {
+ Logger.error("OwncloudNewsAPI.removeFeed");
+ }
+ }
+
+ public void renameFeed(string feedID, string title)
+ {
+ string url = "feeds/%s/rename".printf(feedID);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ message.add_string("feedTitle", title);
+ int error = message.send();
+
+ if(error != ConnectionError.SUCCESS)
+ {
+ Logger.error("OwncloudNewsAPI.renameFeed");
+ }
+ }
+
+ public void moveFeed(string feedID, string? newCatID = null)
+ {
+ string url = "feeds/%s/move".printf(feedID);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ message.add_int("folderId", (newCatID != null) ? int.parse(newCatID) : 0);
+ int error = message.send();
+
+ if(error != ConnectionError.SUCCESS)
+ {
+ Logger.error("OwncloudNewsAPI.moveFeed");
+ }
+ }
+
+ public int64 addFolder(string title)
+ {
+ string url = "folders";
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "POST");
+ message.add_string("name", title);
+ int error = message.send();
+
+ if(error != ConnectionError.SUCCESS)
+ {
+ var response = message.get_response_object();
+ if(response.has_member("folders"))
+ {
+ return response.get_array_member("folders").get_object_element(0).get_int_member("id");
+ }
+ }
+ else
+ {
+ Logger.error("OwncloudNewsAPI.addFolder");
+ }
return 0;
- }
+ }
- public bool removeFolder(string catID)
- {
- string url = "/folders/%s".printf(catID);
+ public bool removeFolder(string catID)
+ {
+ string url = "folders/%s".printf(catID);
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "DELETE");
- int error = message.send();
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "DELETE");
+ int error = message.send();
- if(error == ConnectionError.SUCCESS)
- return true;
+ if(error == ConnectionError.SUCCESS)
+ return true;
- Logger.error("OwncloudNewsAPI.removeFolder");
- return false;
- }
+ Logger.error("OwncloudNewsAPI.removeFolder");
+ return false;
+ }
- public void renameCategory(string catID, string title)
- {
- string url = "/folders/%s".printf(catID);
- var message = new OwnCloudNewsMessage(m_OwnCloudURL + url, m_username, m_password, "PUT");
- message.add_string("name", title);
- int error = message.send();
+ public void renameCategory(string catID, string title)
+ {
+ string url = "folders/%s".printf(catID);
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + url, m_username, m_password, "PUT");
+ message.add_string("name", title);
+ int error = message.send();
- if(error != ConnectionError.SUCCESS)
- Logger.error("OwncloudNewsAPI.renameCategory");
- }
+ if(error != ConnectionError.SUCCESS)
+ Logger.error("OwncloudNewsAPI.renameCategory");
+ }
- public bool ping()
- {
- var message = new OwnCloudNewsMessage(m_OwnCloudURL, m_username, m_password, "PUT");
- int error = message.send(true);
+ public bool ping()
+ {
+ var message = new OwnCloudNewsMessage(m_session, m_OwnCloudURL + "version", m_username, m_password, "GET");
+ int error = message.send(true);
- if(error == ConnectionError.NO_RESPONSE)
+ if(error == ConnectionError.NO_RESPONSE)
{
- Logger.error("OwncloudNewsAPI.ping: failed");
+ Logger.error("OwncloudNewsAPI.ping: failed");
return false;
}
return true;
- }
+ }
}
diff --git a/plugins/backend/owncloud/OwncloudNewsInterface.vala b/plugins/backend/owncloud/OwncloudNewsInterface.vala
index 65499ab8..3275927e 100644
--- a/plugins/backend/owncloud/OwncloudNewsInterface.vala
+++ b/plugins/backend/owncloud/OwncloudNewsInterface.vala
@@ -17,11 +17,189 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
private OwncloudNewsAPI m_api;
private OwncloudNewsUtils m_utils;
+ private Gtk.Entry m_urlEntry;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private Gtk.Entry m_AuthUserEntry;
+ private Gtk.Entry m_AuthPasswordEntry;
+ private Gtk.Revealer m_revealer;
+ private bool m_need_htaccess = false;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new OwncloudNewsAPI();
- m_utils = new OwncloudNewsUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new OwncloudNewsUtils(settings_backend, secrets);
+ m_api = new OwncloudNewsAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "https://github.com/nextcloud/news";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.SELF_HOSTED | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
+ }
+
+ public string getID()
+ {
+ return "owncloud";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-nextcloud";
+ }
+
+ public string serviceName()
+ {
+ return "Nextcloud News";
+ }
+
+ public void writeData()
+ {
+ m_utils.setURL(m_urlEntry.get_text());
+ m_utils.setUser(m_userEntry.get_text().strip());
+ m_utils.setPassword(m_passwordEntry.get_text().strip());
+ if(m_need_htaccess)
+ {
+ m_utils.setHtaccessUser(m_AuthUserEntry.get_text().strip());
+ m_utils.setHtAccessPassword(m_AuthPasswordEntry.get_text().strip());
+ }
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public void showHtAccess()
+ {
+ m_revealer.set_reveal_child(true);
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var urlLabel = new Gtk.Label(_("Nextcloud URL:"));
+ var userLabel = new Gtk.Label(_("Username:"));
+ var passwordLabel = new Gtk.Label(_("Password:"));
+
+ urlLabel.set_alignment(1.0f, 0.5f);
+ userLabel.set_alignment(1.0f, 0.5f);
+ passwordLabel.set_alignment(1.0f, 0.5f);
+
+ urlLabel.set_hexpand(true);
+ userLabel.set_hexpand(true);
+ passwordLabel.set_hexpand(true);
+
+ m_urlEntry = new Gtk.Entry();
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+
+ m_urlEntry.activate.connect(writeData);
+ m_userEntry.activate.connect(writeData);
+ m_passwordEntry.activate.connect(writeData);
+
+ m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-nextcloud", Gtk.IconSize.MENU);
+
+ grid.attach(urlLabel, 0, 0, 1, 1);
+ grid.attach(m_urlEntry, 1, 0, 1, 1);
+ grid.attach(userLabel, 0, 1, 1, 1);
+ grid.attach(m_userEntry, 1, 1, 1, 1);
+ grid.attach(passwordLabel, 0, 2, 1, 1);
+ grid.attach(m_passwordEntry, 1, 2, 1, 1);
+
+ // http auth stuff ----------------------------------------------------
+ var authUserLabel = new Gtk.Label(_("Username:"));
+ var authPasswordLabel = new Gtk.Label(_("Password:"));
+
+ authUserLabel.set_alignment(1.0f, 0.5f);
+ authPasswordLabel.set_alignment(1.0f, 0.5f);
+
+ authUserLabel.set_hexpand(true);
+ authPasswordLabel.set_hexpand(true);
+
+ m_AuthUserEntry = new Gtk.Entry();
+ m_AuthPasswordEntry = new Gtk.Entry();
+ m_AuthPasswordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_AuthPasswordEntry.set_visibility(false);
+
+ m_AuthUserEntry.activate.connect(writeData);
+ m_AuthPasswordEntry.activate.connect(writeData);
+
+ var authGrid = new Gtk.Grid();
+ authGrid.margin = 10;
+ authGrid.set_column_spacing(10);
+ authGrid.set_row_spacing(10);
+ authGrid.set_valign(Gtk.Align.CENTER);
+ authGrid.set_halign(Gtk.Align.CENTER);
+
+ authGrid.attach(authUserLabel, 0, 0, 1, 1);
+ authGrid.attach(m_AuthUserEntry, 1, 0, 1, 1);
+ authGrid.attach(authPasswordLabel, 0, 1, 1, 1);
+ authGrid.attach(m_AuthPasswordEntry, 1, 1, 1, 1);
+
+ var frame = new Gtk.Frame(_("HTTP Authorization"));
+ frame.set_halign(Gtk.Align.CENTER);
+ frame.add(authGrid);
+ m_revealer = new Gtk.Revealer();
+ m_revealer.add(frame);
+ //---------------------------------------------------------------------
+
+ var loginLabel = new Gtk.Label(_("Please log in to your Nextcloud News instance and enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => { tryLogin(); });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_start(m_revealer, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+
+ m_urlEntry.set_text(m_utils.getUnmodifiedURL());
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPasswd());
+
+ return box;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
}
public bool supportTags()
@@ -36,7 +214,7 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
public string symbolicIcon()
{
- return "feed-service-owncloud-symbolic";
+ return "feed-service-nextcloud-symbolic";
}
public string accountName()
@@ -54,7 +232,7 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
return "0";
}
- public bool hideCagetoryWhenEmtpy(string cadID)
+ public bool hideCategoryWhenEmpty(string cadID)
{
return false;
}
@@ -79,15 +257,20 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
return false;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
return false;
}
public void resetAccount()
- {
- m_utils.resetAccount();
- }
+ {
+ m_utils.resetAccount();
+ }
public bool useMaxArticles()
{
@@ -119,7 +302,7 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
m_api.markFeedRead(feedID, false);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
m_api.markFeedRead(catID, true);
}
@@ -159,22 +342,32 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
return m_api.ping();
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
+ bool success = false;
+ int64 id = 0;
if(catID == null && newCatName != null)
{
string newCatID = m_api.addFolder(newCatName).to_string();
- return m_api.addFeed(feedURL, newCatID).to_string();
+ success = m_api.addFeed(feedURL, newCatID, out id, out errmsg);
+ }
+ else
+ {
+ success = m_api.addFeed(feedURL, catID, out id, out errmsg);
}
- return m_api.addFeed(feedURL, catID).to_string();
+
+ feedID = id.to_string();
+ return success;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
- foreach(feed f in feeds)
+ int64 id = 0;
+ string errmsg = "";
+ foreach(Feed f in feeds)
{
- m_api.addFeed(f.getXmlUrl(), f.getCatIDs()[0]);
+ m_api.addFeed(f.getXmlUrl(), f.getCatIDs()[0], out id, out errmsg);
}
}
@@ -224,21 +417,26 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
parser.parse();
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- if(m_api.getFeeds(feeds)
- && m_api.getCategories(categories, feeds))
- return true;
+ if(m_api.getFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getCategories(categories, feeds))
+ return true;
+ }
return false;
}
public int getUnreadCount()
{
- return (int)dbDaemon.get_default().get_unread_total();
+ return (int)m_db.get_unread_total();
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
var type = OwncloudNewsAPI.OwnCloudType.ALL;
bool read = true;
@@ -265,10 +463,10 @@ public class FeedReader.OwncloudNewsInterface : Peas.ExtensionBase, FeedServerIn
type = OwncloudNewsAPI.OwnCloudType.FEED;
}
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
if(count == -1)
- m_api.getNewArticles(articles, dbDaemon.get_default().getLastModified(), type, id);
+ m_api.getNewArticles(articles, m_db.getLastModified(), type, id);
else
m_api.getArticles(articles, 0, -1, read, type, id);
diff --git a/plugins/backend/owncloud/OwncloudNewsLoginWidget.vala b/plugins/backend/owncloud/OwncloudNewsLoginWidget.vala
deleted file mode 100644
index a6c092ed..00000000
--- a/plugins/backend/owncloud/OwncloudNewsLoginWidget.vala
+++ /dev/null
@@ -1,210 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.OwnCloudNewsLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- private Gtk.Entry m_urlEntry;
- private Gtk.Entry m_userEntry;
- private Gtk.Entry m_passwordEntry;
- private Gtk.Entry m_AuthUserEntry;
- private Gtk.Entry m_AuthPasswordEntry;
- private Gtk.Revealer m_revealer;
- private OwncloudNewsUtils m_utils;
- private bool m_need_htaccess = false;
-
- public Logger m_logger { get; construct set; }
-
- public void init()
- {
- logger = m_logger;
- m_utils = new OwncloudNewsUtils();
- }
-
- public string getWebsite()
- {
- return "https://github.com/nextcloud/news";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.SELF_HOSTED | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
- }
-
- public string getID()
- {
- return "owncloud";
- }
-
- public string iconName()
- {
- return "feed-service-owncloud";
- }
-
- public string serviceName()
- {
- return "ownCloud News";
- }
-
- public void writeData()
- {
- m_utils.setURL(m_urlEntry.get_text());
- m_utils.setUser(m_userEntry.get_text().strip());
- m_utils.setPassword(m_passwordEntry.get_text().strip());
- if(m_need_htaccess)
- {
- m_utils.setHtaccessUser(m_AuthUserEntry.get_text().strip());
- m_utils.setHtAccessPassword(m_AuthPasswordEntry.get_text().strip());
- }
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public void showHtAccess()
- {
- m_revealer.set_reveal_child(true);
- }
-
- public bool needWebLogin()
- {
- return false;
- }
-
- public Gtk.Box? getWidget()
- {
- var urlLabel = new Gtk.Label(_("OwnCloud URL:"));
- var userLabel = new Gtk.Label(_("Username:"));
- var passwordLabel = new Gtk.Label(_("Password:"));
-
- urlLabel.set_alignment(1.0f, 0.5f);
- userLabel.set_alignment(1.0f, 0.5f);
- passwordLabel.set_alignment(1.0f, 0.5f);
-
- urlLabel.set_hexpand(true);
- userLabel.set_hexpand(true);
- passwordLabel.set_hexpand(true);
-
- m_urlEntry = new Gtk.Entry();
- m_userEntry = new Gtk.Entry();
- m_passwordEntry = new Gtk.Entry();
-
- m_urlEntry.activate.connect(writeData);
- m_userEntry.activate.connect(writeData);
- m_passwordEntry.activate.connect(writeData);
-
- m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_passwordEntry.set_visibility(false);
-
- var grid = new Gtk.Grid();
- grid.set_column_spacing(10);
- grid.set_row_spacing(10);
- grid.set_valign(Gtk.Align.CENTER);
- grid.set_halign(Gtk.Align.CENTER);
-
- var logo = new Gtk.Image.from_icon_name("feed-service-owncloud", Gtk.IconSize.MENU);
-
- grid.attach(urlLabel, 0, 0, 1, 1);
- grid.attach(m_urlEntry, 1, 0, 1, 1);
- grid.attach(userLabel, 0, 1, 1, 1);
- grid.attach(m_userEntry, 1, 1, 1, 1);
- grid.attach(passwordLabel, 0, 2, 1, 1);
- grid.attach(m_passwordEntry, 1, 2, 1, 1);
-
- // http auth stuff ----------------------------------------------------
- var authUserLabel = new Gtk.Label(_("Username:"));
- var authPasswordLabel = new Gtk.Label(_("Password:"));
-
- authUserLabel.set_alignment(1.0f, 0.5f);
- authPasswordLabel.set_alignment(1.0f, 0.5f);
-
- authUserLabel.set_hexpand(true);
- authPasswordLabel.set_hexpand(true);
-
- m_AuthUserEntry = new Gtk.Entry();
- m_AuthPasswordEntry = new Gtk.Entry();
- m_AuthPasswordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_AuthPasswordEntry.set_visibility(false);
-
- m_AuthUserEntry.activate.connect(writeData);
- m_AuthPasswordEntry.activate.connect(writeData);
-
- var authGrid = new Gtk.Grid();
- authGrid.margin = 10;
- authGrid.set_column_spacing(10);
- authGrid.set_row_spacing(10);
- authGrid.set_valign(Gtk.Align.CENTER);
- authGrid.set_halign(Gtk.Align.CENTER);
-
- authGrid.attach(authUserLabel, 0, 0, 1, 1);
- authGrid.attach(m_AuthUserEntry, 1, 0, 1, 1);
- authGrid.attach(authPasswordLabel, 0, 1, 1, 1);
- authGrid.attach(m_AuthPasswordEntry, 1, 1, 1, 1);
-
- var frame = new Gtk.Frame(_("HTTP Authorization"));
- frame.set_halign(Gtk.Align.CENTER);
- frame.add(authGrid);
- m_revealer = new Gtk.Revealer();
- m_revealer.add(frame);
- //---------------------------------------------------------------------
-
- var loginLabel = new Gtk.Label(_("Please log in to your ownCloud News instance and enjoy using FeedReader"));
- loginLabel.get_style_context().add_class("h2");
- loginLabel.set_justify(Gtk.Justification.CENTER);
- loginLabel.set_lines(3);
-
- var loginButton = new Gtk.Button.with_label(_("Login"));
- loginButton.halign = Gtk.Align.END;
- loginButton.set_size_request(80, 30);
- loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginButton.clicked.connect(() => { login(); });
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
- box.valign = Gtk.Align.CENTER;
- box.halign = Gtk.Align.CENTER;
- box.pack_start(loginLabel, false, false, 10);
- box.pack_start(logo, false, false, 10);
- box.pack_start(grid, true, true, 10);
- box.pack_start(m_revealer, true, true, 10);
- box.pack_end(loginButton, false, false, 20);
-
-
- m_urlEntry.set_text(m_utils.getUnmodifiedURL());
- m_userEntry.set_text(m_utils.getUser());
- m_passwordEntry.set_text(m_utils.getPasswd());
-
- return box;
- }
-
- public bool extractCode(string redirectURL)
- {
- return false;
- }
-
- public string buildLoginURL()
- {
- return "";
- }
-}
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.OwnCloudNewsLoginWidget));
-}
diff --git a/plugins/backend/owncloud/OwncloudNewsMessage.vala b/plugins/backend/owncloud/OwncloudNewsMessage.vala
index 3f09e1fe..df686e5c 100644
--- a/plugins/backend/owncloud/OwncloudNewsMessage.vala
+++ b/plugins/backend/owncloud/OwncloudNewsMessage.vala
@@ -15,108 +15,136 @@
public class FeedReader.OwnCloudNewsMessage : GLib.Object {
- private Soup.Session m_session;
+ private Soup.Session m_session;
private Soup.Message m_message_soup;
- private GLib.StringBuilder m_message_string;
+ private GLib.StringBuilder m_message_string;
private string m_contenttype;
private Json.Parser m_parser;
private Json.Object m_root_object;
- private string m_method;
- private OwncloudNewsUtils m_utils;
-
- public OwnCloudNewsMessage(string destination, string username, string password, string method)
- {
- m_utils = new OwncloudNewsUtils();
- m_message_string = new GLib.StringBuilder();
- m_method = method;
- m_session = new Soup.Session();
- m_session.user_agent = Constants.USER_AGENT;
- m_session.ssl_strict = false;
- m_contenttype = "application/json";
+ private string m_method;
+ private string m_destination;
+
+ public OwnCloudNewsMessage(Soup.Session session, string destination, string username, string password, string method)
+ {
+ m_message_string = new GLib.StringBuilder();
+ m_method = method;
+ m_session = session;
+ m_destination = destination;
+
+ if(method == "GET")
+ m_contenttype = "application/x-www-form-urlencoded";
+ else
+ m_contenttype = "application/json";
+
m_parser = new Json.Parser();
- m_message_soup = new Soup.Message(m_method, destination);
-
- string credentials = username + ":" + password;
- string base64 = GLib.Base64.encode(credentials.data);
- m_message_soup.request_headers.append("Authorization","Basic %s".printf(base64));
-
- m_session.authenticate.connect((msg, auth, retrying) => {
- if(m_utils.getHtaccessUser() == "")
- {
- Logger.error("ownCloud Session: need Authentication");
- }
- else
- {
- auth.authenticate(m_utils.getHtaccessUser(), m_utils.getHtaccessPasswd());
- }
- });
+ m_message_soup = new Soup.Message(m_method, m_destination);
+
+ string credentials = username + ":" + password;
+ string base64 = GLib.Base64.encode(credentials.data);
+ m_message_soup.request_headers.append("Authorization","Basic %s".printf(base64));
}
- public void add_int(string type, int val)
+ public void add_int(string type, int val)
{
- m_message_string.append(",\"" + type + "\":" + val.to_string());
+ if(m_method == "GET")
+ {
+ if(m_message_string.len > 0)
+ m_message_string.append("&");
+
+ m_message_string.append(type + "=" + val.to_string());
+ }
+ else
+ m_message_string.append(",\"" + type + "\":" + val.to_string());
}
public void add_int_array(string type, string values)
{
- m_message_string.append(",\"" + type + "\":[" + values + "]");
+ if(m_method == "GET")
+ Logger.warning("OwnCloudNewsMessage.add_int_array: this should not happen");
+ else
+ m_message_string.append(",\"" + type + "\":[" + values + "]");
}
public void add_bool(string type, bool val)
{
- m_message_string.append(",\"" + type + "\":");
- if(val)
- m_message_string.append("true");
+ if(m_method == "GET")
+ {
+ if(m_message_string.len > 0)
+ m_message_string.append("&");
+
+ m_message_string.append(type + "=" + (val ? "true" : "false"));
+ }
else
- m_message_string.append("false");
+ m_message_string.append(",\"" + type + "\":" + (val ? "true" : "false"));
}
public void add_string(string type, string val)
{
- m_message_string.append(",\"" + type + "\":\"" + val + "\"");
+ if(m_method == "GET")
+ {
+ if(m_message_string.len > 0)
+ m_message_string.append("&");
+
+ m_message_string.append(type + "=" + val);
+ }
+ else
+ m_message_string.append(",\"" + type + "\":\"" + val + "\"");
}
- public ConnectionError send(bool ping = false)
+ public ConnectionError send(bool ping = false)
{
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- m_message_string.overwrite(0, "{").append("}");
- m_message_soup.set_request(m_contenttype, Soup.MemoryUse.COPY, m_message_string.str.data);
+ var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
+
+ if(m_method == "GET")
+ {
+ string destination = m_destination;
+ if(m_message_string.len > 0)
+ destination += "?" + m_message_string.str;
+ m_message_soup.set_uri(new Soup.URI(destination));
+ Logger.debug(destination);
+ }
+ else
+ {
+ m_message_string.overwrite(0, "{").append("}");
+ m_message_soup.set_request(m_contenttype, Soup.MemoryUse.COPY, m_message_string.str.data);
+ }
if(settingsTweaks.get_boolean("do-not-track"))
m_message_soup.request_headers.append("DNT", "1");
var status = m_session.send_message(m_message_soup);
- if(status == 401) // unauthorized
+ if(status == 401) // unauthorized
{
return ConnectionError.UNAUTHORIZED;
}
- if(m_message_soup.tls_errors != 0 && !settingsTweaks.get_boolean("ignore-tls-errors"))
+ if(m_message_soup.tls_errors != 0 && !settingsTweaks.get_boolean("ignore-tls-errors"))
{
Logger.info("TLS errors: " + Utils.printTlsCertificateFlags(m_message_soup.tls_errors));
return ConnectionError.CA_ERROR;
}
- if((string)m_message_soup.response_body.flatten().data == null
- || (string)m_message_soup.response_body.flatten().data == "")
- {
- Logger.error("ownCloud Message: No response - status code: %s".printf(Soup.Status.get_phrase(m_message_soup.status_code)));
- return ConnectionError.NO_RESPONSE;
- }
+ if(m_message_soup.status_code != 200)
+ {
+ Logger.error("Nextcloud Message: No response - status code: %u %s".printf(m_message_soup.status_code, Soup.Status.get_phrase(m_message_soup.status_code)));
+ return ConnectionError.NO_RESPONSE;
+ }
- if(ping)
- {
- Logger.debug("ownCloud Message: ping successfull");
+ if(ping)
+ {
+ Logger.debug("Nextcloud Message: ping successful");
return ConnectionError.SUCCESS;
- }
+ }
- try{
+ try
+ {
m_parser.load_from_data((string)m_message_soup.response_body.flatten().data);
}
- catch (Error e) {
- Logger.error("Could not load response from Message to owncloud");
- printMessage();
+ catch(Error e)
+ {
+ Logger.error("Could not load response from Message to Nextcloud");
+ printMessage();
Logger.error(e.message);
return ConnectionError.UNKNOWN;
}
@@ -125,20 +153,25 @@ public class FeedReader.OwnCloudNewsMessage : GLib.Object {
return ConnectionError.SUCCESS;
}
- public Json.Object? get_response_object()
+ public uint getStatusCode()
+ {
+ return m_message_soup.status_code;
+ }
+
+ public Json.Object? get_response_object()
{
return m_root_object;
}
- public string getMessage()
+ public string getMessage()
{
return m_message_string.str;
}
- public void printMessage()
- {
- Logger.debug(m_message_string.str);
- }
+ public void printMessage()
+ {
+ Logger.debug(m_message_string.str);
+ }
public void printResponse()
{
diff --git a/plugins/backend/owncloud/OwncloudNewsUtils.vala b/plugins/backend/owncloud/OwncloudNewsUtils.vala
index 20bd8cb0..18ea31ae 100644
--- a/plugins/backend/owncloud/OwncloudNewsUtils.vala
+++ b/plugins/backend/owncloud/OwncloudNewsUtils.vala
@@ -15,16 +15,43 @@
public class FeedReader.OwncloudNewsUtils : GLib.Object {
- GLib.Settings m_settings;
+ GLib.Settings m_settings;
+ Password m_password;
+ Password m_htaccess_password;
- public OwncloudNewsUtils()
- {
- m_settings = new GLib.Settings ("org.gnome.feedreader.owncloud");
- }
+ public OwncloudNewsUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
+ {
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.owncloud", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.owncloud");
+
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, pwSchema, "FeedReader: Nextcloud login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = getURL();
+ attributes["Username"] = getUser();
+ return attributes;
+ });
+
+ var htAccessSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING,
+ "htaccess", Secret.SchemaAttributeType.BOOLEAN);
+ m_htaccess_password = new Password(secrets, htAccessSchema, "FeedReader: Nextcloud login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = getURL();
+ attributes["Username"] = getHtaccessUser();
+ attributes["htaccess"] = "true";
+ return attributes;
+ });
+ }
- public string getURL()
+ public string getURL()
{
- string tmp_url = m_settings.get_string("url");
+ string tmp_url = Utils.gsettingReadString(m_settings, "url");
if(tmp_url != ""){
if(!tmp_url.has_suffix("/"))
tmp_url = tmp_url + "/";
@@ -36,242 +63,85 @@ public class FeedReader.OwncloudNewsUtils : GLib.Object {
tmp_url = "https://" + tmp_url;
}
- Logger.debug("OwnCloud URL: " + tmp_url);
+ Logger.debug("Nextcloud URL: " + tmp_url);
return tmp_url;
}
- public void setURL(string url)
- {
- m_settings.set_string ("url", url);
- }
+ public void setURL(string url)
+ {
+ Utils.gsettingWriteString(m_settings, "url", url);
+ }
- public string getUser()
+ public string getUser()
{
- return m_settings.get_string ("username");
+ return Utils.gsettingReadString(m_settings, "username");
}
- public void setUser(string user)
+ public void setUser(string user)
{
- m_settings.set_string ("username", user);
+ Utils.gsettingWriteString(m_settings, "username", user);
}
- public string getHtaccessUser()
+ public string getHtaccessUser()
{
- return m_settings.get_string ("htaccess-username");
+ return Utils.gsettingReadString(m_settings, "htaccess-username");
}
- public void setHtaccessUser(string ht_user)
+ public void setHtaccessUser(string ht_user)
{
- m_settings.set_string ("htaccess-username", ht_user);
+ Utils.gsettingWriteString(m_settings, "htaccess-username", ht_user);
}
- public string getUnmodifiedURL()
- {
- return m_settings.get_string("url");
- }
+ public string getUnmodifiedURL()
+ {
+ return Utils.gsettingReadString(m_settings, "url");
+ }
public string getPasswd()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
-
- string passwd = "";
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error("OwncloudNewsUtils: getPasswd: " + e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_password.get_password();
}
- public void setPassword(string passwd)
- {
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "FeedReader: ownCloud login", passwd, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("OwncloudNewsUtils: setPassword: " + e.message);
- }
- }
-
- public void resetAccount()
- {
- Utils.resetSettings(m_settings);
- deletePassword();
- }
-
- public bool deletePassword()
+ public void setPassword(string passwd)
{
- bool removed = false;
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
-
- Secret.password_clearv.begin (pwSchema, attributes, null, (obj, async_res) => {
- try
- {
- removed = Secret.password_clearv.end(async_res);
- }
- catch(GLib.Error e)
- {
- Logger.error("OwncloudNewsUtils.deletePassword: %s".printf(e.message));
- }
- });
- return removed;
+ m_password.set_password(passwd);
}
- public string getHtaccessPasswd()
+ public void resetAccount()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING,
- "htaccess", Secret.SchemaAttributeType.BOOLEAN);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getHtaccessUser();
- attributes["Username"] = "true";
-
- string passwd = "";
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error("OwncloudNewsUtils: getHtaccessPasswd: " + e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ Utils.resetSettings(m_settings);
+ m_password.delete_password();
+ m_htaccess_password.delete_password();
}
- public void setHtAccessPassword(string passwd)
- {
- var pwAuthSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING,
- "htaccess", Secret.SchemaAttributeType.BOOLEAN);
- var authAttributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- authAttributes["URL"] = getURL();
- authAttributes["Username"] = getHtaccessUser();
- authAttributes["htaccess"] = "true";
- try
- {
- Secret.password_storev_sync(pwAuthSchema,
- authAttributes,
- Secret.COLLECTION_DEFAULT,
- "FeedReader: ownCloud htaccess Authentication",
- passwd,
- null);
- }
- catch(GLib.Error e)
- {
- Logger.error("OwncloudNewsUtils: setHtaccessPasswd: " + e.message);
- }
- }
-
-
- public bool downloadIcon(string feed_id, string? icon_url)
+ public string getHtaccessPasswd()
{
- if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
- return false;
-
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e){
- Logger.debug(e.message);
- }
- }
-
- string local_filename = icon_path + feed_id + ".ico";
+ return m_htaccess_password.get_password();
+ }
+ public void setHtAccessPassword(string passwd)
+ {
+ m_htaccess_password.set_password(passwd);
+ }
+ public int countUnread(Gee.List<Feed> feeds, string id)
+ {
+ int unread = 0;
- if(!FileUtils.test(local_filename, GLib.FileTest.EXISTS))
+ foreach(Feed feed in feeds)
{
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message("GET", icon_url);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.ssl_strict = false;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
+ var ids = feed.getCatIDs();
+ foreach(string ID in ids)
{
- try{
- FileUtils.set_contents( local_filename,
- (string)message_dlIcon.response_body.flatten().data,
- (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
+ if(ID == id)
{
- Logger.error("Error writing icon: %s".printf(e.message));
+ unread += (int)feed.getUnread();
+ break;
}
- return true;
}
- Logger.error("Error downloading icon for feed %s, url: %s, status: %u".printf(feed_id, icon_url, status));
- return false;
}
- // file already exists
- return true;
+ return unread;
}
-
-
- public int countUnread(Gee.LinkedList<feed> feeds, string id)
- {
- int unread = 0;
-
- foreach(feed Feed in feeds)
- {
- var ids = Feed.getCatIDs();
- foreach(string ID in ids)
- {
- if(ID == id)
- {
- unread += (int)Feed.getUnread();
- break;
- }
- }
- }
-
- return unread;
- }
}
diff --git a/plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud-symbolic.svg b/plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud-symbolic.svg
new file mode 100644
index 00000000..795cf1bd
--- /dev/null
+++ b/plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud-symbolic.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="32"
+ width="64"
+ version="1.1"
+ id="svg10"
+ sodipodi:docname="feed-service-nextcloud-symbolic.svg"
+ inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
+ <metadata
+ id="metadata16">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs14" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1649"
+ inkscape:window-height="768"
+ id="namedview12"
+ showgrid="false"
+ inkscape:zoom="11.561645"
+ inkscape:cx="36.048533"
+ inkscape:cy="14.830264"
+ inkscape:window-x="182"
+ inkscape:window-y="225"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg10" />
+ <g
+ id="g8"
+ transform="matrix(0.25,0,0,0.25,0,-0.25)"
+ style="fill:none;stroke:#ffffff;stroke-width:22">
+ <circle
+ cy="64"
+ cx="40"
+ r="26"
+ id="circle2" />
+ <circle
+ cy="64"
+ cx="216"
+ r="26"
+ id="circle4" />
+ <circle
+ cy="64"
+ cx="128"
+ r="46"
+ id="circle6" />
+ </g>
+</svg>
diff --git a/plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud.svg b/plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud.svg
new file mode 100644
index 00000000..11cb6ed4
--- /dev/null
+++ b/plugins/backend/owncloud/icons/64x64/places/feed-service-nextcloud.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="64"
+ width="64"
+ viewBox="0 0 64 64"
+ version="1.1"
+ id="svg6"
+ sodipodi:docname="feed-service-nextcloud.svg"
+ inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
+ <metadata
+ id="metadata12">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs10" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1439"
+ inkscape:window-height="869"
+ id="namedview8"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.3037281"
+ inkscape:cx="95.452148"
+ inkscape:cy="49.397217"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg6" />
+ <rect
+ rx="10"
+ ry="10"
+ height="64"
+ width="64"
+ id="rect2"
+ x="0"
+ y="0"
+ style="fill:#0082c9;stroke-width:0.5" />
+ <path
+ style="color:#000000;text-indent:0;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;white-space:normal;isolation:auto;mix-blend-mode:normal;fill:#ffffff;stroke-width:0.5"
+ d="m 32.045,18.684 c -6.25,0 -11.5,4.28 -13.1035,10.039 -1.4,-3.08 -4.481,-5.2625 -8.061,-5.2625 C 6.008,23.4615 2,27.4685 2,32.342 c -10e-4,4.875 4.0065,8.882 8.88,8.883 3.581,-0.001 6.66,-2.185 8.06,-5.265 1.603,5.759 6.854,10.04 13.106,10.04 6.217,10e-4 11.44,-4.2335 13.0765,-9.943 1.4225,3.023 4.4565,5.167 7.995,5.1675 4.875,0 8.8835,-4.008 8.883,-8.8835 0,-4.875 -4.0075,-8.882 -8.882,-8.881 -3.539,10e-4 -6.575,2.145 -7.997,5.168 -1.637,-5.71 -6.8585,-9.945 -13.075,-9.944 z m 0,5.2135 a 8.405,8.405 0 0 1 8.445,8.444 c 0,4.695 -3.75,8.446 -8.445,8.445 a 8.405,8.405 0 0 1 -8.443,-8.445 c 0,-4.695 3.75,-8.4435 8.4435,-8.444 z m -21.165,4.776 c 2.057,0 3.6675,1.611 3.668,3.6675 0,2.057 -1.61,3.67 -3.6675,3.67 -2.0565,0 -3.6675,-1.613 -3.667,-3.67 0,-2.0565 1.611,-3.6675 3.6675,-3.6675 z m 42.2375,0 c 2.057,0 3.669,1.61 3.669,3.6675 0,2.0575 -1.6115,3.67 -3.669,3.67 -2.057,0 -3.668,-1.613 -3.6675,-3.67 0,-2.0565 1.611,-3.6675 3.6675,-3.6675 z"
+ id="path4"
+ inkscape:connector-curvature="0" />
+</svg>
diff --git a/plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud-symbolic.svg b/plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud-symbolic.svg
deleted file mode 100644
index c1a2fda5..00000000
--- a/plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud-symbolic.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- enable-background="new 0 0 595.275 311.111"
- xml:space="preserve"
- height="32"
- width="64"
- version="1.1"
- y="0px"
- x="0px"
- viewBox="0 0 64 31.999997"
- id="svg2"
- inkscape:version="0.91 r13725"
- sodipodi:docname="feed-service-owncloud-symbolic.svg"><metadata
- id="metadata12"><rdf:RDF><cc:Work
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
- id="defs10" /><sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1145"
- id="namedview8"
- showgrid="false"
- inkscape:zoom="7.375"
- inkscape:cx="-3.7078393"
- inkscape:cy="8.8795262"
- inkscape:window-x="0"
- inkscape:window-y="27"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg2" /><path
- style="text-indent:0;text-transform:none;block-progression:tb;color:#000000;fill:#bebebe;fill-opacity:1;enable-background:accumulate"
- d="m 29.165911,-2e-6 c -4.465835,0 -8.073974,3.559259 -8.073974,7.964927 0,1.815983 0.612999,3.487345 1.646446,4.825716 2.241942,-2.559845 5.550981,-4.185433 9.245469,-4.185433 1.807494,0 3.521539,0.397061 5.065984,1.093227 0.125039,-0.55786 0.189978,-1.138017 0.189978,-1.73351 0,-4.405519 -3.607987,-7.964926 -8.073973,-7.964926 z M 18.622446,3.685529 c -2.325693,0 -4.195237,1.859927 -4.195237,4.15421 0,0.742828 0.19426,1.444716 0.538249,2.045884 1.403395,-0.781004 3.02594,-1.233755 4.749334,-1.233755 0.166319,0 0.326519,0.0059 0.490768,0.01578 -0.0186,-0.232575 -0.03164,-0.465526 -0.03164,-0.702776 0,-1.277851 0.281343,-2.493701 0.775747,-3.591963 C 20.28402,3.932579 19.486522,3.68577 18.622475,3.68577 z m 19.915435,2.857964 c -0.17182,0 -0.337435,0.02072 -0.506599,0.03117 0.07318,0.455127 0.126639,0.914675 0.126639,1.389966 0,0.739573 -0.09534,1.453251 -0.269129,2.139551 2.037444,1.112319 3.729488,2.776677 4.844335,4.794495 1.156296,-0.593867 2.446241,-0.971447 3.815288,-1.061957 C 46.195575,9.754716 42.767527,6.54359 38.537941,6.54359 z m -6.553979,2.967266 c -6.24898,0 -11.303463,4.985726 -11.303463,11.150803 0,6.164585 5.053984,11.150802 11.303463,11.150802 6.24948,0 11.303463,-4.986218 11.303463,-11.150802 0,-6.165077 -5.054483,-11.150803 -11.303463,-11.150803 z m -12.26896,0.04676 c -4.848084,0 -8.770471,3.869364 -8.770471,8.652022 0,2.815445 1.359796,5.307813 3.466988,6.887186 0.888347,-1.690253 2.672592,-2.842327 4.733485,-2.842327 0.249084,0 0.488164,0.02979 0.728247,0.06254 -0.07536,-0.540891 -0.110819,-1.094216 -0.110819,-1.65543 0,-2.68311 0.885347,-5.164281 2.390492,-7.16834 C 21.251867,12.381 20.60712,11.044649 20.33227,9.588835 20.128586,9.575025 19.922161,9.557665 19.714872,9.557665 z m 27.48291,5.153923 c -1.472095,0 -2.851091,0.370763 -4.068586,0.999513 0.691347,1.510664 1.076496,3.18681 1.076496,4.950707 0,3.302674 -1.346045,6.301705 -3.530339,8.480373 1.604645,1.757433 3.932838,2.857963 6.52248,2.857963 4.848083,0 8.77047,-3.869314 8.77047,-8.65202 0,-4.782609 -3.922337,-8.636238 -8.77047,-8.636238 z M 10.089974,15.851578 C 5.6234882,15.851084 2,19.39456 2,23.800227 c 0,4.40567 3.6236881,7.98022 8.089474,7.98022 1.699794,0 3.274439,-0.522445 4.575184,-1.405552 -0.537498,-0.823917 -0.854897,-1.808978 -0.854897,-2.857964 0,-0.544444 0.08144,-1.067531 0.237464,-1.561715 -2.435142,-1.736076 -4.021086,-4.561189 -4.021086,-7.745928 0,-0.809219 0.108099,-1.591704 0.300794,-2.34262 -0.07998,-0.002 -0.1569,-0.01578 -0.237469,-0.01578 z m 47.477344,6.840327 c -0.238244,0 -0.468778,0.02683 -0.696548,0.06254 0.0126,0.198658 0.0158,0.391676 0.0158,0.593471 0,2.540264 -1.016047,4.845941 -2.659642,6.55918 0.808598,0.927598 1.996294,1.514858 3.340389,1.514858 C 60.015506,31.421955 62,29.479899 62,27.064722 c 0,-2.415126 -1.984494,-4.37282 -4.432686,-4.37282 z m -38.421874,0.468504 c -2.448092,0 -4.416886,1.942204 -4.416886,4.357233 0,2.41503 1.968794,4.37282 4.416886,4.37282 1.876494,0 3.469289,-1.155082 4.116086,-2.779884 -1.578245,-1.585734 -2.712541,-3.608683 -3.213689,-5.856305 -0.293284,-0.05978 -0.590948,-0.09372 -0.902397,-0.09372 z"
- id="path6"
- inkscape:connector-curvature="0" /></svg> \ No newline at end of file
diff --git a/plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud.svg b/plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud.svg
deleted file mode 100644
index f26a80d0..00000000
--- a/plugins/backend/owncloud/icons/64x64/places/feed-service-owncloud.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- enable-background="new 0 0 595.275 311.111"
- xml:space="preserve"
- height="64"
- width="64"
- version="1.1"
- y="0px"
- x="0px"
- viewBox="0 0 64 63.999995"
- id="svg2"
- inkscape:version="0.91 r13725"
- sodipodi:docname="feed-service-owncloud.svg"><metadata
- id="metadata12"><rdf:RDF><cc:Work
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
- id="defs10" /><sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1342"
- inkscape:window-height="743"
- id="namedview8"
- showgrid="false"
- inkscape:zoom="5.2149125"
- inkscape:cx="38.419762"
- inkscape:cy="26.49606"
- inkscape:window-x="211"
- inkscape:window-y="315"
- inkscape:window-maximized="0"
- inkscape:current-layer="svg2" /><rect
- rx="8.59375"
- ry="8.59375"
- height="55"
- width="55"
- y="4.4999981"
- x="4.5"
- id="rect4"
- style="fill:#1d2d44" /><path
- style="color:#000000;text-indent:0;text-transform:none;block-progression:tb;fill:#ffffff;enable-background:accumulate"
- d="m 29.564531,17.014219 c -3.83784,0 -6.938594,3.100625 -6.938594,6.938594 0,1.581981 0.526797,3.037977 1.414918,4.203891 1.926676,-2.229992 4.770391,-3.646114 7.945352,-3.646114 1.55332,0 3.026332,0.345899 4.353594,0.95236 0.107456,-0.485977 0.163264,-0.991375 0.163264,-1.510137 0,-3.83784 -3.100625,-6.938594 -6.938594,-6.938594 z m -9.06082,3.210625 c -1.998648,0 -3.605293,1.620266 -3.605293,3.618914 0,0.64711 0.166942,1.258555 0.462559,1.782258 1.206046,-0.680367 2.600425,-1.074777 4.081472,-1.074777 0.142931,0 0.280603,0.0052 0.421756,0.01375 -0.01598,-0.202606 -0.02719,-0.405539 -0.02719,-0.612219 0,-1.113191 0.241781,-2.172371 0.66666,-3.129113 -0.572043,-0.383591 -1.257394,-0.598598 -1.999937,-0.598598 z m 17.114883,2.489696 c -0.147658,0 -0.289983,0.01805 -0.43536,0.02716 0.06289,0.396481 0.108832,0.796812 0.108832,1.210859 0,0.644274 -0.08193,1.265989 -0.231284,1.863856 1.750934,0.968988 3.205039,2.418883 4.163113,4.176691 0.993696,-0.517344 2.102246,-0.846269 3.278774,-0.925117 -0.303222,-3.556008 -3.249211,-6.353359 -6.884024,-6.353359 z m -5.632344,2.584914 c -5.370234,0 -9.713945,4.343281 -9.713945,9.713945 0,5.370234 4.343281,9.713945 9.713945,9.713945 5.370664,0 9.713945,-4.343711 9.713945,-9.713945 0,-5.370664 -4.343711,-9.713945 -9.713945,-9.713945 z m -10.543672,0.04073 c -4.166336,0 -7.537148,3.37077 -7.537148,7.537149 0,2.452656 1.168578,4.623867 2.979453,5.999726 0.763426,-1.472453 2.296765,-2.476074 4.067851,-2.476074 0.214058,0 0.419517,0.02595 0.62584,0.05448 -0.06476,-0.471195 -0.09524,-0.953218 -0.09524,-1.442117 0,-2.337371 0.760848,-4.498828 2.054336,-6.244648 -0.774297,-0.96886 -1.328379,-2.133012 -1.564578,-3.401235 -0.175042,-0.01203 -0.352438,-0.02716 -0.530578,-0.02716 z m 23.618203,4.489805 c -1.265086,0 -2.450164,0.322987 -3.496453,0.870719 0.594129,1.316003 0.925117,2.776168 0.925117,4.312773 0,2.877102 -1.156761,5.489687 -3.033894,7.387617 1.378996,1.530977 3.379793,2.489695 5.605273,2.489695 4.166336,0 7.537149,-3.370726 7.537149,-7.537148 0,-4.166336 -3.37077,-7.523398 -7.537149,-7.523398 z M 13.171094,30.823215 C 9.3326953,30.822786 6.21875,33.909661 6.21875,37.74763 c 0,3.837968 3.1141172,6.951914 6.951914,6.951914 1.460766,0 2.813981,-0.455125 3.931813,-1.224438 -0.461914,-0.71775 -0.73468,-1.575879 -0.73468,-2.489695 0,-0.474289 0.06999,-0.929973 0.204071,-1.360477 -2.092707,-1.512371 -3.455632,-3.973449 -3.455632,-6.747812 0,-0.704946 0.0929,-1.386602 0.258495,-2.040758 -0.06873,-0.0017 -0.134836,-0.01375 -0.204075,-0.01375 z m 40.800976,5.958907 c -0.204741,0 -0.402857,0.02338 -0.598597,0.05448 0.01083,0.173061 0.01358,0.341206 0.01358,0.517 0,2.212934 -0.873168,4.221508 -2.285637,5.713984 0.694891,0.808071 1.71557,1.319657 2.870656,1.319657 2.103922,0 3.809352,-1.691809 3.809352,-3.795774 0,-2.103922 -1.70543,-3.809351 -3.809352,-3.809351 z m -33.018906,0.408134 c -2.103836,0 -3.795773,1.691938 -3.795773,3.795774 0,2.103835 1.691937,3.809351 3.795773,3.809351 1.612617,0 2.98143,-1.006242 3.537274,-2.421676 -1.356309,-1.381402 -2.331098,-3.143679 -2.761774,-5.101679 -0.252042,-0.05208 -0.507848,-0.08164 -0.7755,-0.08164 z"
- id="path6"
- inkscape:connector-curvature="0" /></svg> \ No newline at end of file
diff --git a/plugins/backend/owncloud/meson.build b/plugins/backend/owncloud/meson.build
new file mode 100644
index 00000000..3fe44a7d
--- /dev/null
+++ b/plugins/backend/owncloud/meson.build
@@ -0,0 +1,49 @@
+owncloud_resources = gnome.compile_resources(
+ 'owncloud_res',
+ 'owncloud.gresource.xml'
+)
+
+shared_library(
+ 'owncloud',
+ [
+ 'OwncloudNewsAPI.vala',
+ 'OwncloudNewsInterface.vala',
+ 'OwncloudNewsUtils.vala',
+ 'OwncloudNewsMessage.vala'
+ ],
+ owncloud_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.owncloud.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'owncloud.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/owncloud/org.gnome.feedreader.owncloud.gschema.xml b/plugins/backend/owncloud/org.gnome.feedreader.owncloud.gschema.xml
index 0a3449fd..5b13e349 100644
--- a/plugins/backend/owncloud/org.gnome.feedreader.owncloud.gschema.xml
+++ b/plugins/backend/owncloud/org.gnome.feedreader.owncloud.gschema.xml
@@ -1,26 +1,26 @@
<schemalist>
- <schema id="org.gnome.feedreader.owncloud" path="/org/gnome/feedreader/owncloud/" gettext-domain="feedreader">
+ <schema id="org.gnome.feedreader.owncloud" path="/org/gnome/feedreader/owncloud/" gettext-domain="feedreader">
<key name="url" type="s">
<default>""</default>
- <summary>Link to your owncloud instance</summary>
+ <summary>Link to your Nextcloud instance</summary>
<description>
- Link to your owncloud instance
+ Link to your Nextcloud instance
</description>
</key>
<key name="username" type="s">
<default>""</default>
- <summary>Username to log into owncloud</summary>
+ <summary>Username to log into Nextcloud</summary>
<description>
- Username to log into owncloud
+ Username to log into Nextcloud
</description>
</key>
-
+
<key name="htaccess-username" type="s">
<default>""</default>
- <summary>Username to log into owncloud</summary>
+ <summary>Username to log into Nextcloud</summary>
<description>
- Username to log into owncloud
+ Username to log into Nextcloud
</description>
</key>
</schema>
diff --git a/plugins/backend/owncloud/owncloud.gresource.xml b/plugins/backend/owncloud/owncloud.gresource.xml
index f226e9cc..05470236 100644
--- a/plugins/backend/owncloud/owncloud.gresource.xml
+++ b/plugins/backend/owncloud/owncloud.gresource.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/FeedReader">
- <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-owncloud.svg</file>
- <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-owncloud-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-nextcloud.svg</file>
+ <file preprocess="xml-stripblanks">icons/64x64/places/feed-service-nextcloud-symbolic.svg</file>
</gresource>
</gresources>
diff --git a/plugins/backend/owncloud/owncloud.plugin b/plugins/backend/owncloud/owncloud.plugin
index bdca5478..12d227b2 100644
--- a/plugins/backend/owncloud/owncloud.plugin
+++ b/plugins/backend/owncloud/owncloud.plugin
@@ -1,8 +1,9 @@
[Plugin]
Module=owncloud
Loader=C
-Name=OwnCloud News
-Description=Add OwnCloud News backend to FeedReader
+Name=Nextcloud News
+Version=0.1
+Description=Add Nextcloud News backend to FeedReader
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/owncloud/owncloudUI.plugin b/plugins/backend/owncloud/owncloudUI.plugin
deleted file mode 100644
index a46ced40..00000000
--- a/plugins/backend/owncloud/owncloudUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=owncloudUI
-Loader=C
-Name=OwnCloud News
-Description=Add OwnCloud News backend to FeedReader
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/ttrss/CMakeLists.txt b/plugins/backend/ttrss/CMakeLists.txt
deleted file mode 100644
index e80d4892..00000000
--- a/plugins/backend/ttrss/CMakeLists.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-set (NAME ttrss)
-
-set (UINAME ${NAME}UI)
-set (DAEMONTARGET ${NAME}_target)
-set (UITARGET ${UINAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${DAEMONTARGET}
- ttrssAPI.vala
- ttrssInterface.vala
- ttrssMessage.vala
- ttrssUtils.vala
-
-PACKAGES
- libpeas-1.0
- json-glib-1.0
- libsoup-2.4
- gee-0.8
- libxml-2.0
- sqlite3
- libsecret-1
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReader.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
-)
-
-add_library(${NAME} SHARED ${VALA_C})
-
-
-# ----------------------------------------------------------
-# UI Plugin
-# ----------------------------------------------------------
-
-
-vala_precompile(VALA_C2 ${UITARGET}
- ttrssLoginWidget.vala
- ttrssUtils.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${UINAME} SHARED ${VALA_C2} ${GRESOURCES})
-
-
-# ----------------------------------------------------------
-
-
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-add_dependencies(${UINAME} ${UI_NAME} ${DAEMON_NAME})
-
-add_schema("org.gnome.feedreader.${NAME}.gschema.xml")
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/plugins)
-install(TARGETS ${UINAME} DESTINATION ${PKGLIBDIR}/pluginsUI)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/plugins)
-install(FILES ${UINAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsUI)
-
diff --git a/plugins/backend/ttrss/meson.build b/plugins/backend/ttrss/meson.build
new file mode 100644
index 00000000..dab7ab9b
--- /dev/null
+++ b/plugins/backend/ttrss/meson.build
@@ -0,0 +1,49 @@
+ttrss_resources = gnome.compile_resources(
+ 'ttrss_res',
+ 'ttrss.gresource.xml'
+)
+
+shared_library(
+ 'ttrss',
+ [
+ 'ttrssAPI.vala',
+ 'ttrssInterface.vala',
+ 'ttrssUtils.vala',
+ 'ttrssMessage.vala'
+ ],
+ ttrss_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ libxml,
+ json_glib,
+ webkit2gtk
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: BACKEND_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.ttrss.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'ttrss.plugin'
+ ],
+ install_dir: BACKEND_PLUGINS_DIR
+)
diff --git a/plugins/backend/ttrss/org.gnome.feedreader.ttrss.gschema.xml b/plugins/backend/ttrss/org.gnome.feedreader.ttrss.gschema.xml
index eb396a9f..a1d740a2 100644
--- a/plugins/backend/ttrss/org.gnome.feedreader.ttrss.gschema.xml
+++ b/plugins/backend/ttrss/org.gnome.feedreader.ttrss.gschema.xml
@@ -1,5 +1,5 @@
<schemalist>
- <schema id="org.gnome.feedreader.ttrss" path="/org/gnome/feedreader/ttrss/" gettext-domain="feedreader">
+ <schema id="org.gnome.feedreader.ttrss" path="/org/gnome/feedreader/ttrss/" gettext-domain="feedreader">
<key name="url" type="s">
<default>""</default>
<summary>Link to your tt-rss instance</summary>
@@ -15,7 +15,7 @@
Username to log into tt-rss
</description>
</key>
-
+
<key name="htaccess-username" type="s">
<default>""</default>
<summary>Username to grant http access</summary>
diff --git a/plugins/backend/ttrss/ttrss.plugin b/plugins/backend/ttrss/ttrss.plugin
index c8c65f6b..80feb636 100644
--- a/plugins/backend/ttrss/ttrss.plugin
+++ b/plugins/backend/ttrss/ttrss.plugin
@@ -2,6 +2,7 @@
Module=ttrss
Loader=C
Name=Tiny Tiny RSS
+Version=0.1
Description=Add Tiny Tiny RSS backend to FeedReader
Authors=Jan Lukas Gernert <jangernert@gmail.com>
Copyright=Copyright © 2015-16 Jan Lukas Gernert
diff --git a/plugins/backend/ttrss/ttrssAPI.vala b/plugins/backend/ttrss/ttrssAPI.vala
index 61ab7b4c..582687f9 100644
--- a/plugins/backend/ttrss/ttrssAPI.vala
+++ b/plugins/backend/ttrss/ttrssAPI.vala
@@ -20,11 +20,28 @@ public class FeedReader.ttrssAPI : GLib.Object {
private string m_ttrss_sessionid;
private uint64 m_ttrss_apilevel;
private Json.Parser m_parser;
+ private string? m_iconDir = null;
+ private Soup.Session m_session;
+ private DataBaseReadOnly m_db;
- public ttrssAPI ()
+ public ttrssAPI (ttrssUtils utils, DataBaseReadOnly db)
{
+ m_db = db;
m_parser = new Json.Parser();
- m_utils = new ttrssUtils();
+ m_utils = utils;
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ m_session.ssl_strict = false;
+ m_session.authenticate.connect((msg, auth, retrying) => {
+ if(m_utils.getHtaccessUser() == "")
+ {
+ Logger.error("TTRSS Session: need Authentication");
+ }
+ else if(!retrying)
+ {
+ auth.authenticate(m_utils.getHtaccessUser(), m_utils.getHtaccessPasswd());
+ }
+ });
}
@@ -35,23 +52,23 @@ public class FeedReader.ttrssAPI : GLib.Object {
string passwd = m_utils.getPasswd();
m_ttrss_url = m_utils.getURL();
- if(m_ttrss_url == "" && username == "" && passwd == ""){
+ if(m_ttrss_url == "" && username == "" && passwd == "")
+ {
m_ttrss_url = "example-host/tt-rss";
return LoginResponse.ALL_EMPTY;
}
if(m_ttrss_url == "")
return LoginResponse.MISSING_URL;
if(GLib.Uri.parse_scheme(m_ttrss_url) == null)
- return LoginResponse.INVALID_URL;
- if(username == "")
- return LoginResponse.MISSING_USER;
+ return LoginResponse.INVALID_URL;
if(passwd == "")
return LoginResponse.MISSING_PASSWD;
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("op", "login");
- message.add_string("user", username);
+ if(username != "")
+ message.add_string("user", username);
message.add_string("password", passwd);
int error = message.send();
if(error != ConnectionError.NO_RESPONSE)
@@ -65,12 +82,20 @@ public class FeedReader.ttrssAPI : GLib.Object {
Logger.info("TTRSS Session ID: %s".printf(m_ttrss_sessionid));
Logger.info("TTRSS API Level: %lld".printf(m_ttrss_apilevel));
+ m_iconDir = m_ttrss_url.replace("api/", getIconDir());
+
if(haveAPIplugin())
return LoginResponse.SUCCESS;
return LoginResponse.PLUGIN_NEEDED;
}
- else if(error == ConnectionError.API_ERROR)
+ else
+ {
+ message.printMessage();
+ message.printResponse();
+ }
+
+ if(error == ConnectionError.API_ERROR)
{
return LoginResponse.API_ERROR;
}
@@ -83,9 +108,9 @@ public class FeedReader.ttrssAPI : GLib.Object {
return LoginResponse.NO_API_ACCESS;
}
else if(error == ConnectionError.CA_ERROR)
- {
- return LoginResponse.CA_ERROR;
- }
+ {
+ return LoginResponse.CA_ERROR;
+ }
else if(error == ConnectionError.UNAUTHORIZED)
{
return LoginResponse.UNAUTHORIZED;
@@ -96,7 +121,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool logout()
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "logout");
int error = message.send();
@@ -116,7 +141,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool isloggedin()
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "isLoggedIn");
int error = message.send();
@@ -134,7 +159,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
private bool haveAPIplugin()
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "removeLabel");
int error = message.send();
@@ -158,7 +183,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public int getUnreadCount()
{
int unread = 0;
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getUnread");
int error = message.send();
@@ -174,13 +199,13 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
- public bool getFeeds(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories)
+ public bool getFeeds(Gee.List<Feed> feeds, Gee.List<Category> categories)
{
foreach(var item in categories)
{
if(int.parse(item.getCatID()) > 0)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getFeeds");
message.add_int("cat_id", int.parse(item.getCatID()));
@@ -190,24 +215,21 @@ public class FeedReader.ttrssAPI : GLib.Object {
{
var response = message.get_response_array();
var feed_count = response.get_length();
- string icon_url = m_ttrss_url.replace("api/", getIconDir());
for(uint i = 0; i < feed_count; i++)
{
var feed_node = response.get_object_element(i);
string feed_id = feed_node.get_int_member("id").to_string();
-
- if(feed_node.get_boolean_member("has_icon"))
- m_utils.downloadIcon(feed_id, icon_url);
+ string? icon_url = feed_node.get_boolean_member("has_icon") ? m_iconDir + feed_id + ".ico" : null;
feeds.add(
- new feed (
+ new Feed(
feed_id,
feed_node.get_string_member("title"),
feed_node.get_string_member("feed_url"),
- feed_node.get_boolean_member("has_icon"),
(int)feed_node.get_int_member("unread"),
- { feed_node.get_int_member("cat_id").to_string() }
+ ListUtils.single(feed_node.get_int_member("cat_id").to_string()),
+ icon_url
)
);
}
@@ -222,9 +244,9 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
- public bool getUncategorizedFeeds(Gee.LinkedList<feed> feeds)
+ public bool getUncategorizedFeeds(Gee.List<Feed> feeds)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getFeeds");
message.add_int("cat_id", 0);
@@ -234,24 +256,21 @@ public class FeedReader.ttrssAPI : GLib.Object {
{
var response = message.get_response_array();
var feed_count = response.get_length();
- string icon_url = m_ttrss_url.replace("api/", getIconDir());
for(uint i = 0; i < feed_count; i++)
{
var feed_node = response.get_object_element(i);
string feed_id = feed_node.get_int_member("id").to_string();
-
- if(feed_node.get_boolean_member("has_icon"))
- m_utils.downloadIcon(feed_id, icon_url);
+ string? icon_url = feed_node.get_boolean_member("has_icon") ? m_iconDir + feed_id + ".ico" : null;
feeds.add(
- new feed (
+ new Feed(
feed_id,
feed_node.get_string_member("title"),
feed_node.get_string_member("feed_url"),
- feed_node.get_boolean_member("has_icon"),
(int)feed_node.get_int_member("unread"),
- { feed_node.get_int_member("cat_id").to_string() }
+ ListUtils.single(feed_node.get_int_member("cat_id").to_string()),
+ icon_url
)
);
}
@@ -261,9 +280,9 @@ public class FeedReader.ttrssAPI : GLib.Object {
return false;
}
- public bool getTags(Gee.LinkedList<tag> tags)
+ public bool getTags(Gee.List<Tag> tags)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getLabels");
int error = message.send();
@@ -277,10 +296,10 @@ public class FeedReader.ttrssAPI : GLib.Object {
{
var tag_node = response.get_object_element(i);
tags.add(
- new tag(
+ new Tag(
tag_node.get_int_member("id").to_string(),
tag_node.get_string_member("caption"),
- dbDaemon.get_default().getTagColor()
+ m_db.getTagColor()
)
);
}
@@ -294,7 +313,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public string? getIconDir()
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getConfig");
int error = message.send();
@@ -309,9 +328,9 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
- public bool getCategories(Gee.LinkedList<category> categories)
+ public bool getCategories(Gee.List<Category> categories)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getFeedTree");
message.add_bool("include_empty", true);
@@ -327,11 +346,12 @@ public class FeedReader.ttrssAPI : GLib.Object {
return true;
}
}
+
return false;
}
- private void getSubCategories(Gee.LinkedList<category> categories, Json.Object categorie, int level, string parent)
+ private void getSubCategories(Gee.List<Category> categories, Json.Object categorie, int level, string parent)
{
level++;
int orderID = 0;
@@ -346,7 +366,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
string catID = categorie_node.get_string_member("id");
string categorieID = catID.slice(4, catID.length);
- if(int.parse(categorieID) >= 0)
+ if(int.parse(categorieID) > 0)
{
string title = categorie_node.get_string_member("name");
int unread_count = (int)categorie_node.get_int_member("unread");
@@ -357,7 +377,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
categories.add(
- new category (
+ new Category (
categorieID,
title,
unread_count,
@@ -376,7 +396,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
private int getUncategorizedUnread()
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getCounters");
message.add_string("output_mode", "c");
@@ -407,9 +427,9 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
- public void getHeadlines(Gee.LinkedList<article> articles, int skip, int limit, ArticleStatus whatToGet, int feedID)
+ public void getHeadlines(Gee.List<Article> articles, int skip, int limit, ArticleStatus whatToGet, int feedID)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getHeadlines");
message.add_int("feed_id", feedID);
@@ -443,22 +463,25 @@ public class FeedReader.ttrssAPI : GLib.Object {
{
var headline_node = response.get_object_element(i);
- string tagString = "";
+ Gee.List<string>? tags = null;
if(headline_node.has_member("labels"))
{
- var tags = headline_node.get_array_member("labels");
+ var labels = headline_node.get_array_member("labels");
- uint tagCount = 0;
- if(tags != null)
- tagCount = tags.get_length();
+ uint tag_count = 0;
+ if(labels != null)
+ tag_count = labels.get_length();
- for(int j = 0; j < tagCount; ++j)
- {
- tagString = tagString + tags.get_array_element(j).get_int_element(0).to_string() + ",";
+ if(tag_count > 0) {
+ tags = new Gee.ArrayList<string>();
+ for(int j = 0; j < tag_count; ++j)
+ {
+ tags.add(labels.get_array_element(j).get_int_element(0).to_string());
+ }
}
}
- string mediaString = "";
+ var enclosures = new Gee.ArrayList<Enclosure>();
if(headline_node.has_member("attachments"))
{
var attachments = headline_node.get_array_member("attachments");
@@ -470,28 +493,27 @@ public class FeedReader.ttrssAPI : GLib.Object {
for(int j = 0; j < mediaCount; ++j)
{
var attachment = attachments.get_object_element(j);
- if(attachment.get_string_member("content_type").contains("audio")
- || attachment.get_string_member("content_type").contains("video"))
- {
- mediaString = mediaString + attachment.get_string_member("content_url") + ",";
- }
+ enclosures.add(new Enclosure(
+ headline_node.get_string_member("id"),
+ attachment.get_string_member("content_url"),
+ EnclosureType.from_string(attachment.get_string_member("content_type"))));
}
}
- var Article = new article(
+ var Article = new Article(
headline_node.get_int_member("id").to_string(),
headline_node.get_string_member("title"),
headline_node.get_string_member("link"),
headline_node.get_string_member("feed_id"),
- (headline_node.get_boolean_member("unread")) ? ArticleStatus.UNREAD : ArticleStatus.READ,
- (headline_node.get_boolean_member("marked")) ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
- "",
- "",
- (headline_node.get_string_member("author") == "") ? null : headline_node.get_string_member("author"),
+ headline_node.get_boolean_member("unread") ? ArticleStatus.UNREAD : ArticleStatus.READ,
+ headline_node.get_boolean_member("marked") ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
+ null,
+ null,
+ headline_node.get_string_member("author"),
new DateTime.from_unix_local(headline_node.get_int_member("updated")),
-1,
- tagString,
- mediaString
+ tags,
+ enclosures
);
articles.add(Article);
@@ -500,9 +522,9 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
// tt-rss server needs newsplusplus extention
- public Gee.LinkedList<string>? NewsPlus(ArticleStatus type, int limit)
+ public Gee.List<string>? NewsPlus(ArticleStatus type, int limit)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getCompactHeadlines");
message.add_int("feed_id", ttrssUtils.TTRSSSpecialID.ALL);
@@ -534,15 +556,13 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
- public void getArticles(string articleIDs, Gee.LinkedList<article> articles)
+ public void getArticles(string articleIDs, Gee.List<Article> articles)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "getArticle");
message.add_string("article_id", articleIDs);
int error = message.send();
- message.printMessage();
- //message.printResponse();
if(error == ConnectionError.SUCCESS)
{
@@ -553,22 +573,25 @@ public class FeedReader.ttrssAPI : GLib.Object {
{
var article_node = response.get_object_element(i);
- string tagString = "";
+ Gee.List<string>? tags = null;
if(article_node.has_member("labels"))
{
- var tags = article_node.get_array_member("labels");
+ var labels = article_node.get_array_member("labels");
+
+ uint tag_count = 0;
+ if(labels != null)
+ tag_count = labels.get_length();
- uint tagCount = 0;
- if(tags != null)
- tagCount = tags.get_length();
+ if(tag_count > 0)
+ tags = new Gee.ArrayList<string>();
- for(int j = 0; j < tagCount; ++j)
+ for(int j = 0; j < tag_count; ++j)
{
- tagString = tagString + tags.get_array_element(j).get_int_element(0).to_string() + ",";
+ tags.add(labels.get_array_element(j).get_int_element(0).to_string());
}
}
- string mediaString = "";
+ var enclosures = new Gee.ArrayList<Enclosure>();
if(article_node.has_member("attachments"))
{
var attachments = article_node.get_array_member("attachments");
@@ -580,28 +603,27 @@ public class FeedReader.ttrssAPI : GLib.Object {
for(int j = 0; j < mediaCount; ++j)
{
var attachment = attachments.get_object_element(j);
- if(attachment.get_string_member("content_type").contains("audio")
- || attachment.get_string_member("content_type").contains("video"))
- {
- mediaString = mediaString + attachment.get_string_member("content_url") + ",";
- }
+ enclosures.add(new Enclosure(
+ article_node.get_string_member("id"),
+ attachment.get_string_member("content_url"),
+ EnclosureType.from_string(attachment.get_string_member("content_type"))));
}
}
- var Article = new article(
+ var Article = new Article(
article_node.get_string_member("id"),
article_node.get_string_member("title"),
article_node.get_string_member("link"),
article_node.get_string_member("feed_id"),
- (article_node.get_boolean_member("unread")) ? ArticleStatus.UNREAD : ArticleStatus.READ,
- (article_node.get_boolean_member("marked")) ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
+ article_node.get_boolean_member("unread") ? ArticleStatus.UNREAD : ArticleStatus.READ,
+ article_node.get_boolean_member("marked") ? ArticleStatus.MARKED : ArticleStatus.UNMARKED,
article_node.get_string_member("content"),
- "",
- (article_node.get_string_member("author") == "") ? null : article_node.get_string_member("author"),
+ null,
+ article_node.get_string_member("author"),
new DateTime.from_unix_local(article_node.get_int_member("updated")),
-1,
- tagString,
- mediaString
+ tags,
+ enclosures
);
articles.add(Article);
@@ -612,7 +634,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool catchupFeed(string feedID, bool isCatID)
{
bool return_value = false;
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "catchupFeed");
message.add_int_array("feed_id", feedID);
@@ -626,13 +648,14 @@ public class FeedReader.ttrssAPI : GLib.Object {
return_value = true;
}
+
return return_value;
}
public bool updateArticleUnread(string articleIDs, ArticleStatus unread)
{
bool return_value = false;
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "updateArticle");
message.add_int_array("article_ids", articleIDs);
@@ -650,9 +673,6 @@ public class FeedReader.ttrssAPI : GLib.Object {
return_value = true;
}
- //message.printMessage();
- //message.printResponse();
-
return return_value;
}
@@ -660,7 +680,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool updateArticleMarked(int articleID, ArticleStatus marked)
{
bool return_value = false;
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "updateArticle");
message.add_int("article_ids", articleID);
@@ -683,7 +703,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool setArticleLabel(int articleID, int tagID, bool add)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "setArticleLabel");
message.add_int("article_ids", articleID);
@@ -703,7 +723,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public int64 addLabel(string caption)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "addLabel");
message.add_string("caption", caption);
@@ -719,7 +739,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool removeLabel(int tagID)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "removeLabel");
message.add_int("label_id", tagID);
@@ -735,7 +755,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool renameLabel(int tagID, string newName)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "renameLabel");
message.add_int("label_id", tagID);
@@ -751,9 +771,10 @@ public class FeedReader.ttrssAPI : GLib.Object {
}
- public bool subscribeToFeed(string feedURL, string? catID = null, string? username = null, string? password = null)
+ public bool subscribeToFeed(string feedURL, string? catID, string? username, string? password, out string errmsg)
{
- var message = new ttrssMessage(m_ttrss_url);
+ errmsg = "";
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "subscribeToFeed");
message.add_string("feed_url", feedURL);
@@ -768,18 +789,55 @@ public class FeedReader.ttrssAPI : GLib.Object {
int error = message.send();
message.printMessage();
+ message.printResponse();
+ Logger.debug(message.getStatusCode().to_string());
if(error == ConnectionError.SUCCESS)
{
- return true;
+ var response = message.get_response_object();
+ if(response.has_member("status"))
+ {
+ var status = response.get_object_member("status");
+ if(status.has_member("code"))
+ {
+ switch(status.get_int_member("code"))
+ {
+ case 0:
+ case 1:
+ return true;
+ case 2:
+ errmsg = _("Invalid URL");
+ return false;
+ case 3:
+ errmsg = _("URL content is HTML, no feeds available");
+ return false;
+ case 4:
+ errmsg = _("URL content is HTML which contains multiple feeds.");
+ return false;
+ case 5:
+ errmsg = _("Couldn't download the URL content.");
+ return false;
+ case 6:
+ errmsg = _("The content is invalid XML.");
+ return false;
+ default:
+ if(status.has_member("message"))
+ errmsg = status.get_string_member("message");
+ else
+ errmsg = "ttrss error";
+ return false;
+ }
+ }
+ }
}
+ errmsg = _("Error reaching tt-rss");
return false;
}
public bool unsubscribeFeed(int feedID)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "unsubscribeFeed");
message.add_int("feed_id", feedID);
@@ -795,7 +853,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public string? createCategory(string title, int? parentID = null)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "addCategory");
message.add_string("caption", title);
@@ -815,7 +873,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool removeCategory(int catID)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "removeCategory");
message.add_int("category_id", catID);
@@ -831,7 +889,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool moveCategory(int catID, int parentID)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "moveCategory");
message.add_int("category_id", catID);
@@ -849,7 +907,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool renameCategory(int catID, string title)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "renameCategory");
message.add_int("category_id", catID);
@@ -866,7 +924,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool renameFeed(int feedID, string title)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "renameFeed");
message.add_int("feed_id", feedID);
@@ -883,7 +941,7 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool moveFeed(int feedID, int catID)
{
- var message = new ttrssMessage(m_ttrss_url);
+ var message = new ttrssMessage(m_session, m_ttrss_url);
message.add_string("sid", m_ttrss_sessionid);
message.add_string("op", "moveFeed");
message.add_int("feed_id", feedID);
@@ -900,8 +958,8 @@ public class FeedReader.ttrssAPI : GLib.Object {
public bool ping()
{
- var message = new ttrssMessage(m_ttrss_url);
Logger.debug("TTRSS: ping");
+ var message = new ttrssMessage(m_session, m_ttrss_url);
int error = message.send(true);
if(error == ConnectionError.SUCCESS)
diff --git a/plugins/backend/ttrss/ttrssInterface.vala b/plugins/backend/ttrss/ttrssInterface.vala
index dc46c15b..ec76224b 100644
--- a/plugins/backend/ttrss/ttrssInterface.vala
+++ b/plugins/backend/ttrss/ttrssInterface.vala
@@ -17,11 +17,189 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
private ttrssAPI m_api;
private ttrssUtils m_utils;
+ private Gtk.Entry m_urlEntry;
+ private Gtk.Entry m_userEntry;
+ private Gtk.Entry m_passwordEntry;
+ private Gtk.Entry m_authPasswordEntry;
+ private Gtk.Entry m_authUserEntry;
+ private Gtk.Revealer m_revealer;
+ private bool m_need_htaccess = false;
+ private DataBaseReadOnly m_db;
+ private DataBase m_db_write;
- public void init()
+ public void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write)
{
- m_api = new ttrssAPI();
- m_utils = new ttrssUtils();
+ m_db = db;
+ m_db_write = db_write;
+ m_utils = new ttrssUtils(settings_backend, secrets);
+ m_api = new ttrssAPI(m_utils, db);
+ }
+
+ public string getWebsite()
+ {
+ return "https://tt-rss.org/";
+ }
+
+ public BackendFlags getFlags()
+ {
+ return (BackendFlags.SELF_HOSTED | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
+ }
+
+ public string getID()
+ {
+ return "ttrss";
+ }
+
+ public string iconName()
+ {
+ return "feed-service-ttrss";
+ }
+
+ public string serviceName()
+ {
+ return "Tiny Tiny RSS";
+ }
+
+ public bool needWebLogin()
+ {
+ return false;
+ }
+
+ public Gtk.Box? getWidget()
+ {
+ var url_label = new Gtk.Label(_("Tiny Tiny RSS URL:"));
+ var user_label = new Gtk.Label(_("Username:"));
+ var password_label = new Gtk.Label(_("Password:"));
+
+ url_label.set_alignment(1.0f, 0.5f);
+ user_label.set_alignment(1.0f, 0.5f);
+ password_label.set_alignment(1.0f, 0.5f);
+
+ url_label.set_hexpand(true);
+ user_label.set_hexpand(true);
+ password_label.set_hexpand(true);
+
+ m_urlEntry = new Gtk.Entry();
+ m_userEntry = new Gtk.Entry();
+ m_passwordEntry = new Gtk.Entry();
+
+ m_urlEntry.activate.connect(() => { tryLogin(); });
+ m_userEntry.activate.connect(() => { tryLogin(); });
+ m_passwordEntry.activate.connect(() => { tryLogin(); });
+
+ m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_passwordEntry.set_visibility(false);
+
+ var grid = new Gtk.Grid();
+ grid.set_column_spacing(10);
+ grid.set_row_spacing(10);
+ grid.set_valign(Gtk.Align.CENTER);
+ grid.set_halign(Gtk.Align.CENTER);
+
+ grid.attach(url_label, 0, 0, 1, 1);
+ grid.attach(m_urlEntry, 1, 0, 1, 1);
+ grid.attach(user_label, 0, 1, 1, 1);
+ grid.attach(m_userEntry, 1, 1, 1, 1);
+ grid.attach(password_label, 0, 2, 1, 1);
+ grid.attach(m_passwordEntry, 1, 2, 1, 1);
+
+
+ // http auth stuff ----------------------------------------------------
+ var auth_user_label = new Gtk.Label(_("Username:"));
+ var auth_password_label = new Gtk.Label(_("Password:"));
+
+ auth_user_label.set_alignment(1.0f, 0.5f);
+ auth_password_label.set_alignment(1.0f, 0.5f);
+
+ auth_user_label.set_hexpand(true);
+ auth_password_label.set_hexpand(true);
+
+ m_authUserEntry = new Gtk.Entry();
+ m_authPasswordEntry = new Gtk.Entry();
+ m_authPasswordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
+ m_authPasswordEntry.set_visibility(false);
+
+ m_authUserEntry.activate.connect(() => { tryLogin(); });
+ m_authPasswordEntry.activate.connect(() => { tryLogin(); });
+
+ var authGrid = new Gtk.Grid();
+ authGrid.margin = 10;
+ authGrid.set_column_spacing(10);
+ authGrid.set_row_spacing(10);
+ authGrid.set_valign(Gtk.Align.CENTER);
+ authGrid.set_halign(Gtk.Align.CENTER);
+
+ authGrid.attach(auth_user_label, 0, 0, 1, 1);
+ authGrid.attach(m_authUserEntry, 1, 0, 1, 1);
+ authGrid.attach(auth_password_label, 0, 1, 1, 1);
+ authGrid.attach(m_authPasswordEntry, 1, 1, 1, 1);
+
+ var frame = new Gtk.Frame(_("HTTP Authorization"));
+ frame.set_halign(Gtk.Align.CENTER);
+ frame.add(authGrid);
+ m_revealer = new Gtk.Revealer();
+ m_revealer.add(frame);
+ //---------------------------------------------------------------------
+
+ var logo = new Gtk.Image.from_icon_name("feed-service-ttrss", Gtk.IconSize.MENU);
+
+ var loginLabel = new Gtk.Label(_("Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"));
+ loginLabel.get_style_context().add_class("h2");
+ loginLabel.set_justify(Gtk.Justification.CENTER);
+ loginLabel.set_lines(3);
+
+ var loginButton = new Gtk.Button.with_label(_("Login"));
+ loginButton.halign = Gtk.Align.END;
+ loginButton.set_size_request(80, 30);
+ loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
+ loginButton.clicked.connect(() => { tryLogin(); });
+
+ var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
+ box.valign = Gtk.Align.CENTER;
+ box.halign = Gtk.Align.CENTER;
+ box.pack_start(loginLabel, false, false, 10);
+ box.pack_start(logo, false, false, 10);
+ box.pack_start(grid, true, true, 10);
+ box.pack_start(m_revealer, true, true, 10);
+ box.pack_end(loginButton, false, false, 20);
+
+ m_urlEntry.set_text(m_utils.getUnmodifiedURL());
+ m_userEntry.set_text(m_utils.getUser());
+ m_passwordEntry.set_text(m_utils.getPasswd());
+
+ return box;
+ }
+
+ public void showHtAccess()
+ {
+ m_revealer.set_reveal_child(true);
+ }
+
+ public void writeData()
+ {
+ m_utils.setURL(m_urlEntry.get_text());
+ m_utils.setUser(m_userEntry.get_text().strip());
+ m_utils.setPassword(m_passwordEntry.get_text().strip());
+ if(m_need_htaccess)
+ {
+ m_utils.setHtaccessUser(m_authUserEntry.get_text().strip());
+ m_utils.setHtAccessPassword(m_authPasswordEntry.get_text().strip());
+ }
+ }
+
+ public async void postLoginAction()
+ {
+ return;
+ }
+
+ public bool extractCode(string redirectURL)
+ {
+ return false;
+ }
+
+ public string buildLoginURL()
+ {
+ return "";
}
public bool supportTags()
@@ -54,7 +232,7 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
return "0";
}
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
return catID == "0";
}
@@ -79,6 +257,11 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
return false;
}
+ public bool syncFeedsAndCategories()
+ {
+ return true;
+ }
+
public bool tagIDaffectedByNameChange()
{
return false;
@@ -124,15 +307,15 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
m_api.catchupFeed(feedID, false);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
m_api.catchupFeed(catID, true);
}
public void markAllItemsRead()
{
- var categories = dbDaemon.get_default().read_categories();
- foreach(category cat in categories)
+ var categories = m_db.read_categories();
+ foreach(Category cat in categories)
{
m_api.catchupFeed(cat.getCatID(), true);
}
@@ -163,26 +346,34 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
m_api.renameLabel(int.parse(tagID), title);
}
- public string addFeed(string feedURL, string? catID, string? newCatName)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg)
{
+ bool success = false;
if(catID == null && newCatName != null)
{
var newCatID = m_api.createCategory(newCatName);
- m_api.subscribeToFeed(feedURL, newCatID);
+ success = m_api.subscribeToFeed(feedURL, newCatID, null, null, out errmsg);
}
else
{
- m_api.subscribeToFeed(feedURL, catID);
+ success = m_api.subscribeToFeed(feedURL, catID, null, null, out errmsg);
}
- return (int.parse(dbDaemon.get_default().getHighestFeedID()) + 1).to_string();
+ if(success)
+ feedID = (int.parse(m_db.getMaxID("feeds", "feed_id")) + 1).to_string();
+ else
+ feedID = "-98";
+
+
+ return success;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
- foreach(feed f in feeds)
+ string? errmsg = null;
+ foreach(Feed f in feeds)
{
- m_api.subscribeToFeed(f.getXmlUrl(), f.getCatIDs()[0]);
+ m_api.subscribeToFeed(f.getXmlUrl(), f.getCatIDs()[0], null, null, out errmsg);
}
}
@@ -235,13 +426,28 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
parser.parse();
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
- if(m_api.getCategories(categories)
- && m_api.getFeeds(feeds, categories)
- && m_api.getUncategorizedFeeds(feeds)
- && m_api.getTags(tags))
- return true;
+ if(m_api.getCategories(categories))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getFeeds(feeds, categories))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getUncategorizedFeeds(feeds))
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(m_api.getTags(tags))
+ return true;
+ }
+ }
+ }
return false;
}
@@ -251,27 +457,37 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
return m_api.getUnreadCount();
}
- public void getArticles(int count, ArticleStatus whatToGet, string? feedID, bool isTagID)
+ public void getArticles(int count, ArticleStatus whatToGet, DateTime? since, string? feedID, bool isTagID, GLib.Cancellable? cancellable = null)
{
var settings_general = new GLib.Settings("org.gnome.feedreader");
// first use newsPlus plugin to update states of 10x as much articles as we would normaly do
var unreadIDs = m_api.NewsPlus(ArticleStatus.UNREAD, 10*settings_general.get_int("max-articles"));
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(unreadIDs != null && whatToGet == ArticleStatus.ALL)
{
Logger.debug("getArticles: newsplus plugin active");
var markedIDs = m_api.NewsPlus(ArticleStatus.MARKED, settings_general.get_int("max-articles"));
- dbDaemon.get_default().updateArticlesByID(unreadIDs, "unread");
- dbDaemon.get_default().updateArticlesByID(markedIDs, "marked");
+ m_db_write.updateArticlesByID(unreadIDs, "unread");
+ m_db_write.updateArticlesByID(markedIDs, "marked");
//updateArticleList();
}
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
string articleIDs = "";
int skip = count;
int amount = 200;
while(skip > 0)
{
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
if(skip >= amount)
{
skip -= amount;
@@ -282,21 +498,22 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
skip = 0;
}
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
m_api.getHeadlines(articles, skip, amount, whatToGet, (feedID == null) ? ttrssUtils.TTRSSSpecialID.ALL : int.parse(feedID));
// only update article states if they haven't been updated by the newsPlus-plugin
if(unreadIDs == null || whatToGet != ArticleStatus.ALL)
{
- dbDaemon.get_default().update_articles(articles);
+ m_db_write.update_articles(articles);
updateArticleList();
}
- foreach(article Article in articles)
+ foreach(Article article in articles)
{
- if(!dbDaemon.get_default().article_exists(Article.getArticleID()))
+ var id = article.getArticleID();
+ if(!m_db.article_exists(id))
{
- articleIDs += Article.getArticleID() + ",";
+ articleIDs += id + ",";
}
}
}
@@ -304,7 +521,7 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
if(articleIDs.length > 0)
articleIDs = articleIDs.substring(0, articleIDs.length -1);
- var articles = new Gee.LinkedList<article>();
+ var articles = new Gee.LinkedList<Article>();
if(articleIDs != "")
m_api.getArticles(articleIDs, articles);
@@ -313,11 +530,13 @@ public class FeedReader.ttrssInterface : Peas.ExtensionBase, FeedServerInterface
return strcmp(a.getArticleID(), b.getArticleID());
});
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
if(articles.size > 0)
{
- dbDaemon.get_default().write_articles(articles);
- updateFeedList();
+ m_db_write.write_articles(articles);
+ refreshFeedListCounter();
updateArticleList();
}
}
diff --git a/plugins/backend/ttrss/ttrssLoginWidget.vala b/plugins/backend/ttrss/ttrssLoginWidget.vala
deleted file mode 100644
index d9c6c7d6..00000000
--- a/plugins/backend/ttrss/ttrssLoginWidget.vala
+++ /dev/null
@@ -1,211 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-FeedReader.Logger logger;
-
-public class FeedReader.ttrssLoginWidget : Peas.ExtensionBase, LoginInterface {
-
- private Gtk.Entry m_urlEntry;
- private Gtk.Entry m_userEntry;
- private Gtk.Entry m_passwordEntry;
- private Gtk.Entry m_authPasswordEntry;
- private Gtk.Entry m_authUserEntry;
- private Gtk.Revealer m_revealer;
- private bool m_need_htaccess = false;
- private ttrssUtils m_utils;
-
- public Logger m_logger { get; construct set; }
-
- public void init()
- {
- logger = m_logger;
- m_utils = new ttrssUtils();
- }
-
- public string getWebsite()
- {
- return "https://tt-rss.org/";
- }
-
- public BackendFlags getFlags()
- {
- return (BackendFlags.SELF_HOSTED | BackendFlags.FREE_SOFTWARE | BackendFlags.FREE);
- }
-
- public string getID()
- {
- return "ttrss";
- }
-
- public string iconName()
- {
- return "feed-service-ttrss";
- }
-
- public string serviceName()
- {
- return "Tiny Tiny RSS";
- }
-
- public bool needWebLogin()
- {
- return false;
- }
-
- public Gtk.Box? getWidget()
- {
- var url_label = new Gtk.Label(_("Tiny Tiny RSS URL:"));
- var user_label = new Gtk.Label(_("Username:"));
- var password_label = new Gtk.Label(_("Password:"));
-
- url_label.set_alignment(1.0f, 0.5f);
- user_label.set_alignment(1.0f, 0.5f);
- password_label.set_alignment(1.0f, 0.5f);
-
- url_label.set_hexpand(true);
- user_label.set_hexpand(true);
- password_label.set_hexpand(true);
-
- m_urlEntry = new Gtk.Entry();
- m_userEntry = new Gtk.Entry();
- m_passwordEntry = new Gtk.Entry();
-
- m_urlEntry.activate.connect(() => { login(); });
- m_userEntry.activate.connect(() => { login(); });
- m_passwordEntry.activate.connect(() => { login(); });
-
- m_passwordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_passwordEntry.set_visibility(false);
-
- var grid = new Gtk.Grid();
- grid.set_column_spacing(10);
- grid.set_row_spacing(10);
- grid.set_valign(Gtk.Align.CENTER);
- grid.set_halign(Gtk.Align.CENTER);
-
- grid.attach(url_label, 0, 0, 1, 1);
- grid.attach(m_urlEntry, 1, 0, 1, 1);
- grid.attach(user_label, 0, 1, 1, 1);
- grid.attach(m_userEntry, 1, 1, 1, 1);
- grid.attach(password_label, 0, 2, 1, 1);
- grid.attach(m_passwordEntry, 1, 2, 1, 1);
-
-
- // http auth stuff ----------------------------------------------------
- var auth_user_label = new Gtk.Label(_("Username:"));
- var auth_password_label = new Gtk.Label(_("Password:"));
-
- auth_user_label.set_alignment(1.0f, 0.5f);
- auth_password_label.set_alignment(1.0f, 0.5f);
-
- auth_user_label.set_hexpand(true);
- auth_password_label.set_hexpand(true);
-
- m_authUserEntry = new Gtk.Entry();
- m_authPasswordEntry = new Gtk.Entry();
- m_authPasswordEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
- m_authPasswordEntry.set_visibility(false);
-
- m_authUserEntry.activate.connect(() => { login(); });
- m_authPasswordEntry.activate.connect(() => { login(); });
-
- var authGrid = new Gtk.Grid();
- authGrid.margin = 10;
- authGrid.set_column_spacing(10);
- authGrid.set_row_spacing(10);
- authGrid.set_valign(Gtk.Align.CENTER);
- authGrid.set_halign(Gtk.Align.CENTER);
-
- authGrid.attach(auth_user_label, 0, 0, 1, 1);
- authGrid.attach(m_authUserEntry, 1, 0, 1, 1);
- authGrid.attach(auth_password_label, 0, 1, 1, 1);
- authGrid.attach(m_authPasswordEntry, 1, 1, 1, 1);
-
- var frame = new Gtk.Frame(_("HTTP Authorization"));
- frame.set_halign(Gtk.Align.CENTER);
- frame.add(authGrid);
- m_revealer = new Gtk.Revealer();
- m_revealer.add(frame);
- //---------------------------------------------------------------------
-
- var logo = new Gtk.Image.from_icon_name("feed-service-ttrss", Gtk.IconSize.MENU);
-
- var loginLabel = new Gtk.Label(_("Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"));
- loginLabel.get_style_context().add_class("h2");
- loginLabel.set_justify(Gtk.Justification.CENTER);
- loginLabel.set_lines(3);
-
- var loginButton = new Gtk.Button.with_label(_("Login"));
- loginButton.halign = Gtk.Align.END;
- loginButton.set_size_request(80, 30);
- loginButton.get_style_context().add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION);
- loginButton.clicked.connect(() => { login(); });
-
- var box = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
- box.valign = Gtk.Align.CENTER;
- box.halign = Gtk.Align.CENTER;
- box.pack_start(loginLabel, false, false, 10);
- box.pack_start(logo, false, false, 10);
- box.pack_start(grid, true, true, 10);
- box.pack_start(m_revealer, true, true, 10);
- box.pack_end(loginButton, false, false, 20);
-
- m_urlEntry.set_text(m_utils.getUnmodifiedURL());
- m_userEntry.set_text(m_utils.getUser());
- m_passwordEntry.set_text(m_utils.getPasswd());
-
- return box;
- }
-
- public void showHtAccess()
- {
- m_revealer.set_reveal_child(true);
- }
-
- public void writeData()
- {
- m_utils.setURL(m_urlEntry.get_text());
- m_utils.setUser(m_userEntry.get_text().strip());
- m_utils.setPassword(m_passwordEntry.get_text().strip());
- if(m_need_htaccess)
- {
- m_utils.setHtaccessUser(m_authUserEntry.get_text().strip());
- m_utils.setHtAccessPassword(m_authPasswordEntry.get_text().strip());
- }
- }
-
- public async void postLoginAction()
- {
- return;
- }
-
- public bool extractCode(string redirectURL)
- {
- return false;
- }
-
- public string buildLoginURL()
- {
- return "";
- }
-}
-
-
-[ModuleInit]
-public void peas_register_types(GLib.TypeModule module)
-{
- var objmodule = module as Peas.ObjectModule;
- objmodule.register_extension_type(typeof(FeedReader.LoginInterface), typeof(FeedReader.ttrssLoginWidget));
-}
diff --git a/plugins/backend/ttrss/ttrssMessage.vala b/plugins/backend/ttrss/ttrssMessage.vala
index e5bf02e0..bf91393c 100644
--- a/plugins/backend/ttrss/ttrssMessage.vala
+++ b/plugins/backend/ttrss/ttrssMessage.vala
@@ -21,30 +21,18 @@ public class FeedReader.ttrssMessage : GLib.Object {
private string m_contenttype;
private Json.Parser m_parser;
private Json.Object m_root_object;
- private ttrssUtils m_utils;
-
- public ttrssMessage(string destination)
+ public ttrssMessage(Soup.Session session, string destination)
{
- m_utils = new ttrssUtils();
m_message_string = new GLib.StringBuilder();
- m_session = new Soup.Session();
- m_session.user_agent = Constants.USER_AGENT;
- m_session.ssl_strict = false;
+ m_session = session;
m_contenttype = "application/x-www-form-urlencoded";
m_parser = new Json.Parser();
m_message_soup = new Soup.Message("POST", destination);
- m_session.authenticate.connect((msg, auth, retrying) => {
- if(m_utils.getHtaccessUser() == "")
- {
- Logger.error("TTRSS Session: need Authentication");
- }
- else
- {
- auth.authenticate(m_utils.getHtaccessUser(), m_utils.getHtaccessPasswd());
- }
- });
+
+ if(m_message_soup == null)
+ Logger.error(@"ttrssMessage: can't send message to $destination");
}
@@ -74,6 +62,24 @@ public class FeedReader.ttrssMessage : GLib.Object {
public ConnectionError send(bool ping = false)
{
+ var error = send_impl(ping);
+ if(error != ConnectionError.SUCCESS)
+ {
+ printMessage();
+ printResponse();
+ }
+
+ return error;
+ }
+
+ public ConnectionError send_impl(bool ping)
+ {
+ if(m_message_soup == null)
+ {
+ Logger.error(@"ttrssMessage: can't send message");
+ return ConnectionError.UNKNOWN;
+ }
+
var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
m_message_string.overwrite(0, "{").append("}");
m_message_soup.set_request(m_contenttype, Soup.MemoryUse.COPY, m_message_string.str.data);
@@ -95,8 +101,7 @@ public class FeedReader.ttrssMessage : GLib.Object {
}
- if((string)m_message_soup.response_body.flatten().data == null
- || (string)m_message_soup.response_body.flatten().data == "")
+ if(m_message_soup.status_code != 200)
{
Logger.error("TTRSS Message: No response - status code: %s".printf(Soup.Status.get_phrase(m_message_soup.status_code)));
return ConnectionError.NO_RESPONSE;
@@ -104,14 +109,16 @@ public class FeedReader.ttrssMessage : GLib.Object {
if(ping)
{
- Logger.debug("TTRSS Message: ping successfull");
+ Logger.debug("TTRSS Message: ping successful");
return ConnectionError.SUCCESS;
}
- try{
+ try
+ {
m_parser.load_from_data((string)m_message_soup.response_body.flatten().data);
}
- catch (Error e) {
+ catch(Error e)
+ {
Logger.error("Could not load response from Message to ttrss");
Logger.error(e.message);
return ConnectionError.NO_RESPONSE;
@@ -184,6 +191,11 @@ public class FeedReader.ttrssMessage : GLib.Object {
return null;
}
+ public uint getStatusCode()
+ {
+ return m_message_soup.status_code;
+ }
+
public void printMessage()
{
Logger.debug(m_message_string.str);
diff --git a/plugins/backend/ttrss/ttrssUI.plugin b/plugins/backend/ttrss/ttrssUI.plugin
deleted file mode 100644
index 2206fbbb..00000000
--- a/plugins/backend/ttrss/ttrssUI.plugin
+++ /dev/null
@@ -1,8 +0,0 @@
-[Plugin]
-Module=ttrssUI
-Loader=C
-Name=Tiny Tiny RSS
-Description=Add Tiny Tiny RSS backend to FeedReader
-Authors=Jan Lukas Gernert <jangernert@gmail.com>
-Copyright=Copyright © 2015-16 Jan Lukas Gernert
-Website=http://jangernert.github.io/FeedReader/
diff --git a/plugins/backend/ttrss/ttrssUtils.vala b/plugins/backend/ttrss/ttrssUtils.vala
index bcd2e1cf..13f07460 100644
--- a/plugins/backend/ttrss/ttrssUtils.vala
+++ b/plugins/backend/ttrss/ttrssUtils.vala
@@ -24,16 +24,45 @@ public class FeedReader.ttrssUtils : GLib.Object {
RECENTLY_READ = -6
}
- GLib.Settings m_settings;
+ private GLib.Settings m_settings;
+ private Password m_password;
+ private Password m_htaccess_password;
- public ttrssUtils()
+ public ttrssUtils(GLib.SettingsBackend? settings_backend, Secret.Collection secrets)
{
- m_settings = new GLib.Settings("org.gnome.feedreader.ttrss");
+ if(settings_backend != null)
+ m_settings = new GLib.Settings.with_backend("org.gnome.feedreader.ttrss", settings_backend);
+ else
+ m_settings = new GLib.Settings("org.gnome.feedreader.ttrss");
+
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING);
+ m_password = new Password(secrets, pwSchema, "FeedReader: ttrss login", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = getURL();
+ attributes["Username"] = getUser();
+ return attributes;
+ });
+
+ var htAccessSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
+ "URL", Secret.SchemaAttributeType.STRING,
+ "Username", Secret.SchemaAttributeType.STRING,
+ "htaccess", Secret.SchemaAttributeType.BOOLEAN);
+ m_htaccess_password = new Password(secrets, htAccessSchema, "FeedReader: ttrss htaccess Authentication", () => {
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["URL"] = getURL();
+ attributes["Username"] = getHtaccessUser();
+ attributes["htaccess"] = "true";
+ return attributes;
+ });
}
public string getURL()
{
- string tmp_url = m_settings.get_string("url");
+
+ string tmp_url = Utils.gsettingReadString(m_settings, "url");
+
if(tmp_url != ""){
if(!tmp_url.has_suffix("/"))
tmp_url = tmp_url + "/";
@@ -52,213 +81,58 @@ public class FeedReader.ttrssUtils : GLib.Object {
public void setURL(string url)
{
- m_settings.set_string("url", url);
+ Utils.gsettingWriteString(m_settings, "url", url);
}
public string getUser()
{
- return m_settings.get_string("username");
+ return Utils.gsettingReadString(m_settings, "username");
}
public void setUser(string user)
{
- m_settings.set_string("username", user);
+ Utils.gsettingWriteString(m_settings, "username", user);
}
public string getHtaccessUser()
{
- return m_settings.get_string("htaccess-username");
+ return Utils.gsettingReadString(m_settings, "htaccess-username");
}
public void setHtaccessUser(string ht_user)
{
- m_settings.set_string("htaccess-username", ht_user);
+ Utils.gsettingWriteString(m_settings, "htaccess-username", ht_user);
}
public string getUnmodifiedURL()
{
- return m_settings.get_string("url");
+ return Utils.gsettingReadString(m_settings, "url");
}
public string getPasswd()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
-
- string passwd = "";
-
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error(e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_password.get_password();
}
public void setPassword(string passwd)
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "FeedReader: ttrss login", passwd, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("ttrssUtils: setPassword: " + e.message);
- }
+ m_password.set_password(passwd);
}
public void resetAccount()
{
Utils.resetSettings(m_settings);
- deletePassword();
- }
-
- public bool deletePassword()
- {
- bool removed = false;
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getUser();
-
- Secret.password_clearv.begin (pwSchema, attributes, null, (obj, async_res) => {
- try
- {
- removed = Secret.password_clearv.end(async_res);
- }
- catch(GLib.Error e)
- {
- Logger.error("ttrssUtils.deletePassword: %s".printf(e.message));
- }
- });
- return removed;
+ m_password.delete_password();
+ m_htaccess_password.delete_password();
}
public string getHtaccessPasswd()
{
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING,
- "htaccess", Secret.SchemaAttributeType.BOOLEAN);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["URL"] = getURL();
- attributes["Username"] = getHtaccessUser();
- attributes["htaccess"] = "true";
-
- string passwd = "";
-
- try{
- passwd = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e){
- Logger.error("ttrssUtils: getHtaccessPasswd: " + e.message);
- }
-
- if(passwd == null)
- {
- return "";
- }
-
- return passwd;
+ return m_htaccess_password.get_password();
}
public void setHtAccessPassword(string passwd)
{
- var pwAuthSchema = new Secret.Schema ("org.gnome.feedreader.password", Secret.SchemaFlags.NONE,
- "URL", Secret.SchemaAttributeType.STRING,
- "Username", Secret.SchemaAttributeType.STRING,
- "htaccess", Secret.SchemaAttributeType.BOOLEAN);
- var authAttributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- authAttributes["URL"] = getURL();
- authAttributes["Username"] = getHtaccessUser();
- authAttributes["htaccess"] = "true";
- try
- {
- Secret.password_storev_sync(pwAuthSchema,
- authAttributes,
- Secret.COLLECTION_DEFAULT,
- "FeedReader: ttrss htaccess Authentication",
- passwd,
- null);
- }
- catch(GLib.Error e)
- {
- Logger.error("ttrssUtils: setHtAccessPassword: " + e.message);
- }
- }
-
- public bool downloadIcon(string feed_id, string icon_url)
- {
- var settingsTweaks = new GLib.Settings("org.gnome.feedreader.tweaks");
- string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var path = GLib.File.new_for_path(icon_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e){
- Logger.debug(e.message);
- }
- }
-
- string remote_filename = icon_url + feed_id + ".ico";
- string local_filename = icon_path + feed_id + ".ico";
-
-
-
- if(!FileUtils.test(local_filename, GLib.FileTest.EXISTS))
- {
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message("GET", remote_filename);
-
- if(settingsTweaks.get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
-
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.ssl_strict = false;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
- {
- try{
- FileUtils.set_contents( local_filename,
- (string)message_dlIcon.response_body.flatten().data,
- (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
- {
- Logger.error("Error writing icon: %s".printf(e.message));
- }
- return true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(feed_id));
- return false;
- }
-
- // file already exists
- return true;
+ m_htaccess_password.set_password(passwd);
}
}
diff --git a/plugins/meson.build b/plugins/meson.build
new file mode 100644
index 00000000..0688400e
--- /dev/null
+++ b/plugins/meson.build
@@ -0,0 +1,2 @@
+subdir('backend')
+subdir('share')
diff --git a/plugins/share/Browser/Browser.vala b/plugins/share/Browser/Browser.vala
index 4119a47f..05553990 100644
--- a/plugins/share/Browser/Browser.vala
+++ b/plugins/share/Browser/Browser.vala
@@ -31,7 +31,7 @@ public class FeedReader.Browser : ShareAccountInterface, Peas.ExtensionBase {
return false;
}
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
{
}
@@ -42,12 +42,12 @@ public class FeedReader.Browser : ShareAccountInterface, Peas.ExtensionBase {
}
public string getIconName()
- {
+ {
if(Gtk.IconTheme.get_default().lookup_icon("applications-internet", 0, Gtk.IconLookupFlags.FORCE_SVG) != null)
return "applications-internet";
- return "feed-share-browser";
- }
+ return "feed-share-browser";
+ }
public string getUsername(string id)
{
@@ -65,14 +65,14 @@ public class FeedReader.Browser : ShareAccountInterface, Peas.ExtensionBase {
}
public bool useSystemAccounts()
- {
- return false;
- }
+ {
+ return false;
+ }
public string pluginID()
- {
- return "browser";
- }
+ {
+ return "browser";
+ }
public string pluginName()
{
@@ -80,14 +80,14 @@ public class FeedReader.Browser : ShareAccountInterface, Peas.ExtensionBase {
}
public ServiceSetup? newSetup_withID(string id, string username)
- {
- return null;
- }
-
- public ServiceSetup? newSetup()
- {
- return null;
- }
+ {
+ return null;
+ }
+
+ public ServiceSetup? newSetup()
+ {
+ return null;
+ }
public ServiceSetup? newSystemAccount(string id, string username)
{
diff --git a/plugins/share/Browser/CMakeLists.txt b/plugins/share/Browser/CMakeLists.txt
deleted file mode 100644
index 4f748926..00000000
--- a/plugins/share/Browser/CMakeLists.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-set (NAME browser)
-set (PLUGTARGET ${NAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- Browser.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-
diff --git a/plugins/share/Browser/meson.build b/plugins/share/Browser/meson.build
new file mode 100644
index 00000000..d56351fe
--- /dev/null
+++ b/plugins/share/Browser/meson.build
@@ -0,0 +1,38 @@
+browser_resources = gnome.compile_resources(
+ 'browser_res',
+ 'browser.gresource.xml'
+)
+
+shared_library(
+ 'browser',
+ [
+ 'Browser.vala'
+ ],
+ browser_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'browser.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/CMakeLists.txt b/plugins/share/CMakeLists.txt
deleted file mode 100644
index 5b64cf21..00000000
--- a/plugins/share/CMakeLists.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-option(EMAIL "Enable Email plugin" ON)
-option(INSTAPAPER "Enable Instapaper plugin" ON)
-option(POCKET "Enable Pocket plugin" ON)
-option(TWITTER "Enable Twitter plugin" ON)
-option(WALLABAG "Enable Wallabag plugin" ON)
-option(BROWSER "Enable Browser plugin" ON)
-option(TELEGRAM "Enable Telegram plugin" ON)
-
-
-MESSAGE(STATUS "Plugin EMAIL: " ${EMAIL})
-MESSAGE(STATUS "Plugin INSTAPAPER: " ${INSTAPAPER})
-MESSAGE(STATUS "Plugin POCKET: " ${POCKET})
-MESSAGE(STATUS "Plugin TWITTER: " ${TWITTER})
-MESSAGE(STATUS "Plugin WALLABAG: " ${WALLABAG})
-MESSAGE(STATUS "Plugin BROWSER: " ${BROWSER})
-MESSAGE(STATUS "Plugin TELEGRAM: " ${TELEGRAM})
-
-if(EMAIL)
- add_subdirectory(Email)
-endif(EMAIL)
-
-if(INSTAPAPER)
- add_subdirectory(Instapaper)
-endif(INSTAPAPER)
-
-if(POCKET)
- add_subdirectory(Pocket)
-endif(POCKET)
-
-if(TWITTER)
- add_subdirectory(Twitter)
-endif(TWITTER)
-
-if(WALLABAG)
- add_subdirectory(Wallabag)
-endif(WALLABAG)
-
-if(BROWSER)
- add_subdirectory(Browser)
-endif(BROWSER)
-
-if(TELEGRAM)
- add_subdirectory(Telegram)
-endif(TELEGRAM)
diff --git a/plugins/share/Email/CMakeLists.txt b/plugins/share/Email/CMakeLists.txt
deleted file mode 100644
index 5af5ec08..00000000
--- a/plugins/share/Email/CMakeLists.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-set (NAME mail)
-set (PLUGTARGET ${NAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- Email.vala
- EmailForm.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-
diff --git a/plugins/share/Email/Email.vala b/plugins/share/Email/Email.vala
index 7ef8d7b5..275ebf57 100644
--- a/plugins/share/Email/Email.vala
+++ b/plugins/share/Email/Email.vala
@@ -39,7 +39,7 @@ public class FeedReader.ShareMail : ShareAccountInterface, Peas.ExtensionBase {
return false;
}
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
{
}
@@ -50,12 +50,12 @@ public class FeedReader.ShareMail : ShareAccountInterface, Peas.ExtensionBase {
}
public string getIconName()
- {
+ {
if(Gtk.IconTheme.get_default().lookup_icon("mail-send", 0, Gtk.IconLookupFlags.FORCE_SVG) != null)
return "mail-send";
- return "feed-share-mail";
- }
+ return "feed-share-mail";
+ }
public string getUsername(string id)
{
@@ -73,14 +73,14 @@ public class FeedReader.ShareMail : ShareAccountInterface, Peas.ExtensionBase {
}
public bool useSystemAccounts()
- {
- return false;
- }
+ {
+ return false;
+ }
public string pluginID()
- {
- return "mail";
- }
+ {
+ return "mail";
+ }
public string pluginName()
{
@@ -88,14 +88,14 @@ public class FeedReader.ShareMail : ShareAccountInterface, Peas.ExtensionBase {
}
public ServiceSetup? newSetup_withID(string id, string username)
- {
- return null;
- }
-
- public ServiceSetup? newSetup()
- {
- return null;
- }
+ {
+ return null;
+ }
+
+ public ServiceSetup? newSetup()
+ {
+ return null;
+ }
public ServiceSetup? newSystemAccount(string id, string username)
{
diff --git a/plugins/share/Email/EmailForm.vala b/plugins/share/Email/EmailForm.vala
index b62518bb..48c23508 100644
--- a/plugins/share/Email/EmailForm.vala
+++ b/plugins/share/Email/EmailForm.vala
@@ -21,7 +21,7 @@ public class FeedReader.EmailForm : ShareForm {
public EmailForm(string url)
{
- string body = _("Hey,\n\nCheck out this interesting article I just read: $URL\n\n- sent by FeedReader");
+ string body = _("Hey,\n\nCheck out this interesting article I used FeedReader to read: $URL");
string to = "john.doe@domain.com";
var labelTo = new Gtk.Label(_("To:"));
diff --git a/plugins/share/Email/meson.build b/plugins/share/Email/meson.build
new file mode 100644
index 00000000..1efb31bf
--- /dev/null
+++ b/plugins/share/Email/meson.build
@@ -0,0 +1,39 @@
+mail_resources = gnome.compile_resources(
+ 'mail_res',
+ 'mail.gresource.xml'
+)
+
+shared_library(
+ 'mail',
+ [
+ 'Email.vala',
+ 'EmailForm.vala'
+ ],
+ mail_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'mail.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/Instapaper/CMakeLists.txt b/plugins/share/Instapaper/CMakeLists.txt
deleted file mode 100644
index 1eaabe90..00000000
--- a/plugins/share/Instapaper/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-set (NAME instapaper)
-set (PLUGTARGET ${NAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- InstapaperAPI.vala
- InstapaperSetup.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
- rest-0.7
- json-glib-1.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-add_schema ("org.gnome.feedreader.share.instapaper.gschema.xml")
-
diff --git a/plugins/share/Instapaper/InstapaperAPI.vala b/plugins/share/Instapaper/InstapaperAPI.vala
index c62be9f4..5d83fa2c 100644
--- a/plugins/share/Instapaper/InstapaperAPI.vala
+++ b/plugins/share/Instapaper/InstapaperAPI.vala
@@ -22,189 +22,189 @@ namespace FeedReader.InstapaperSecrets {
public class FeedReader.InstaAPI : ShareAccountInterface, Peas.ExtensionBase {
- public InstaAPI()
- {
+ public InstaAPI()
+ {
- }
+ }
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
{
}
- public string getRequestToken()
- {
- return "";
- }
+ public string getRequestToken()
+ {
+ return "";
+ }
- public bool getAccessToken(string id, string username, string password)
- {
- string userID = "";
+ public bool getAccessToken(string id, string username, string password)
+ {
+ string userID = "";
- var oauthObject = new Rest.OAuthProxy (
- InstapaperSecrets.oauth_consumer_key,
- InstapaperSecrets.oauth_consumer_secret,
- "https://www.instapaper.com/api/1/",
- false);
+ var oauthObject = new Rest.OAuthProxy (
+ InstapaperSecrets.oauth_consumer_key,
+ InstapaperSecrets.oauth_consumer_secret,
+ "https://www.instapaper.com/api/1/",
+ false);
- var call = oauthObject.new_call();
+ var call = oauthObject.new_call();
oauthObject.url_format = "https://www.instapaper.com/api/1/";
call.set_function ("oauth/access_token");
call.set_method("POST");
call.add_param("x_auth_mode", "client_auth");
call.add_param("x_auth_username", username);
- call.add_param("x_auth_password", password);
- try
- {
- call.run();
- }
- catch(Error e)
- {
- Logger.error("instapaper getAccessToken: " + e.message);
- }
+ call.add_param("x_auth_password", password);
+ try
+ {
+ call.run();
+ }
+ catch(Error e)
+ {
+ Logger.error("instapaper getAccessToken: " + e.message);
+ }
- string response = call.get_payload();
- int64 status = call.get_status_code();
+ string response = call.get_payload();
+ int64 status = call.get_status_code();
- if(status != 200)
- {
- return false;
- }
+ if(status != 200)
+ {
+ return false;
+ }
- int secretStart = response.index_of_char('=')+1;
- int secretEnd = response.index_of_char('&', secretStart);
- int tokenStart = response.index_of_char('=', secretEnd)+1;
+ int secretStart = response.index_of_char('=')+1;
+ int secretEnd = response.index_of_char('&', secretStart);
+ int tokenStart = response.index_of_char('=', secretEnd)+1;
- string accessToken_secret = response.substring(secretStart, secretEnd-secretStart);
- string accessToken = response.substring(tokenStart);
+ string accessToken_secret = response.substring(secretStart, secretEnd-secretStart);
+ string accessToken = response.substring(tokenStart);
- oauthObject.set_token(accessToken);
- oauthObject.set_token_secret(accessToken_secret);
+ oauthObject.set_token(accessToken);
+ oauthObject.set_token_secret(accessToken_secret);
- // get userID -------------------------------------------------------------------------------------------------
- var call2 = oauthObject.new_call();
+ // get userID -------------------------------------------------------------------------------------------------
+ var call2 = oauthObject.new_call();
oauthObject.url_format = "https://www.instapaper.com/api/1/";
call2.set_function("account/verify_credentials");
call2.set_method("POST");
- try
- {
- call2.run();
- }
- catch(Error e)
- {
- Logger.debug("getUserID: " + e.message);
- }
-
- var parser = new Json.Parser();
- try
- {
- parser.load_from_data(call2.get_payload());
- }
- catch (Error e)
- {
- Logger.error("Could not load response to Message from instapaper");
- Logger.error(e.message);
- }
-
- var root_node = parser.get_root();
- var userArray = root_node.get_array();
- var root_object = userArray.get_object_element(0);
- if(root_object.has_member("user_id"))
- {
- userID = root_object.get_int_member("user_id").to_string();
- }
- else if(root_object.has_member("error"))
- {
- Logger.error(root_object.get_int_member("error_code").to_string());
- Logger.error(root_object.get_string_member("message"));
- }
- //-------------------------------------------------------------------------------------------------------------
-
-
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/instapaper/%s/".printf(id));
- settings.set_string("oauth-access-token", accessToken);
- settings.set_string("oauth-access-token-secret", accessToken_secret);
- settings.set_string("username", username);
- settings.set_string("user-id", userID);
-
- var array = Settings.share("instapaper").get_strv("account-ids");
- array += id;
+ try
+ {
+ call2.run();
+ }
+ catch(Error e)
+ {
+ Logger.debug("getUserID: " + e.message);
+ }
+
+ var parser = new Json.Parser();
+ try
+ {
+ parser.load_from_data(call2.get_payload());
+ }
+ catch (Error e)
+ {
+ Logger.error("Could not load response to Message from instapaper");
+ Logger.error(e.message);
+ }
+
+ var root_node = parser.get_root();
+ var userArray = root_node.get_array();
+ var root_object = userArray.get_object_element(0);
+ if(root_object.has_member("user_id"))
+ {
+ userID = root_object.get_int_member("user_id").to_string();
+ }
+ else if(root_object.has_member("error"))
+ {
+ Logger.error(root_object.get_int_member("error_code").to_string());
+ Logger.error(root_object.get_string_member("message"));
+ }
+ //-------------------------------------------------------------------------------------------------------------
+
+
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/instapaper/%s/".printf(id));
+ settings.set_string("oauth-access-token", accessToken);
+ settings.set_string("oauth-access-token-secret", accessToken_secret);
+ settings.set_string("username", username);
+ settings.set_string("user-id", userID);
+
+ var array = Settings.share("instapaper").get_strv("account-ids");
+ array += id;
Settings.share("instapaper").set_strv("account-ids", array);
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.instapaper.password", Secret.SchemaFlags.NONE,
- "userID", Secret.SchemaAttributeType.STRING);
-
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["userID"] = userID;
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "Feedreader: Instapaper login", password, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("InstaAPI - getAccessToken: " + e.message);
- }
-
- return true;
- }
-
- public bool addBookmark(string id, string url, bool system)
- {
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/instapaper/%s/".printf(id));
-
- var pwSchema = new Secret.Schema ("org.gnome.feedreader.instapaper.password", Secret.SchemaFlags.NONE, "userID", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["userID"] = settings.get_string("user-id");
-
- string password = "";
- try
- {
- password = Secret.password_lookupv_sync(pwSchema, attributes, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("InstaAPI addBookmark: " + e.message);
- }
-
- var session = new Soup.Session();
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.instapaper.password", Secret.SchemaFlags.NONE,
+ "userID", Secret.SchemaAttributeType.STRING);
+
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["userID"] = userID;
+ try
+ {
+ Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "Feedreader: Instapaper login", password, null);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("InstaAPI - getAccessToken: " + e.message);
+ }
+
+ return true;
+ }
+
+ public bool addBookmark(string id, string url, bool system)
+ {
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/instapaper/%s/".printf(id));
+
+ var pwSchema = new Secret.Schema ("org.gnome.feedreader.instapaper.password", Secret.SchemaFlags.NONE, "userID", Secret.SchemaAttributeType.STRING);
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["userID"] = settings.get_string("user-id");
+
+ string password = "";
+ try
+ {
+ password = Secret.password_lookupv_sync(pwSchema, attributes, null);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("InstaAPI addBookmark: " + e.message);
+ }
+
+ var session = new Soup.Session();
session.user_agent = Constants.USER_AGENT;
- string message = "user_id=" + settings.get_string("user-id")
- + "&username=" + settings.get_string("username")
- + "&password=" + password
- + "&url=" + GLib.Uri.escape_string(url);
+ string message = "user_id=" + settings.get_string("user-id")
+ + "&username=" + settings.get_string("username")
+ + "&password=" + password
+ + "&url=" + GLib.Uri.escape_string(url);
- Logger.debug("InstaAPI: " + message);
+ Logger.debug("InstaAPI: " + message);
- var message_soup = new Soup.Message("POST", "https://www.instapaper.com/api/add");
- message_soup.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message.data);
+ var message_soup = new Soup.Message("POST", "https://www.instapaper.com/api/add");
+ message_soup.set_request("application/x-www-form-urlencoded", Soup.MemoryUse.COPY, message.data);
- if(Settings.tweaks().get_boolean("do-not-track"))
+ if(Settings.tweaks().get_boolean("do-not-track"))
message_soup.request_headers.append("DNT", "1");
session.send_message(message_soup);
string response = (string)message_soup.response_body.flatten().data;
- if(response == null || response == "")
+ if(response == null || response == "")
return false;
Logger.debug("InstaAPI: " + response);
- return true;
- }
+ return true;
+ }
- public bool logout(string id)
- {
+ public bool logout(string id)
+ {
Logger.debug(@"InstaAPI.logout($id)");
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", @"/org/gnome/feedreader/share/instapaper/$id/");
- var pwSchema = new Secret.Schema("org.gnome.feedreader.instapaper.password",
- Secret.SchemaFlags.NONE, "userID", Secret.SchemaAttributeType.STRING);
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", @"/org/gnome/feedreader/share/instapaper/$id/");
+ var pwSchema = new Secret.Schema("org.gnome.feedreader.instapaper.password",
+ Secret.SchemaFlags.NONE, "userID", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["userID"] = settings.get_string("user-id");
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["userID"] = settings.get_string("user-id");
bool removed = false;
- Secret.password_clearv.begin(pwSchema, attributes, null, (obj, async_res) => {
+ Secret.password_clearv.begin(pwSchema, attributes, null, (obj, async_res) => {
try
{
removed = Secret.password_clearv.end(async_res);
@@ -215,18 +215,18 @@ public class FeedReader.InstaAPI : ShareAccountInterface, Peas.ExtensionBase {
{
Logger.error("InstaAPI.logout: %s".printf(e.message));
}
- });
+ });
- var keys = settings.list_keys();
+ var keys = settings.list_keys();
foreach(string key in keys)
{
settings.reset(key);
}
- var array = Settings.share("instapaper").get_strv("account-ids");
+ var array = Settings.share("instapaper").get_strv("account-ids");
- string[] array2 = {};
- foreach(string i in array)
+ string[] array2 = {};
+ foreach(string i in array)
{
if(i != id)
array2 += i;
@@ -234,21 +234,21 @@ public class FeedReader.InstaAPI : ShareAccountInterface, Peas.ExtensionBase {
Settings.share("instapaper").set_strv("account-ids", array2);
deleteAccount(id);
- return true;
- }
+ return true;
+ }
- public string getIconName()
- {
- return "feed-share-instapaper";
- }
+ public string getIconName()
+ {
+ return "feed-share-instapaper";
+ }
- public string getUsername(string id)
- {
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/instapaper/%s/".printf(id));
- return settings.get_string("username");
- }
+ public string getUsername(string id)
+ {
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/instapaper/%s/".printf(id));
+ return settings.get_string("username");
+ }
- public bool needSetup()
+ public bool needSetup()
{
return true;
}
@@ -259,34 +259,34 @@ public class FeedReader.InstaAPI : ShareAccountInterface, Peas.ExtensionBase {
}
public bool useSystemAccounts()
- {
- return false;
- }
-
- public string pluginID()
- {
- return "instapaper";
- }
-
- public string pluginName()
- {
- return "Instapaper";
- }
-
- public string getURL(string token)
- {
- return "";
- }
-
- public ServiceSetup? newSetup_withID(string id, string username)
- {
- return new InstapaperSetup(id, this, username);
- }
-
- public ServiceSetup? newSetup()
- {
- return new InstapaperSetup(null, this);
- }
+ {
+ return false;
+ }
+
+ public string pluginID()
+ {
+ return "instapaper";
+ }
+
+ public string pluginName()
+ {
+ return "Instapaper";
+ }
+
+ public string getURL(string token)
+ {
+ return "";
+ }
+
+ public ServiceSetup? newSetup_withID(string id, string username)
+ {
+ return new InstapaperSetup(id, this, username);
+ }
+
+ public ServiceSetup? newSetup()
+ {
+ return new InstapaperSetup(null, this);
+ }
public ServiceSetup? newSystemAccount(string id, string username)
{
diff --git a/plugins/share/Instapaper/InstapaperSetup.vala b/plugins/share/Instapaper/InstapaperSetup.vala
index 874e0f39..77801e1c 100644
--- a/plugins/share/Instapaper/InstapaperSetup.vala
+++ b/plugins/share/Instapaper/InstapaperSetup.vala
@@ -39,8 +39,8 @@ public class FeedReader.InstapaperSetup : ServiceSetup {
grid.margin_bottom = 10;
grid.margin_top = 5;
- m_userEntry = new Gtk.Entry();
- m_passEntry = new Gtk.Entry();
+ m_userEntry = new Gtk.Entry();
+ m_passEntry = new Gtk.Entry();
m_passEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
m_passEntry.set_visibility(false);
@@ -52,10 +52,10 @@ public class FeedReader.InstapaperSetup : ServiceSetup {
login();
});
- grid.attach(new Gtk.Label(_("Username:")), 0, 0, 1, 1);
- grid.attach(new Gtk.Label(_("Password:")), 0, 1, 1, 1);
- grid.attach(m_userEntry, 1, 0, 1, 1);
- grid.attach(m_passEntry, 1, 1, 1, 1);
+ grid.attach(new Gtk.Label(_("Username:")), 0, 0, 1, 1);
+ grid.attach(new Gtk.Label(_("Password:")), 0, 1, 1, 1);
+ grid.attach(m_userEntry, 1, 0, 1, 1);
+ grid.attach(m_passEntry, 1, 1, 1, 1);
m_login_revealer = new Gtk.Revealer();
m_login_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
diff --git a/plugins/share/Instapaper/meson.build b/plugins/share/Instapaper/meson.build
new file mode 100644
index 00000000..2be69efe
--- /dev/null
+++ b/plugins/share/Instapaper/meson.build
@@ -0,0 +1,48 @@
+instapaper_resources = gnome.compile_resources(
+ 'instapaper_res',
+ 'instapaper.gresource.xml'
+)
+
+shared_library(
+ 'instapaper',
+ [
+ 'InstapaperAPI.vala',
+ 'InstapaperSetup.vala'
+ ],
+ instapaper_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml,
+ rest,
+ json_glib
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.share.instapaper.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'instapaper.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/Instapaper/org.gnome.feedreader.share.instapaper.gschema.xml b/plugins/share/Instapaper/org.gnome.feedreader.share.instapaper.gschema.xml
index 4a559cf5..12e59b9a 100644
--- a/plugins/share/Instapaper/org.gnome.feedreader.share.instapaper.gschema.xml
+++ b/plugins/share/Instapaper/org.gnome.feedreader.share.instapaper.gschema.xml
@@ -1,13 +1,13 @@
<schemalist>
- <schema id="org.gnome.feedreader.share.instapaper" path="/org/gnome/feedreader/share/instapaper/" gettext-domain="feedreader">
-
+ <schema id="org.gnome.feedreader.share.instapaper" path="/org/gnome/feedreader/share/instapaper/" gettext-domain="feedreader">
+
<key name="account-ids" type="as">
- <default>[]</default>
- <summary>instapaper accounts</summary>
- <description>
- all the instapaper account ids
- </description>
- </key>
+ <default>[]</default>
+ <summary>instapaper accounts</summary>
+ <description>
+ all the instapaper account ids
+ </description>
+ </key>
- </schema>
+ </schema>
</schemalist>
diff --git a/plugins/share/Pocket/CMakeLists.txt b/plugins/share/Pocket/CMakeLists.txt
deleted file mode 100644
index 684e099a..00000000
--- a/plugins/share/Pocket/CMakeLists.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-set (NAME pocket)
-set (PLUGTARGET ${NAME}_target)
-
-
-
-link_libraries(${POCKET_DEPS_LIBRARIES} -lm)
-link_directories(${POCKET_DEPS_LIBRARY_DIRS})
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- PocketAPI.vala
- PocketSetup.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
- rest-0.7
- json-glib-1.0
- goa-1.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-add_schema ("org.gnome.feedreader.share.pocket.gschema.xml")
-
diff --git a/plugins/share/Pocket/PocketAPI.vala b/plugins/share/Pocket/PocketAPI.vala
index da9f0e86..d312845c 100644
--- a/plugins/share/Pocket/PocketAPI.vala
+++ b/plugins/share/Pocket/PocketAPI.vala
@@ -21,12 +21,12 @@ namespace FeedReader.PocketSecrets {
public class FeedReader.PocketAPI : ShareAccountInterface, Peas.ExtensionBase {
- public PocketAPI()
- {
+ public PocketAPI()
+ {
- }
+ }
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
{
try
{
@@ -63,65 +63,65 @@ public class FeedReader.PocketAPI : ShareAccountInterface, Peas.ExtensionBase {
}
}
- public string getRequestToken()
- {
- Logger.debug("PocketAPI: get request token");
- var session = new Soup.Session();
+ public string getRequestToken()
+ {
+ Logger.debug("PocketAPI: get request token");
+ var session = new Soup.Session();
session.user_agent = Constants.USER_AGENT;
- string message = "consumer_key=" + PocketSecrets.oauth_consumer_key + "&redirect_uri=" + PocketSecrets.oauth_callback;
+ string message = "consumer_key=" + PocketSecrets.oauth_consumer_key + "&redirect_uri=" + PocketSecrets.oauth_callback;
- var message_soup = new Soup.Message("POST", "https://getpocket.com/v3/oauth/request");
- message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
+ var message_soup = new Soup.Message("POST", "https://getpocket.com/v3/oauth/request");
+ message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
- if(Settings.tweaks().get_boolean("do-not-track"))
+ if(Settings.tweaks().get_boolean("do-not-track"))
message_soup.request_headers.append("DNT", "1");
session.send_message(message_soup);
- string response = (string)message_soup.response_body.flatten().data;
- return response.substring(response.index_of_char('=')+1);
- }
+ string response = (string)message_soup.response_body.flatten().data;
+ return response.substring(response.index_of_char('=')+1);
+ }
- public bool getAccessToken(string id, string requestToken)
- {
- var session = new Soup.Session();
+ public bool getAccessToken(string id, string requestToken)
+ {
+ var session = new Soup.Session();
session.user_agent = Constants.USER_AGENT;
- string message = "consumer_key=" + PocketSecrets.oauth_consumer_key + "&code=" + requestToken;
+ string message = "consumer_key=" + PocketSecrets.oauth_consumer_key + "&code=" + requestToken;
- var message_soup = new Soup.Message("POST", "https://getpocket.com/v3/oauth/authorize");
- message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
+ var message_soup = new Soup.Message("POST", "https://getpocket.com/v3/oauth/authorize");
+ message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
- if(Settings.tweaks().get_boolean("do-not-track"))
+ if(Settings.tweaks().get_boolean("do-not-track"))
message_soup.request_headers.append("DNT", "1");
session.send_message(message_soup);
- if((string)message_soup.response_body.flatten().data == null
+ if((string)message_soup.response_body.flatten().data == null
|| (string)message_soup.response_body.flatten().data == "")
return false;
- string response = (string)message_soup.response_body.flatten().data;
- Logger.debug(response);
- int tokenStart = response.index_of_char('=')+1;
- int tokenEnd = response.index_of_char('&', tokenStart);
- int userStart = response.index_of_char('=', tokenEnd)+1;
+ string response = (string)message_soup.response_body.flatten().data;
+ Logger.debug(response);
+ int tokenStart = response.index_of_char('=')+1;
+ int tokenEnd = response.index_of_char('&', tokenStart);
+ int userStart = response.index_of_char('=', tokenEnd)+1;
- string accessToken = response.substring(tokenStart, tokenEnd-tokenStart);
- string user = GLib.Uri.unescape_string(response.substring(userStart));
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/pocket/%s/".printf(id));
- settings.set_string("oauth-access-token", accessToken);
- settings.set_string("username", user);
+ string accessToken = response.substring(tokenStart, tokenEnd-tokenStart);
+ string user = GLib.Uri.unescape_string(response.substring(userStart));
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/pocket/%s/".printf(id));
+ settings.set_string("oauth-access-token", accessToken);
+ settings.set_string("username", user);
- var array = Settings.share("pocket").get_strv("account-ids");
- array += id;
+ var array = Settings.share("pocket").get_strv("account-ids");
+ array += id;
Settings.share("pocket").set_strv("account-ids", array);
- return true;
- }
+ return true;
+ }
- public bool addBookmark(string id, string url, bool system)
- {
+ public bool addBookmark(string id, string url, bool system)
+ {
string oauthToken = "";
if(system)
@@ -161,43 +161,43 @@ public class FeedReader.PocketAPI : ShareAccountInterface, Peas.ExtensionBase {
}
- var session = new Soup.Session();
+ var session = new Soup.Session();
session.user_agent = Constants.USER_AGENT;
- string message = "url=" + GLib.Uri.escape_string(url)
- + "&consumer_key=" + PocketSecrets.oauth_consumer_key
- + "&access_token=" + oauthToken;
+ string message = "url=" + GLib.Uri.escape_string(url)
+ + "&consumer_key=" + PocketSecrets.oauth_consumer_key
+ + "&access_token=" + oauthToken;
- Logger.debug("PocketAPI: " + message);
+ Logger.debug("PocketAPI: " + message);
- var message_soup = new Soup.Message("POST", "https://getpocket.com/v3/add");
- message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
+ var message_soup = new Soup.Message("POST", "https://getpocket.com/v3/add");
+ message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
- if(Settings.tweaks().get_boolean("do-not-track"))
+ if(Settings.tweaks().get_boolean("do-not-track"))
message_soup.request_headers.append("DNT", "1");
session.send_message(message_soup);
- if((string)message_soup.response_body.flatten().data == null
+ if((string)message_soup.response_body.flatten().data == null
|| (string)message_soup.response_body.flatten().data == "")
return false;
- return true;
- }
+ return true;
+ }
- public bool logout(string id)
- {
+ public bool logout(string id)
+ {
Logger.debug(@"PocketAPI: logout($id)");
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/pocket/%s/".printf(id));
- var keys = settings.list_keys();
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/pocket/%s/".printf(id));
+ var keys = settings.list_keys();
foreach(string key in keys)
{
settings.reset(key);
}
- var array = Settings.share("pocket").get_strv("account-ids");
- string[] array2 = {};
+ var array = Settings.share("pocket").get_strv("account-ids");
+ string[] array2 = {};
- foreach(string i in array)
+ foreach(string i in array)
{
if(i != id)
array2 += i;
@@ -205,28 +205,28 @@ public class FeedReader.PocketAPI : ShareAccountInterface, Peas.ExtensionBase {
Settings.share("pocket").set_strv("account-ids", array2);
deleteAccount(id);
- return true;
- }
+ return true;
+ }
- public string getURL(string token)
- {
+ public string getURL(string token)
+ {
return "https://getpocket.com/auth/authorize?request_token="
+ token + "&redirect_uri="
+ GLib.Uri.escape_string(PocketSecrets.oauth_callback);
- }
+ }
- public string getIconName()
- {
- return "feed-share-pocket";
- }
+ public string getIconName()
+ {
+ return "feed-share-pocket";
+ }
- public string getUsername(string id)
- {
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/pocket/%s/".printf(id));
- return settings.get_string("username");
- }
+ public string getUsername(string id)
+ {
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/pocket/%s/".printf(id));
+ return settings.get_string("username");
+ }
- public bool needSetup()
+ public bool needSetup()
{
return true;
}
@@ -237,41 +237,41 @@ public class FeedReader.PocketAPI : ShareAccountInterface, Peas.ExtensionBase {
}
public bool useSystemAccounts()
- {
+ {
try
{
Goa.Client? client = new Goa.Client.sync();
if(client != null)
return true;
- return false;
+ return false;
}
catch(GLib.Error e)
{
Logger.debug("PocketAPI.useSystemAccounts(): %s".printf(e.message));
return false;
}
- }
-
- public string pluginID()
- {
- return "pocket";
- }
-
- public string pluginName()
- {
- return "Pocket";
- }
-
- public ServiceSetup? newSetup_withID(string id, string username)
- {
- return new PocketSetup(id, this, username);
- }
-
- public ServiceSetup? newSetup()
- {
- return new PocketSetup(null, this);
- }
+ }
+
+ public string pluginID()
+ {
+ return "pocket";
+ }
+
+ public string pluginName()
+ {
+ return "Pocket";
+ }
+
+ public ServiceSetup? newSetup_withID(string id, string username)
+ {
+ return new PocketSetup(id, this, username);
+ }
+
+ public ServiceSetup? newSetup()
+ {
+ return new PocketSetup(null, this);
+ }
public ServiceSetup? newSystemAccount(string id, string username)
{
diff --git a/plugins/share/Pocket/meson.build b/plugins/share/Pocket/meson.build
new file mode 100644
index 00000000..e9b347a1
--- /dev/null
+++ b/plugins/share/Pocket/meson.build
@@ -0,0 +1,49 @@
+pocket_resources = gnome.compile_resources(
+ 'pocket_res',
+ 'pocket.gresource.xml'
+)
+
+shared_library(
+ 'pocket',
+ [
+ 'PocketAPI.vala',
+ 'PocketSetup.vala'
+ ],
+ pocket_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml,
+ rest,
+ json_glib,
+ goa
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.share.pocket.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'pocket.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/Pocket/org.gnome.feedreader.share.pocket.gschema.xml b/plugins/share/Pocket/org.gnome.feedreader.share.pocket.gschema.xml
index 23065246..cc804072 100644
--- a/plugins/share/Pocket/org.gnome.feedreader.share.pocket.gschema.xml
+++ b/plugins/share/Pocket/org.gnome.feedreader.share.pocket.gschema.xml
@@ -1,13 +1,13 @@
<schemalist>
- <schema id="org.gnome.feedreader.share.pocket" path="/org/gnome/feedreader/share/pocket/" gettext-domain="feedreader">
-
+ <schema id="org.gnome.feedreader.share.pocket" path="/org/gnome/feedreader/share/pocket/" gettext-domain="feedreader">
+
<key name="account-ids" type="as">
- <default>[]</default>
- <summary>pocket accounts</summary>
- <description>
- all the pocket account ids
- </description>
- </key>
+ <default>[]</default>
+ <summary>pocket accounts</summary>
+ <description>
+ all the pocket account ids
+ </description>
+ </key>
- </schema>
+ </schema>
</schemalist>
diff --git a/plugins/share/Telegram/CMakeLists.txt b/plugins/share/Telegram/CMakeLists.txt
deleted file mode 100644
index 9046020f..00000000
--- a/plugins/share/Telegram/CMakeLists.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-set (NAME telegram)
-set (PLUGTARGET ${NAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- Telegram.vala
- TelegramSetup.vala
- TelegramForm.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-add_schema ("org.gnome.feedreader.share.telegram.gschema.xml")
-
diff --git a/plugins/share/Telegram/Telegram.vala b/plugins/share/Telegram/Telegram.vala
index a54a7aef..b28a1251 100644
--- a/plugins/share/Telegram/Telegram.vala
+++ b/plugins/share/Telegram/Telegram.vala
@@ -34,7 +34,7 @@ public class FeedReader.Telegram : ShareAccountInterface, Peas.ExtensionBase {
return false;
}
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
{
}
@@ -47,9 +47,9 @@ public class FeedReader.Telegram : ShareAccountInterface, Peas.ExtensionBase {
}
public string getIconName()
- {
- return "feed-share-telegram";
- }
+ {
+ return "feed-share-telegram";
+ }
public string getUsername(string id)
{
@@ -67,14 +67,14 @@ public class FeedReader.Telegram : ShareAccountInterface, Peas.ExtensionBase {
}
public bool useSystemAccounts()
- {
- return false;
- }
+ {
+ return false;
+ }
public string pluginID()
- {
- return "telegram";
- }
+ {
+ return "telegram";
+ }
public string pluginName()
{
@@ -82,13 +82,13 @@ public class FeedReader.Telegram : ShareAccountInterface, Peas.ExtensionBase {
}
public ServiceSetup? newSetup_withID(string id, string username)
- {
- return new TelegramSetup(id, this, username);
- }
+ {
+ return new TelegramSetup(id, this, username);
+ }
- public ServiceSetup? newSetup()
+ public ServiceSetup? newSetup()
{
- return new TelegramSetup(null, this);
+ return new TelegramSetup(null, this);
}
public ServiceSetup? newSystemAccount(string id, string username)
diff --git a/plugins/share/Telegram/TelegramForm.vala b/plugins/share/Telegram/TelegramForm.vala
index 98e6d4b8..2e57fbff 100644
--- a/plugins/share/Telegram/TelegramForm.vala
+++ b/plugins/share/Telegram/TelegramForm.vala
@@ -20,7 +20,7 @@ public class FeedReader.TelegramForm : ShareForm {
public TelegramForm()
{
- string tg_msg_text = _("Hey, Check out this interesting article I just read - sent by FeedReader");
+ string tg_msg_text = _("Hey, check out this interesting article I used FeedReader to read");
var box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 5);
m_textView = new Gtk.TextView();
diff --git a/plugins/share/Telegram/meson.build b/plugins/share/Telegram/meson.build
new file mode 100644
index 00000000..ac9df553
--- /dev/null
+++ b/plugins/share/Telegram/meson.build
@@ -0,0 +1,47 @@
+telegram_resources = gnome.compile_resources(
+ 'telegram_res',
+ 'telegram.gresource.xml'
+)
+
+shared_library(
+ 'telegram',
+ [
+ 'Telegram.vala',
+ 'TelegramForm.vala',
+ 'TelegramSetup.vala'
+ ],
+ telegram_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.share.telegram.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'telegram.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/Telegram/org.gnome.feedreader.share.telegram.gschema.xml b/plugins/share/Telegram/org.gnome.feedreader.share.telegram.gschema.xml
index d5541b6d..3244c8bb 100644
--- a/plugins/share/Telegram/org.gnome.feedreader.share.telegram.gschema.xml
+++ b/plugins/share/Telegram/org.gnome.feedreader.share.telegram.gschema.xml
@@ -1,13 +1,13 @@
<schemalist>
- <schema id="org.gnome.feedreader.share.telegram" path="/org/gnome/feedreader/share/telegram/" gettext-domain="feedreader">
-
+ <schema id="org.gnome.feedreader.share.telegram" path="/org/gnome/feedreader/share/telegram/" gettext-domain="feedreader">
+
<key name="enabled" type="b">
- <default>false</default>
- <summary>Telegram account activated</summary>
- <description>
- If the Telegram account has been manually activated.
- </description>
- </key>
+ <default>false</default>
+ <summary>Telegram account activated</summary>
+ <description>
+ If the Telegram account has been manually activated.
+ </description>
+ </key>
- </schema>
+ </schema>
</schemalist>
diff --git a/plugins/share/Twitter/CMakeLists.txt b/plugins/share/Twitter/CMakeLists.txt
deleted file mode 100644
index 6f5ef373..00000000
--- a/plugins/share/Twitter/CMakeLists.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-set (NAME twitter)
-set (PLUGTARGET ${NAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- TwitterAPI.vala
- TwitterSetup.vala
- TwitterForm.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
- rest-0.7
- json-glib-1.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-add_schema ("org.gnome.feedreader.share.twitter.gschema.xml")
-
diff --git a/plugins/share/Twitter/TwitterAPI.vala b/plugins/share/Twitter/TwitterAPI.vala
index c2c9357d..f78cb693 100644
--- a/plugins/share/Twitter/TwitterAPI.vala
+++ b/plugins/share/Twitter/TwitterAPI.vala
@@ -26,25 +26,25 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
private string m_tweet;
private int m_urlLength = 0;
- public TwitterAPI()
- {
+ public TwitterAPI()
+ {
- }
+ }
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
{
}
- public string getRequestToken()
- {
+ public string getRequestToken()
+ {
Logger.debug("TwitterAPI: get request token");
m_oauthObject = new Rest.OAuthProxy (
- TwitterSecrets.key,
- TwitterSecrets.secret,
- "https://api.twitter.com/",
- false);
+ TwitterSecrets.key,
+ TwitterSecrets.secret,
+ "https://api.twitter.com/",
+ false);
try
{
@@ -56,10 +56,10 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
}
return m_oauthObject.get_token();
- }
+ }
- public bool getAccessToken(string id, string verifier)
- {
+ public bool getAccessToken(string id, string verifier)
+ {
try
{
m_oauthObject.access_token("oauth/access_token", verifier);
@@ -69,7 +69,7 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
Logger.error("TwitterAPI.getAccessToken: %s".printf(e.message));
}
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
string token = m_oauthObject.get_token();
string secret = m_oauthObject.get_token_secret();
settings.set_string("oauth-access-token", token);
@@ -84,22 +84,22 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
try
{
- call.run();
- }
- catch(Error e)
- {
- Logger.error(e.message);
+ call.run();
+ }
+ catch(Error e)
+ {
+ Logger.error(e.message);
}
var parser = new Json.Parser();
- try
+ try
{
- parser.load_from_data(call.get_payload());
- }
- catch(Error e)
+ parser.load_from_data(call.get_payload());
+ }
+ catch(Error e)
{
- Logger.error("Could not load response to Message from twitter");
- Logger.error(e.message);
+ Logger.error("Could not load response to Message from twitter");
+ Logger.error(e.message);
}
var root_object = parser.get_root().get_object();
@@ -116,27 +116,27 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
- var array = Settings.share("twitter").get_strv("account-ids");
- array += id;
+ var array = Settings.share("twitter").get_strv("account-ids");
+ array += id;
Settings.share("twitter").set_strv("account-ids", array);
- return true;
- }
+ return true;
+ }
- public bool addBookmark(string id, string url, bool system)
- {
+ public bool addBookmark(string id, string url, bool system)
+ {
var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
string token = settings.get_string("oauth-access-token");
string secret = settings.get_string("oauth-access-token-secret");
var oauthObject = new Rest.OAuthProxy.with_token (
- TwitterSecrets.key,
- TwitterSecrets.secret,
+ TwitterSecrets.key,
+ TwitterSecrets.secret,
token,
secret,
- "https://api.twitter.com/",
- false);
+ "https://api.twitter.com/",
+ false);
var call = oauthObject.new_call();
call.set_function("1.1/statuses/update.json");
@@ -145,30 +145,30 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
try
{
- call.run();
- }
- catch(Error e)
- {
- Logger.error(e.message);
+ call.run();
+ }
+ catch(Error e)
+ {
+ Logger.error(e.message);
return false;
}
- return true;
- }
+ return true;
+ }
- public bool logout(string id)
- {
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
- var keys = settings.list_keys();
+ public bool logout(string id)
+ {
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
+ var keys = settings.list_keys();
foreach(string key in keys)
{
settings.reset(key);
}
- var array = Settings.share("twitter").get_strv("account-ids");
- string[] array2 = {};
+ var array = Settings.share("twitter").get_strv("account-ids");
+ string[] array2 = {};
- foreach(string i in array)
+ foreach(string i in array)
{
if(i != id)
array2 += i;
@@ -176,28 +176,28 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
Settings.share("twitter").set_strv("account-ids", array2);
deleteAccount(id);
- return true;
- }
+ return true;
+ }
- public string getURL(string token)
- {
+ public string getURL(string token)
+ {
return TwitterSecrets.base_uri
+ "oauth/authenticate"
+ "?oauth_token=" + token;
- }
+ }
- public string getIconName()
- {
- return "feed-share-twitter";
- }
+ public string getIconName()
+ {
+ return "feed-share-twitter";
+ }
- public string getUsername(string id)
- {
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
- return settings.get_string("username");
- }
+ public string getUsername(string id)
+ {
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
+ return settings.get_string("username");
+ }
- public bool needSetup()
+ public bool needSetup()
{
return true;
}
@@ -208,29 +208,29 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
}
public bool useSystemAccounts()
- {
- return false;
- }
-
- public string pluginID()
- {
- return "twitter";
- }
-
- public string pluginName()
- {
- return "Twitter";
- }
-
- public ServiceSetup? newSetup_withID(string id, string username)
- {
- return new TwitterSetup(id, this, username);
- }
-
- public ServiceSetup? newSetup()
- {
- return new TwitterSetup(null, this);
- }
+ {
+ return false;
+ }
+
+ public string pluginID()
+ {
+ return "twitter";
+ }
+
+ public string pluginName()
+ {
+ return "Twitter";
+ }
+
+ public ServiceSetup? newSetup_withID(string id, string username)
+ {
+ return new TwitterSetup(id, this, username);
+ }
+
+ public ServiceSetup? newSetup()
+ {
+ return new TwitterSetup(null, this);
+ }
public ServiceSetup? newSystemAccount(string id, string username)
{
@@ -255,7 +255,7 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
if(m_urlLength > 0)
return m_urlLength;
- var array = Settings.share("twitter").get_strv("account-ids");
+ var array = Settings.share("twitter").get_strv("account-ids");
string id = array[0];
var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/twitter/%s/".printf(id));
@@ -263,12 +263,12 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
string secret = settings.get_string("oauth-access-token-secret");
var oauthObject = new Rest.OAuthProxy.with_token (
- TwitterSecrets.key,
- TwitterSecrets.secret,
+ TwitterSecrets.key,
+ TwitterSecrets.secret,
token,
secret,
- "https://api.twitter.com/",
- false);
+ "https://api.twitter.com/",
+ false);
var call = oauthObject.new_call();
call.set_function("1.1/help/configuration.json");
@@ -276,16 +276,16 @@ public class FeedReader.TwitterAPI : ShareAccountInterface, Peas.ExtensionBase {
try
{
- call.run();
- }
- catch(Error e){}
+ call.run();
+ }
+ catch(Error e){}
var parser = new Json.Parser();
- try
+ try
{
- parser.load_from_data(call.get_payload());
- }
- catch(Error e){}
+ parser.load_from_data(call.get_payload());
+ }
+ catch(Error e){}
var root_object = parser.get_root().get_object();
m_urlLength = (int)root_object.get_int_member("short_url_length");
diff --git a/plugins/share/Twitter/meson.build b/plugins/share/Twitter/meson.build
new file mode 100644
index 00000000..92a4a7d5
--- /dev/null
+++ b/plugins/share/Twitter/meson.build
@@ -0,0 +1,49 @@
+twitter_resources = gnome.compile_resources(
+ 'twitter_res',
+ 'twitter.gresource.xml'
+)
+
+shared_library(
+ 'twitter',
+ [
+ 'TwitterAPI.vala',
+ 'TwitterForm.vala',
+ 'TwitterSetup.vala'
+ ],
+ twitter_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml,
+ rest,
+ json_glib
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.share.twitter.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'twitter.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/Twitter/org.gnome.feedreader.share.twitter.gschema.xml b/plugins/share/Twitter/org.gnome.feedreader.share.twitter.gschema.xml
index 0ffab7e6..b32829e2 100644
--- a/plugins/share/Twitter/org.gnome.feedreader.share.twitter.gschema.xml
+++ b/plugins/share/Twitter/org.gnome.feedreader.share.twitter.gschema.xml
@@ -1,13 +1,13 @@
<schemalist>
- <schema id="org.gnome.feedreader.share.twitter" path="/org/gnome/feedreader/share/twitter/" gettext-domain="feedreader">
-
+ <schema id="org.gnome.feedreader.share.twitter" path="/org/gnome/feedreader/share/twitter/" gettext-domain="feedreader">
+
<key name="account-ids" type="as">
- <default>[]</default>
- <summary>twitter accounts</summary>
- <description>
- all the twitter account ids
- </description>
- </key>
+ <default>[]</default>
+ <summary>twitter accounts</summary>
+ <description>
+ all the twitter account ids
+ </description>
+ </key>
- </schema>
+ </schema>
</schemalist>
diff --git a/plugins/share/Wallabag/CMakeLists.txt b/plugins/share/Wallabag/CMakeLists.txt
deleted file mode 100644
index 1150e04a..00000000
--- a/plugins/share/Wallabag/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-set (NAME wallabag)
-set (PLUGTARGET ${NAME}_target)
-
-# ----------------------------------------------------------
-# Daemon Plugin
-# ----------------------------------------------------------
-
-vala_precompile(VALA_C ${PLUGTARGET}
- WallabagAPI.vala
- WallabagSetup.vala
-
-PACKAGES
- libpeas-1.0
- gtk+-3.0
- gee-0.8
- libsecret-1
- sqlite3
- libsoup-2.4
- WebKit2-4.0
- rest-0.7
- json-glib-1.0
-
-OPTIONS
- --target-glib=2.32
- --library ${NAME}
-
-CUSTOM_VAPIS
- ${CMAKE_BINARY_DIR}/FeedReaderUI.vapi
- ${CMAKE_BINARY_DIR}/FeedReaderCommon.vapi
- ${CMAKE_SOURCE_DIR}/vapi/gd-1.0.vapi
-)
-
-GLIB_COMPILE_RESOURCES(GRESOURCES SOURCE ${NAME}.gresource.xml)
-
-add_library(${NAME} SHARED ${VALA_C} ${GRESOURCES})
-add_dependencies(${NAME} ${UI_NAME} ${DAEMON_NAME})
-
-install(TARGETS ${NAME} DESTINATION ${PKGLIBDIR}/pluginsShare)
-install(FILES ${NAME}.plugin DESTINATION ${PKGLIBDIR}/pluginsShare)
-add_schema ("org.gnome.feedreader.share.wallabag.gschema.xml")
-
diff --git a/plugins/share/Wallabag/WallabagAPI.vala b/plugins/share/Wallabag/WallabagAPI.vala
index 549c6afc..3eef265c 100644
--- a/plugins/share/Wallabag/WallabagAPI.vala
+++ b/plugins/share/Wallabag/WallabagAPI.vala
@@ -15,22 +15,22 @@
public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase {
- public WallabagAPI()
- {
+ public WallabagAPI()
+ {
- }
+ }
- public void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts)
- {
+ public void setupSystemAccounts(Gee.List<ShareAccount> accounts)
+ {
- }
+ }
- public bool getAccessToken(string id, string username, string password, string clientID, string clientSecret, string baseURL)
- {
+ public bool getAccessToken(string id, string username, string password, string clientID, string clientSecret, string baseURL)
+ {
Logger.debug("WallabagAPI getAccessToken");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- string message = "grant_type=password"
+ var session = new Soup.Session();
+ session.user_agent = Constants.USER_AGENT;
+ string message = "grant_type=password"
+ "&client_id=" + clientID
+ "&client_secret=" + clientSecret
+ "&username=" + GLib.Uri.escape_string(username)
@@ -38,11 +38,11 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
string url = baseURL + "oauth/v2/token";
- var message_soup = new Soup.Message("POST", url);
- message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
+ var message_soup = new Soup.Message("POST", url);
+ message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
session.send_message(message_soup);
- if((string)message_soup.response_body.flatten().data == null
+ if((string)message_soup.response_body.flatten().data == null
|| (string)message_soup.response_body.flatten().data == "")
{
Logger.error("WallabagAPI - getAccessToken: no response");
@@ -51,51 +51,51 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
return false;
}
- string response = (string)message_soup.response_body.flatten().data;
- Logger.debug(response);
+ string response = (string)message_soup.response_body.flatten().data;
+ Logger.debug(response);
var parser = new Json.Parser();
- try
- {
- parser.load_from_data(response);
- }
- catch (Error e)
- {
- Logger.error("Could not load response to Message from instapaper");
- Logger.error(e.message);
- return false;
- }
-
- var root_node = parser.get_root();
- var root_object = root_node.get_object();
-
- if(!root_object.has_member("access_token"))
- {
- Logger.error("WallabagAPI.getAccessToken: no member access_token in response");
- return false;
- }
+ try
+ {
+ parser.load_from_data(response);
+ }
+ catch (Error e)
+ {
+ Logger.error("Could not load response to Message from Wallabag");
+ Logger.error(e.message);
+ return false;
+ }
+
+ var root_node = parser.get_root();
+ var root_object = root_node.get_object();
+
+ if(!root_object.has_member("access_token"))
+ {
+ Logger.error("WallabagAPI.getAccessToken: no member access_token in response");
+ return false;
+ }
string accessToken = root_object.get_string_member("access_token");
int64 now = (new DateTime.now_local()).to_unix();
- if(!root_object.has_member("expires_in"))
- {
- Logger.error("WallabagAPI.getAccessToken: no member expires_in in response");
- return false;
- }
+ if(!root_object.has_member("expires_in"))
+ {
+ Logger.error("WallabagAPI.getAccessToken: no member expires_in in response");
+ return false;
+ }
int64 expires = root_object.get_int_member("expires_in");
//string refreshToken = root_object.get_string_member("refresh_token");
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
- settings.set_string("oauth-access-token", accessToken);
- settings.set_string("username", username);
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
+ settings.set_string("oauth-access-token", accessToken);
+ settings.set_string("username", username);
settings.set_int("access-token-expires", (int)(now + expires));
settings.set_string("url", baseURL);
- settings.set_string("client-id", clientID);
+ settings.set_string("client-id", clientID);
settings.set_string("client-secret", clientSecret);
- var array = Settings.share("wallabag").get_strv("account-ids");
+ var array = Settings.share("wallabag").get_strv("account-ids");
foreach(string i in array)
{
if(i == id)
@@ -104,32 +104,32 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
return true;
}
}
- array += id;
+ array += id;
Settings.share("wallabag").set_strv("account-ids", array);
var pwSchema = new Secret.Schema ("org.gnome.feedreader.wallabag.password", Secret.SchemaFlags.NONE,
- "username", Secret.SchemaAttributeType.STRING,
+ "username", Secret.SchemaAttributeType.STRING,
"id", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["username"] = username;
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["username"] = username;
attributes["id"] = id;
- try
- {
- Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "Feedreader: Wallabag login", password, null);
- }
- catch(GLib.Error e)
- {
- Logger.error("WallabagAPI - getAccessToken: " + e.message);
- }
+ try
+ {
+ Secret.password_storev_sync(pwSchema, attributes, Secret.COLLECTION_DEFAULT, "Feedreader: Wallabag login", password, null);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("WallabagAPI - getAccessToken: " + e.message);
+ }
- return true;
- }
+ return true;
+ }
- public bool addBookmark(string id, string url, bool system)
- {
+ public bool addBookmark(string id, string url, bool system)
+ {
var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
Logger.debug("WallabagAPI - addBookmark: " + url);
@@ -146,17 +146,17 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
Logger.debug("WallabagAPI - addBookmark: token still valid");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- string message = "url=" + GLib.Uri.escape_string(url);
+ var session = new Soup.Session();
+ session.user_agent = Constants.USER_AGENT;
+ string message = "url=" + GLib.Uri.escape_string(url);
string baseURL = settings.get_string("url");
- var message_soup = new Soup.Message("POST", baseURL + "api/entries.json");
- message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
+ var message_soup = new Soup.Message("POST", baseURL + "api/entries.json");
+ message_soup.set_request("application/x-www-form-urlencoded; charset=UTF8", Soup.MemoryUse.COPY, message.data);
message_soup.request_headers.append("Authorization", "Bearer " + settings.get_string("oauth-access-token"));
session.send_message(message_soup);
- if((string)message_soup.response_body.flatten().data == null
+ if((string)message_soup.response_body.flatten().data == null
|| (string)message_soup.response_body.flatten().data == "")
{
Logger.error("WallabagAPI - addBookmark: no response");
@@ -165,25 +165,25 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
return false;
}
- return true;
- }
+ return true;
+ }
- public bool logout(string id)
- {
+ public bool logout(string id)
+ {
Logger.debug("WallabagAPI - logout");
- deletePassword(id);
+ deletePassword(id);
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
- var keys = settings.list_keys();
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
+ var keys = settings.list_keys();
foreach(string key in keys)
{
settings.reset(key);
}
- var array = Settings.share("wallabag").get_strv("account-ids");
- string[] array2 = {};
+ var array = Settings.share("wallabag").get_strv("account-ids");
+ string[] array2 = {};
- foreach(string i in array)
+ foreach(string i in array)
{
if(i != id)
array2 += i;
@@ -191,8 +191,8 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
Settings.share("wallabag").set_strv("account-ids", array2);
deleteAccount(id);
- return true;
- }
+ return true;
+ }
private bool accessTokenValid(string id)
{
@@ -209,25 +209,25 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
return true;
}
- public string getIconName()
- {
- return "feed-share-wallabag";
- }
+ public string getIconName()
+ {
+ return "feed-share-wallabag";
+ }
- public string getUsername(string id)
- {
- var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
- return settings.get_string("username");
- }
+ public string getUsername(string id)
+ {
+ var settings = new GLib.Settings.with_path("org.gnome.feedreader.share.account", "/org/gnome/feedreader/share/wallabag/%s/".printf(id));
+ return settings.get_string("username");
+ }
public string getPasswd(string id)
{
var pwSchema = new Secret.Schema ("org.gnome.feedreader.wallabag.password", Secret.SchemaFlags.NONE,
- "username", Secret.SchemaAttributeType.STRING,
+ "username", Secret.SchemaAttributeType.STRING,
"id", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["username"] = getUsername(id);
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["username"] = getUsername(id);
attributes["id"] = id;
string passwd = "";
@@ -253,23 +253,23 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
{
bool removed = false;
var pwSchema = new Secret.Schema ("org.gnome.feedreader.wallabag.password", Secret.SchemaFlags.NONE,
- "username", Secret.SchemaAttributeType.STRING,
+ "username", Secret.SchemaAttributeType.STRING,
"id", Secret.SchemaAttributeType.STRING);
- var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
- attributes["username"] = getUsername(id);
+ var attributes = new GLib.HashTable<string,string>(str_hash, str_equal);
+ attributes["username"] = getUsername(id);
attributes["id"] = id;
- Logger.debug(getUsername(id));
- Logger.debug(id);
+ Logger.debug(getUsername(id));
+ Logger.debug(id);
Secret.password_clearv.begin(pwSchema, attributes, null, (obj, async_res) => {
try
{
removed = Secret.password_clearv.end(async_res);
- if(!removed)
- Logger.error(@"WallabagAPI: could not delete password of account $id");
+ if(!removed)
+ Logger.error(@"WallabagAPI: could not delete password of account $id");
}
catch(GLib.Error e)
{
@@ -278,42 +278,42 @@ public class FeedReader.WallabagAPI : ShareAccountInterface, Peas.ExtensionBase
});
}
- public bool needSetup()
+ public bool needSetup()
{
return true;
}
- public bool singleInstance()
+ public bool singleInstance()
{
return false;
}
- public bool useSystemAccounts()
- {
- return false;
- }
+ public bool useSystemAccounts()
+ {
+ return false;
+ }
- public string pluginID()
- {
- return "wallabag";
- }
+ public string pluginID()
+ {
+ return "wallabag";
+ }
- public string pluginName()
- {
- return "wallabag";
- }
+ public string pluginName()
+ {
+ return "wallabag";
+ }
- public ServiceSetup? newSetup_withID(string id, string username)
- {
- return new WallabagSetup(id, this, username);
- }
+ public ServiceSetup? newSetup_withID(string id, string username)
+ {
+ return new WallabagSetup(id, this, username);
+ }
- public ServiceSetup? newSetup()
- {
- return new WallabagSetup(null, this);
- }
+ public ServiceSetup? newSetup()
+ {
+ return new WallabagSetup(null, this);
+ }
- public ServiceSetup? newSystemAccount(string id, string username)
+ public ServiceSetup? newSystemAccount(string id, string username)
{
return null;
}
diff --git a/plugins/share/Wallabag/WallabagSetup.vala b/plugins/share/Wallabag/WallabagSetup.vala
index 7ed7d45e..ee8a7ded 100644
--- a/plugins/share/Wallabag/WallabagSetup.vala
+++ b/plugins/share/Wallabag/WallabagSetup.vala
@@ -42,11 +42,11 @@ public class FeedReader.WallabagSetup : ServiceSetup {
grid.margin_bottom = 10;
grid.margin_top = 5;
- m_urlEntry = new Gtk.Entry();
+ m_urlEntry = new Gtk.Entry();
m_idEntry = new Gtk.Entry();
m_secretEntry = new Gtk.Entry();
m_userEntry = new Gtk.Entry();
- m_passEntry = new Gtk.Entry();
+ m_passEntry = new Gtk.Entry();
m_passEntry.set_input_purpose(Gtk.InputPurpose.PASSWORD);
m_passEntry.set_visibility(false);
@@ -85,13 +85,13 @@ public class FeedReader.WallabagSetup : ServiceSetup {
grid.attach(urlLabel, 0, 0, 1, 1);
grid.attach(idLabel, 0, 1, 1, 1);
grid.attach(secretLabel, 0, 2, 1, 1);
- grid.attach(userLabel, 0, 3, 1, 1);
- grid.attach(pwLabel, 0, 4, 1, 1);
- grid.attach(m_urlEntry, 1, 0, 1, 1);
+ grid.attach(userLabel, 0, 3, 1, 1);
+ grid.attach(pwLabel, 0, 4, 1, 1);
+ grid.attach(m_urlEntry, 1, 0, 1, 1);
grid.attach(m_idEntry, 1, 1, 1, 1);
grid.attach(m_secretEntry, 1, 2, 1, 1);
grid.attach(m_userEntry, 1, 3, 1, 1);
- grid.attach(m_passEntry, 1, 4, 1, 1);
+ grid.attach(m_passEntry, 1, 4, 1, 1);
m_login_revealer = new Gtk.Revealer();
m_login_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
diff --git a/plugins/share/Wallabag/meson.build b/plugins/share/Wallabag/meson.build
new file mode 100644
index 00000000..a7c0b850
--- /dev/null
+++ b/plugins/share/Wallabag/meson.build
@@ -0,0 +1,48 @@
+wallabag_resources = gnome.compile_resources(
+ 'wallabag_res',
+ 'wallabag.gresource.xml'
+)
+
+shared_library(
+ 'wallabag',
+ [
+ 'WallabagAPI.vala',
+ 'WallabagSetup.vala'
+ ],
+ wallabag_resources,
+ c_args: c_args,
+ vala_args: vala_args,
+ dependencies: [
+ libpeas,
+ libgd,
+ gtk,
+ gee,
+ libsecret,
+ sqlite3,
+ libsoup,
+ webkit2gtk,
+ libxml,
+ rest,
+ json_glib
+ ],
+ link_with: [
+ feedreader_lib
+ ],
+ install: true,
+ install_dir: SHARE_PLUGINS_DIR,
+ include_directories: include_directories('../../..')
+)
+
+install_data(
+ [
+ 'org.gnome.feedreader.share.wallabag.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
+
+install_data(
+ [
+ 'wallabag.plugin'
+ ],
+ install_dir: SHARE_PLUGINS_DIR
+)
diff --git a/plugins/share/Wallabag/org.gnome.feedreader.share.wallabag.gschema.xml b/plugins/share/Wallabag/org.gnome.feedreader.share.wallabag.gschema.xml
index eea11d4a..25a7a503 100644
--- a/plugins/share/Wallabag/org.gnome.feedreader.share.wallabag.gschema.xml
+++ b/plugins/share/Wallabag/org.gnome.feedreader.share.wallabag.gschema.xml
@@ -1,13 +1,13 @@
<schemalist>
- <schema id="org.gnome.feedreader.share.wallabag" path="/org/gnome/feedreader/share/wallabag/" gettext-domain="feedreader">
-
+ <schema id="org.gnome.feedreader.share.wallabag" path="/org/gnome/feedreader/share/wallabag/" gettext-domain="feedreader">
+
<key name="account-ids" type="as">
- <default>[]</default>
- <summary>wallabag accounts</summary>
- <description>
- all the wallabag account ids
- </description>
- </key>
+ <default>[]</default>
+ <summary>wallabag accounts</summary>
+ <description>
+ all the wallabag account ids
+ </description>
+ </key>
- </schema>
+ </schema>
</schemalist>
diff --git a/plugins/share/meson.build b/plugins/share/meson.build
new file mode 100644
index 00000000..79cf2169
--- /dev/null
+++ b/plugins/share/meson.build
@@ -0,0 +1,20 @@
+supported_share_plugins = [
+ 'Browser',
+ 'Email',
+ 'Instapaper',
+ 'Pocket',
+ 'Telegram',
+ 'Twitter',
+ 'Wallabag'
+]
+
+share_plugins = get_option('share-plugins')
+
+foreach share_plugin: supported_share_plugins
+ if share_plugins.contains(share_plugin.to_lower())
+ message('Share Plugin: ' + share_plugin + ' ON')
+ subdir(share_plugin)
+ else
+ message('Share Plugin: ' + share_plugin + ' OFF')
+ endif
+endforeach
diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
deleted file mode 100644
index 346040da..00000000
--- a/po/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-include (Translations)
-add_translations_directory (${GETTEXT_PACKAGE})
-add_translations_catalog (${GETTEXT_PACKAGE}
- ../src
-) \ No newline at end of file
diff --git a/po/FeedReader.pot b/po/FeedReader.pot
index 818aad75..9f3d387b 100644
--- a/po/FeedReader.pot
+++ b/po/FeedReader.pot
@@ -1,13 +1,14 @@
# SOME DESCRIPTIVE TITLE.
-# This file is put in the public domain.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: FeedReader\n"
+"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:46+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,493 +17,373 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -527,451 +408,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 00000000..90899b6d
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,72 @@
+af
+am
+ar
+ast
+az
+be
+bg
+bn
+bs
+ca
+ckb
+cs
+da
+de
+el
+en_AU
+en_CA
+en_GB
+eo
+es
+et
+eu
+fa
+fi
+fr
+fr_CA
+gl
+he
+hi
+hr
+hu
+hy
+id
+it
+ja
+ka
+ko
+ky
+lb
+lo
+lt
+lv
+ml
+mr
+ms
+nb
+nl
+nn
+pl
+pt
+pt_BR
+ro
+ro_RO
+ru
+rue
+si
+sk
+sl
+sma
+sq
+sr
+sv
+sw
+ta
+te
+th
+tr
+uk
+vi
+zh_CN
+zh_HK
+zh_TW \ No newline at end of file
diff --git a/po/POTFILES b/po/POTFILES
new file mode 100644
index 00000000..d7460516
--- /dev/null
+++ b/po/POTFILES
@@ -0,0 +1,54 @@
+Constants.vala.in
+data/org.gnome.FeedReader-autostart.desktop.in
+data/org.gnome.FeedReader.appdata.xml.in
+data/org.gnome.FeedReader.desktop.in
+plugins/backend/bazqux/bazquxInterface.vala
+plugins/backend/feedbin/feedbinInterface.vala
+plugins/backend/feedhq/feedhqInterface.vala
+plugins/backend/fresh/freshInterface.vala
+plugins/backend/local/localInterface.vala
+plugins/backend/local/localUtils.vala
+plugins/backend/oldreader/oldreaderInterface.vala
+plugins/backend/owncloud/OwncloudNewsInterface.vala
+plugins/backend/ttrss/ttrssAPI.vala
+plugins/backend/ttrss/ttrssInterface.vala
+plugins/share/Browser/Browser.vala
+plugins/share/Email/EmailForm.vala
+plugins/share/Instapaper/InstapaperSetup.vala
+plugins/share/Pocket/PocketSetup.vala
+plugins/share/Telegram/Telegram.vala
+plugins/share/Telegram/TelegramForm.vala
+plugins/share/Telegram/TelegramSetup.vala
+plugins/share/Twitter/TwitterForm.vala
+plugins/share/Twitter/TwitterSetup.vala
+plugins/share/Wallabag/WallabagSetup.vala
+src/Backend/FeedServer.vala
+src/DataBaseReadOnly.vala
+src/FeedReader.vala
+src/Model/Article.vala
+src/Notification.vala
+src/Share/ServiceSetup.vala
+src/Utils.vala
+src/Widgets/AddPopover.vala
+src/Widgets/ArticleList/ArticleList.vala
+src/Widgets/ArticleList/ArticleListEmptyLabel.vala
+src/Widgets/ArticleView.vala
+src/Widgets/ArticleViewHeader.vala
+src/Widgets/CategorieRow.vala
+src/Widgets/ColumnViewHeader.vala
+src/Widgets/FeedList.vala
+src/Widgets/FeedListFooter.vala
+src/Widgets/FeedRow.vala
+src/Widgets/FullscreenHeader.vala
+src/Widgets/LoginPage.vala
+src/Widgets/MainWindow.vala
+src/Widgets/MediaButton.vala
+src/Widgets/RemovePopover.vala
+src/Widgets/ResetPage.vala
+src/Widgets/SettingsDialog.vala
+src/Widgets/SharePopover.vala
+src/Widgets/ShortcutsWindow.vala
+src/Widgets/SpringCleanPage.vala
+src/Widgets/TagPopover.vala
+src/Widgets/TagRow.vala
+src/Widgets/UpdateButton.vala
diff --git a/po/af.po b/po/af.po
index 56ff8671..413f5512 100644
--- a/po/af.po
+++ b/po/af.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/am.po b/po/am.po
index 56ff8671..413f5512 100644
--- a/po/am.po
+++ b/po/am.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ar.po b/po/ar.po
index 56ff8671..413f5512 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ast.po b/po/ast.po
index 56ff8671..413f5512 100644
--- a/po/ast.po
+++ b/po/ast.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/az.po b/po/az.po
index 56ff8671..413f5512 100644
--- a/po/az.po
+++ b/po/az.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/be.po b/po/be.po
index 56ff8671..413f5512 100644
--- a/po/be.po
+++ b/po/be.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/bg.po b/po/bg.po
index 56ff8671..413f5512 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/bn.po b/po/bn.po
index 56ff8671..413f5512 100644
--- a/po/bn.po
+++ b/po/bn.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/bs.po b/po/bs.po
index 56ff8671..413f5512 100644
--- a/po/bs.po
+++ b/po/bs.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ca.po b/po/ca.po
index 5248291e..7012f105 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: feedreader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"PO-Revision-Date: 2015-08-24 04:11+0000\n"
"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
"Language-Team: Catalan <ca@li.org>\n"
@@ -18,1005 +18,945 @@ msgstr ""
"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
"X-Generator: Launchpad (build 17886)\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Nom d’usuari:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Contrasenya:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Quant al FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "URL de l’OwnCloud:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
+#: src/Backend/FeedServer.vala:231
#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "URL del TinyTinyRSS:"
+msgid "Getting articles"
+msgstr "Articles nous"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+#, fuzzy
+msgid "Getting starred articles"
+msgstr "Articles nous"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+#, fuzzy
+msgid "Getting tagged articles"
+msgstr "Articles nous"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+#, fuzzy
+msgid "Getting unread articles"
+msgstr "Articles nous"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Articles nous"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:27
+#, fuzzy, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Hi ha 1 article nou"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
+#: src/Notification.vala:29
+#, fuzzy, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Hi ha %u articles nous"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+#, fuzzy
+msgid "Rename"
+msgstr "Nom d’usuari:"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+#, fuzzy
+msgid "rename"
+msgstr "Nom d’usuari:"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Widgets/SharePopover.vala:62
+#, fuzzy
+msgid "Add accounts"
+msgstr "Compte nou"
+
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:37
+#, fuzzy
+msgid "Feed List"
+msgstr "Feedly"
+
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
+#: src/Widgets/ShortcutsWindow.vala:54
#, fuzzy
-msgid "Please fill in the password."
-msgstr "Introduïu una contrasenya vàlida"
+msgid "Article List"
+msgstr "Articles nous"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Introduïu un nom d’usuari vàlid"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Something went wrong."
-msgstr "S’ha produït un problema."
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Articles nous"
+msgid "Toggle reading status of selected article"
+msgstr "Hi ha 1 article nou"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:65
+#, fuzzy
+msgid "Toggle marking of selected article"
msgstr "Hi ha 1 article nou"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Hi ha %u articles nous"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Articles nous"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
+#: src/Widgets/ShortcutsWindow.vala:79
#, fuzzy
-msgid "Getting starred articles"
+msgid "Article View"
msgstr "Articles nous"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Articles nous"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Articles nous"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Trieu el servei RSS que feu servir i inicieu-hi una sessió per començar."
+
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
-msgstr "Articles nous"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/FeedList.vala:486
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr ""
+
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interfície"
+
+#: src/Widgets/SettingsDialog.vala:49
#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
+msgid "Internals"
+msgstr "Interfície"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/SettingsDialog.vala:71
+#, fuzzy
+msgid "Feed List:"
+msgstr "Feedly"
+
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/SettingsDialog.vala:85
+#, fuzzy
+msgid "Sort Feed List by"
+msgstr "Feedly"
+
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
+
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+#: src/Widgets/SettingsDialog.vala:95
#, fuzzy
-msgid "No Articles"
+msgid "Article List:"
msgstr "Articles nous"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+#, fuzzy
+msgid "Sort articles by"
+msgstr "Articles nous"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+#, fuzzy
+msgid "Article View:"
+msgstr "Articles nous"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+#, fuzzy
+msgid "Number of articles"
+msgstr "Articles nous"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Base de dades:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Mai"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 setmana"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 mes"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 mesos"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+#, fuzzy
+msgid "System Accounts"
+msgstr "Compte nou"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
#, fuzzy
-msgid "Mark article (un)read"
-msgstr "Hi ha %u articles nous"
+msgid "FeedReader Accounts"
+msgstr "Compte nou"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/ResetPage.vala:33
+#, fuzzy
+msgid "Change Account?"
+msgstr "Compte nou"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Compte nou"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr ""
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr ""
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
#, fuzzy
msgid "Show all articles"
msgstr "Articles nous"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-#, fuzzy
-msgid "Tag Article"
-msgstr "Articles nous"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
+#: src/Widgets/ColumnViewHeader.vala:75
#, fuzzy
-msgid "Save Article as PDF"
+msgid "Search Articles"
msgstr "Articles nous"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-#, fuzzy
-msgid "Share Article"
-msgstr "Articles nous"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Paràmetres"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr ""
+
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr ""
+
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr ""
+
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:242
#, fuzzy
-msgid "Search Articles"
+msgid "All Articles"
msgstr "Articles nous"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Paràmetres"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:487
#, fuzzy
-msgid "Rename"
-msgstr "Nom d’usuari:"
+msgid "Feeds"
+msgstr "Feedly"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
#, fuzzy
-msgid "rename"
-msgstr "Nom d’usuari:"
+msgid "No Articles"
+msgstr "Articles nous"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+#, fuzzy
+msgid "No unread articles"
+msgstr "Articles nous"
-#: src/Widgets/SharePopover.vala:65
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
#, fuzzy
-msgid "Add accounts"
-msgstr "Compte nou"
+msgid "No starred articles"
+msgstr "Articles nous"
-#: src/Widgets/ResetPage.vala:33
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
#, fuzzy
-msgid "Change Account?"
-msgstr "Compte nou"
+msgid "No articles"
+msgstr "Articles nous"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Compte nou"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "No s’ha seleccionat cap article."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
+#: src/Widgets/ArticleView.vala:790
+#, fuzzy
+msgid "Save image as"
+msgstr "Articles nous"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr ""
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Introduïu un nom d’usuari vàlid"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Introduïu una contrasenya vàlida"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Introduïu un URL vàlid"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
#, fuzzy
msgid "Please enter your Login details"
msgstr "Introduïu un nom d’usuari vàlid"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "S’ha produït un problema."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "No s’ha seleccionat cap article."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/ArticleView.vala:768
+#: src/Widgets/ArticleViewHeader.vala:68
#, fuzzy
-msgid "Save image as"
+msgid "Tag article"
msgstr "Articles nous"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interfície"
-
-#: src/Widgets/SettingsDialog.vala:39
+#: src/Widgets/ArticleViewHeader.vala:82
#, fuzzy
-msgid "Internals"
-msgstr "Interfície"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+msgid "Print article"
+msgstr "Articles nous"
-#: src/Widgets/SettingsDialog.vala:59
+#: src/Widgets/ArticleViewHeader.vala:93
#, fuzzy
-msgid "Feed List:"
-msgstr "Feedly"
+msgid "Share article"
+msgstr "Articles nous"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr ""
+#: src/Utils.vala:35
+#, fuzzy
+msgid "No Preview Available"
+msgstr "sense previsualització"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
#, fuzzy
-msgid "Article List:"
-msgstr "Articles nous"
+msgid "Username:"
+msgstr "Nom d’usuari:"
-#: src/Widgets/SettingsDialog.vala:85
-#, fuzzy
-msgid "Sort articles by"
-msgstr "Articles nous"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Contrasenya:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-#, fuzzy
-msgid "Article View:"
-msgstr "Articles nous"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
+#: plugins/share/Wallabag/WallabagSetup.vala:154
#, fuzzy
-msgid "Number of articles"
-msgstr "Articles nous"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Base de dades:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Mai"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 setmana"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 mes"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 mesos"
-
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
-msgstr ""
+msgid "Please fill in the password."
+msgstr "Introduïu una contrasenya vàlida"
-#: src/Widgets/SettingsDialog.vala:310
+#: plugins/share/Wallabag/WallabagSetup.vala:161
#, fuzzy
-msgid "System Accounts"
-msgstr "Compte nou"
+msgid "Please fill in the username."
+msgstr "Introduïu un nom d’usuari vàlid"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
+#: plugins/share/Wallabag/WallabagSetup.vala:186
#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Compte nou"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr ""
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
-"Trieu el servei RSS que feu servir i inicieu-hi una sessió per començar."
-
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr ""
+msgid "Something went wrong."
+msgstr "S’ha produït un problema."
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Feedly"
-
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Articles nous"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Hi ha 1 article nou"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "URL de l’OwnCloud:"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Quant al FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: src/Utils.vala:20
+#: plugins/backend/ttrss/ttrssInterface.vala:70
#, fuzzy
-msgid "No Preview Available"
-msgstr "sense previsualització"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr ""
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL del TinyTinyRSS:"
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
#, fuzzy
-msgid "feedreader"
-msgstr "Quant al FeedReader"
-
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr ""
+#~ msgid "Mark article (un)read"
+#~ msgstr "Hi ha %u articles nous"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#, fuzzy
+#~ msgid "Save Article as PDF"
+#~ msgstr "Articles nous"
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr ""
+#, fuzzy
+#~ msgid "Feed-List"
+#~ msgstr "Feedly"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#, fuzzy
+#~ msgid "Article-List"
+#~ msgstr "Articles nous"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#, fuzzy
+#~ msgid "feedreader"
+#~ msgstr "Quant al FeedReader"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#~ msgid "Tiny Tiny RSS"
+#~ msgstr "Tiny Tiny RSS"
-#: data/feedreader.appdata.xml.in:17
#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
+#~ msgid "feedly"
+#~ msgstr "Feedly"
-#: data/feedreader.appdata.xml.in:18
#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
-
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
-
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "ownCloud"
+#~ msgstr "OwnCloud"
#~ msgid "no Author"
#~ msgstr "sense autor"
diff --git a/po/ckb.po b/po/ckb.po
index 56ff8671..413f5512 100644
--- a/po/ckb.po
+++ b/po/ckb.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/cs.po b/po/cs.po
index 6aa64511..0033f74d 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,605 +7,616 @@ msgid ""
msgstr ""
"Project-Id-Version: feedreader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-01-04 14:33+0000\n"
-"Last-Translator: Jan Máslo <jeden.Maslic.nestaci@openmailbox.org>\n"
-"Language-Team: Czech <cs@li.org>\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-11-18 13:45+0000\n"
+"Last-Translator: Michal Čihař <michal@cihar.com>\n"
+"Language-Team: Czech <https://hosted.weblate.org/projects/feedreader/"
+"translations/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Weblate 2.18-dev\n"
"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
-"X-Generator: Launchpad (build 17886)\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Uživatelské jméno:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Heslo:"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "O FeedReaderu"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Přihlásit"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Odhlásit se"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "URL TinyTinyRSS:"
+msgid "Getting feeds and categories"
+msgstr "Zobrazit pouze nepřečtené články"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Stahuji články"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Stahuji články označené hvězdičkou"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Stahuji označené články"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Stahuji nepřečtené články"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nové články"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "čekání"
+#: src/Notification.vala:27
+#, fuzzy, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "1 nový článek"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, fuzzy, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Počet nových článků: %d"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Označit článek jako přečtený"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Přejmenovat"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "přejmenovat"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Neplatné uživatelské jméno nebo heslo"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "přidat"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Přidat účty"
+
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Ukončit"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+#, fuzzy
+msgid "Feed List"
+msgstr "Seznam zdrojů"
+
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
+#: src/Widgets/ShortcutsWindow.vala:54
#, fuzzy
-msgid "Please fill in the password."
-msgstr "Vložte prosím správné heslo"
+msgid "Article List"
+msgstr "Seznam článků:"
+
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Vložte prosím správné uživatelské jméno"
+msgid "Toggle reading status of selected article"
+msgstr "1 nový článek"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Something went wrong."
-msgstr "Omlouváme se, něco se pokazilo."
+msgid "Toggle marking of selected article"
+msgstr "1 nový článek"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nové články"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr ""
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "1 nový článek"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr ""
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Počet nových článků: %d"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
+#: src/Widgets/ShortcutsWindow.vala:79
#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Zobrazit pouze nepřečtené články"
+msgid "Article View"
+msgstr "Seznam článků:"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Nové články"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Zobrazit pouze články označené hvězdičkou"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Vyberte lokaci zdrojů RSS"
-#: src/Backend/FeedServer.vala:242
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Vyberte prosím vámi využívanou RSS službu a přihlaste se"
+
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Nezařazeno"
+
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr ""
+
+#: src/Widgets/AddPopover.vala:48
#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Zobrazit pouze články označené hvězdičkou"
+msgid "Category:"
+msgstr "Nezařazeno"
-#: src/Backend/FeedServer.vala:255
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
#, fuzzy
-msgid "Getting unread articles"
-msgstr "Zobrazit pouze nepřečtené články"
+msgid "Add"
+msgstr "přidat štítek"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Nezařazeno"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
-msgstr "Nové články"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Rozhraní"
-#: src/Widgets/FeedList.vala:433
+#: src/Widgets/SettingsDialog.vala:49
#, fuzzy
-msgid "Tags"
-msgstr "Štítky:"
+msgid "Internals"
+msgstr "Rozhraní"
-#: src/Widgets/FeedList.vala:481
-#, fuzzy
-msgid "Categories"
-msgstr "Nezařazeno"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr ""
-#: src/Widgets/FeedList.vala:486
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Seznam zdrojů"
+
+#: src/Widgets/SettingsDialog.vala:73
#, fuzzy
-msgid "Feeds"
-msgstr "Feeedly"
+msgid "Only show feeds"
+msgstr "Zobrazit pouze nepřečtené"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Zobrazit pouze nepřečtené"
-#: src/Widgets/FeedList.vala:1129
+#: src/Widgets/SettingsDialog.vala:85
#, fuzzy
-msgid "New Category"
-msgstr "Nezařazeno"
+msgid "Sort Feed List by"
+msgstr "Uspořádat seznam článků podle"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Přidat štítek:"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Štítky:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Abecedně"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "přidat štítek"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Motiv"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-"FeedReader čistí databázi.\n"
-"Nemělo by to trvat dlouho."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Probíhá synchronizace. Články se objeví každou chvíli."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Seznam článků:"
+
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Radit články podle"
+
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
+
+#: src/Widgets/SettingsDialog.vala:102
#, fuzzy
-msgid "No Articles"
-msgstr "Nové články"
+msgid "Oldest first"
+msgstr "Od nejnovějšího"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+#, fuzzy
+msgid "Article View:"
+msgstr "Seznam článků:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Výchozí"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Jaro"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Půlnoc"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergamen"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synchronizovat:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Počet článků"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Databáze:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Odstranit články po"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nikdy"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 týden"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 měsíc"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 měsíců"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Sběrač obsahu"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+#, fuzzy
+msgid "System Accounts"
+msgstr "Změnit účet"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+#, fuzzy
+msgid "FeedReader Accounts"
+msgstr "FeedReader"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Odhlásit se"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Chcete se právě odhlásit z účtu, který využívá FeedReader.\n"
+"Toto smaže veškerá lokální data vašeho starého účtu."
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "O(d)značit článek hvězdičkou"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nový účet"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Označit článek jako (ne)přečtený"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Čeká se na ukončení současné synchronizace"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Rozmyslel jsem si to"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Zobrazit všechny články"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Zobrazit pouze nepřečtené články"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Zobrazit pouze články označené hvězdičkou"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Otagovat článek"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Aktualizovat zdroje"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Sdílet článek"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Vyhledat články"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Sdílet článek"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Nastavení"
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Pergamen"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Aktualizovat zdroje"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Vyhledat články"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Nastavení"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
-msgid "Rename"
-msgstr "Uživatelské jméno:"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
+#: src/Widgets/FeedList.vala:242
#, fuzzy
-msgid "rename"
-msgstr "Uživatelské jméno:"
+msgid "All Articles"
+msgstr "Nové články"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
+#: src/Widgets/FeedList.vala:441
#, fuzzy
-msgid "add"
-msgstr "přidat štítek"
+msgid "Tags"
+msgstr "Štítky:"
-#: src/Widgets/SharePopover.vala:65
+#: src/Widgets/FeedList.vala:482
#, fuzzy
-msgid "Add accounts"
-msgstr "Nový účet"
+msgid "Categories"
+msgstr "Nezařazeno"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Odhlásit se"
+#: src/Widgets/FeedList.vala:487
+#, fuzzy
+msgid "Feeds"
+msgstr "Feeedly"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-"Chcete se právě odhlásit z účtu, který využívá FeedReader.\n"
-"Toto smaže veškerá lokální data vašeho starého účtu."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nový účet"
+#: src/Widgets/FeedList.vala:1139
+#, fuzzy
+msgid "New Category"
+msgstr "Nezařazeno"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Čeká se na ukončení současné synchronizace"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Žádné články"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Rozmyslel jsem si to"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Žádné nepřečtené články"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-#, fuzzy
-msgid "Mark as read"
-msgstr "Označit článek jako (ne)přečtený"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Žádné články označené hvězdičkou"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Žádné články"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Probíhá synchronizace. Články se objeví každou chvíli."
+
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nebyl vybrán článek"
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Uložit obrázek"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Přidat štítek:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Štítky:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "přidat štítek"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Od teď ignorovat všechny chyby tls"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "Od teď ignorovat všechny chyby TLS"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Nejdříve vyberte prosím službu"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Vložte prosím správné uživatelské jméno"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Vložte prosím správné heslo"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Vložte prosím správné URL"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Vložte prosím správné přihlašovací údaje"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Omlouváme se, něco se pokazilo."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Vaše jméno nebo heslo nejsou správně."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -613,415 +624,347 @@ msgstr ""
"Není připojení k serveru. Zkontrolujte vaše připojení k internetu a URL "
"serveru!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "Přístup API ja na serveru vypnutý. Prosím, nejprve ho zapněte!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nebyl vybrán článek"
+#: src/Widgets/MediaButton.vala:99
+#, fuzzy
+msgid "Attachments"
+msgstr "Pergamen"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader čistí databázi.\n"
+"Nemělo by to trvat dlouho."
-#: src/Widgets/ArticleView.vala:768
+#: src/Widgets/ArticleViewHeader.vala:68
#, fuzzy
-msgid "Save image as"
-msgstr "Sdílet článek"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Rozhraní"
+msgid "Tag article"
+msgstr "Otagovat článek"
-#: src/Widgets/SettingsDialog.vala:39
+#: src/Widgets/ArticleViewHeader.vala:82
#, fuzzy
-msgid "Internals"
-msgstr "Rozhraní"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Seznam zdrojů"
+msgid "Print article"
+msgstr "Radit články podle"
-#: src/Widgets/SettingsDialog.vala:61
+#: src/Widgets/ArticleViewHeader.vala:93
#, fuzzy
-msgid "Only show feeds"
-msgstr "Zobrazit pouze nepřečtené"
+msgid "Share article"
+msgstr "Sdílet článek"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Zobrazit pouze nepřečtené"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Uspořádat seznam článků podle"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Abecedně"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Žádná ukázka není dispozici"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Motiv"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Tento článek nemá žádný dostupný text :("
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Seznam článků:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Radit články podle"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Od nejnovějšího"
-
-#: src/Widgets/SettingsDialog.vala:95
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
#, fuzzy
-msgid "Article View:"
-msgstr "Seznam článků:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Výchozí"
+msgid "Username:"
+msgstr "Uživatelské jméno:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Jaro"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Heslo:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Půlnoc"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Neplatné uživatelské jméno nebo heslo"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergamen"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "čekání"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synchronizovat:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Počet článků"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Každých (minuty)"
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Databáze:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Odstranit články po"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nikdy"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 týden"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 měsíc"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 měsíců"
-
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Sběrač obsahu"
-
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Změnit účet"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Vyberte lokaci zdrojů RSS"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Vyberte prosím vámi využívanou RSS službu a přihlaste se"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+#, fuzzy
+msgid "Please fill in the password."
+msgstr "Vložte prosím správné heslo"
-#: src/Widgets/AddPopover.vala:48
+#: plugins/share/Wallabag/WallabagSetup.vala:161
#, fuzzy
-msgid "Category:"
-msgstr "Nezařazeno"
+msgid "Please fill in the username."
+msgstr "Vložte prosím správné uživatelské jméno"
-#: src/Widgets/AddPopover.vala:51
+#: plugins/share/Wallabag/WallabagSetup.vala:186
#, fuzzy
-msgid "Add"
-msgstr "přidat štítek"
+msgid "Something went wrong."
+msgstr "Omlouváme se, něco se pokazilo."
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Ukončit"
-
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Seznam zdrojů"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Seznam článků:"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "1 nový článek"
+msgid "Nextcloud URL:"
+msgstr "OwnCloud URL:"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Odhlásit se"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "O FeedReaderu"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+#, fuzzy
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL TinyTinyRSS:"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Žádná ukázka není dispozici"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Tento článek nemá žádný dostupný text :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#~ msgid "Every (Minutes)"
+#~ msgstr "Každých (minuty)"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr ""
+#~ msgid "Mark article (un)starred"
+#~ msgstr "O(d)značit článek hvězdičkou"
+
+#~ msgid "Mark article (un)read"
+#~ msgstr "Označit článek jako (ne)přečtený"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
#, fuzzy
-msgid "feedreader"
-msgstr "FeedReader"
+#~ msgid "Save Article as PDF"
+#~ msgstr "Sdílet článek"
-#: data/feedreader-autostart.desktop.in:3
#, fuzzy
-msgid "FeedReader Autostart"
-msgstr "FeedReader"
+#~ msgid "Feed-List"
+#~ msgstr "Seznam zdrojů"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#, fuzzy
+#~ msgid "Article-List"
+#~ msgstr "Seznam článků:"
-#: data/feedreader.appdata.xml.in:7
#, fuzzy
-msgid "RSS client for various webservices"
-msgstr "Desktopový klient pro různé RSS služby"
+#~ msgid "feedreader"
+#~ msgstr "FeedReader"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#, fuzzy
+#~ msgid "FeedReader Autostart"
+#~ msgstr "FeedReader"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#, fuzzy
+#~ msgid "RSS client for various webservices"
+#~ msgstr "Desktopový klient pro různé RSS služby"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#~ msgid "Tiny Tiny RSS"
+#~ msgstr "Tiny Tiny RSS"
-#: data/feedreader.appdata.xml.in:17
#, fuzzy
-msgid "feedly"
-msgstr "Feeedly"
+#~ msgid "feedly"
+#~ msgstr "Feeedly"
-#: data/feedreader.appdata.xml.in:18
#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
-
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
-
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "ownCloud"
+#~ msgstr "OwnCloud"
#~ msgid "About"
#~ msgstr "O aplikaci"
diff --git a/po/da.po b/po/da.po
index 56ff8671..413f5512 100644
--- a/po/da.po
+++ b/po/da.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/de.po b/po/de.po
index e1c84832..093473b5 100644
--- a/po/de.po
+++ b/po/de.po
@@ -3,626 +3,609 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Benedikt Heine <bebehei@gmail.com>, 2017
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015
# Inpresentia I., 2016
# Jan Lukas Gernert <jangernert@gmail.com>, 2016
+# sterni sterni <antihero@gmx.ch>, 2016
+# Tobias Strobel, 2017
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: German (http://www.transifex.com/dev-feedreader/feedreader/"
-"language/de/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-02-02 19:37+0000\n"
+"Last-Translator: Andreas Kleinert <Andy.Kleinert@gmail.com>\n"
+"Language-Team: German "
+"<https://hosted.weblate.org/projects/feedreader/translations/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Benutzername:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Passwort:"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.19-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Über FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Anmelden"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud-Adresse:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Abmelden"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "HTTP Autorisierung"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Feeds und Kategorien abrufen"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Artikel abrufen"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Gekennzeichnete Artikel abrufen"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Indexierte Artikel abrufen"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Ungelesene Artikel abrufen"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Neue Artikel"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Ein neuer Artikel verfügbar (%u ungelesen)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "%u neue Artikel verfügbar (%u ungelesen)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "warten"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Gestern"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Kategorie „%s” entfernt"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Als gelesen markieren"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Umbenennen"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Entfernen"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Entfernen (einschl. Feeds)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "Umbenennen"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "Hinzufügen"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Konten hinzufügen"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Benutzername oder Passwort sind falsch"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Allgemein"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Aktualisieren"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "RSS Client"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Suchen"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Schließen"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Feedliste"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Nächsten Eintrag auswählen"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Vorherigen Eintrag auswählen"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Kategorien erweitern/reduzieren"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Bitte ein gültiges Passwort eingeben"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Aktuell ausgewähltes als gelesen markieren"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Bitte einen gültigen Benutzernamen eingeben"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Artikelliste"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Leider ist ein Fehler ist aufgetreten."
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Nächsten/Vorherigen Artikel auswählen"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Neue Artikel"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr "Lesestatus des ausgewählten Artikels umschalten"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Artikel als (un)gelesen markieren"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
+msgstr "Markierung des ausgewählten Artikels umschalten"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Artikel als (un)gelesen markieren"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Adresse des ausgewählten Artikels öffnen"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Nur ungelesene Artikel anzeigen"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "An den Anfang/Ende blättern"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Neue Artikel"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Ausgewählten Artikel zentrieren"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Nur markierte Artikel anzeigen"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Artikelansicht"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Nur markierte Artikel anzeigen"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Nach oben/unten scrollen"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Nur ungelesene Artikel anzeigen"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Wo befinden sich Ihre Feeds?"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Zum fortzufahren, bitte den RSS-Dienst auswählen und anmelden."
+
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Nicht kategorisiert"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "\"%s\" entfernen"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Tag \"%s\" entfernt"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Kategorie:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Feed \"%s\" entfernt"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Hinzufügen"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Kategorie \"%s\" entfernt"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "OPML-Datei:"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Alle Artikel"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "OPML-Datei auswählen"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Tags"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importieren"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Kategorien"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Feed hinzufügen"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "OPML importieren"
+
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Oberfläche"
+
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Internes"
+
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Teilen"
+
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr "Feed-Liste:"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Neuer Tag"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Nur Feeds anzeigen"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Neue Kategorie"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Nur ungelesene anzeigen"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Schlagwort hinzufügen:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Feed-Liste sortieren nach"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Schlagwörter:"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Empfangen"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "Schlagwort hinzufügen"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "alphabetisch"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader säubert gerade die Datenbank.\n"
-"Das sollte nicht all zu lange dauern."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Thema"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
-"Synchronisierung läuft gerade. Artikel sollten jede Sekunde erscheinen."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "Nach oben scrollen"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Dunkel"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Neue Artikel"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "Grundlegend"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Keine ungelesenen Artikel, die auf die Beschreibung \"%s\" passen, im Feed "
-"\"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Artikelliste:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Keine ungelesenen Artikel in Feed \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Artikel sortieren nach"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Keine markierten Artikel, die auf die Beschreibung \"%s\" passen, im Feed "
-"\"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Datum"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Keine markierten Artikel in Feed \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Älteste zuerst"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Keine Artikel, die auf die Beschreibung \"%s\" passen, im Feed \"%s\" "
-"gefunden"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Betrifft nur die Spalte \"Ungelesen\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Keine Artikel in Feed \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Beim Blättern als gelesen markieren"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Keine ungelesenen Artikel, die auf die Beschreibung \"%s\" passen, mit dem "
-"Tag \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Artikelansicht:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Keine ungelesenen Artikel mit dem Tag \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Standard"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Keine markierten Artikel, die auf die Beschreibung \"%s\" passen, mit dem "
-"Tag \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Frühling"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Keine markierten Artikel mit dem Tag \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Mitternacht"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Keine Artikel, die auf die Beschreibung \"%s\" passen, mit dem Tag \"%s\" "
-"gefunden"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergament"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Keine Artikel mit dem Tag \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Schriftfamilie"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Keine ungelesenen Artikel, die auf die Beschreibung \"%s\" passen, in der "
-"Kategorie \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synchronisieren:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Keine ungelesenen Artikel in der Kategorie \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Anzahl der Artikel"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Keine markierten Artikel, die auf die Beschreibung \"%s\" passen, in der "
-"Kategorie \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Intervall in Minuten (0 = AUS)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Keine markierten Artikel in der Kategorie \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Datenbank:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Keine Artikel, die auf die Beschreibung \"%s\" passen, in der Kategorie \"%s"
-"\" gefunden"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Artikel löschen nach"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Keine Artikel in der Kategorie \"%s\" gefunden"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nie"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
-"Keine ungelesenen Artikel, die auf die Beschreibung \"%s\" passen, gefunden"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 Woche"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Keine ungelesenen Artikel gefunden"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Monat"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
-"Keine markierten Artikel, die auf die Beschreibung \"%s\" passen, gefunden"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Monate"
+
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Zusätzliche Funktionen:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Keine markierten Artikel gefunden"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Komplette Artikel"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Keine Artikel, die auf die Beschreibung \"%s\" passen, gefunden"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Grafiken herunterladen"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Keine Artikel gefunden"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Interner Medienabspieler"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Artikel (nicht) markieren"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "System-Konten"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Artikel als (un)gelesen markieren"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader-Konten"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Artikel in Vollbild lesen"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Konto wechseln?"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Sie sind gerade dabei, das Konto zu ändern, welches Sie mit FeedReader "
+"benutzen möchten.\n"
+" Das hat zur Folge, dass alle lokalen Daten Ihres alten Kontos gelöscht "
+"werden."
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Neues Konto"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Auf das Fertigstellen der Synchronisation wird gewartet"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Ich habe mich anders entschieden."
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Alle"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Alle Artikel anzeigen"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Ungelesen"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Nur ungelesene Artikel anzeigen"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
-msgstr "Markiert"
+msgstr "Gekennzeichnet"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
-msgstr "Nur markierte Artikel anzeigen"
+msgstr "Nur gekennzeichnete Artikel anzeigen"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Artikel verschlagworten"
-
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Artikel teilen"
-
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Artikel teilen"
-
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Anhänge"
-
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr "Feeds aktualisieren"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:205
+#: src/Widgets/ColumnViewHeader.vala:75
msgid "Search Articles"
msgstr "Artikel suchen"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
+#: src/Widgets/ColumnViewHeader.vala:101
msgid "Settings"
msgstr "Einstellungen"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Umbenennen"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Artikel in Vollbild lesen"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Entfernen"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Schlagwort „%s” entfernt"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "Umbenennen"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Feed entfernen"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "Hinzufügen"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "URL kopieren"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Neues Konto"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Nur von %s entfernen"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Konto wechseln?"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr "Feed „%s” entfernt"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Vollbildmodus verlassen"
+
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Alle Artikel"
+
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Schlagwörter"
+
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Kategorien"
+
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Feeds"
+
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Neues Schlagwort"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Neue Kategorie"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Keine Artikel"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Keine ungelesenen Artikel"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Keine gekennzeichneten Artikel"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Keine Artikel"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-"Sie sind gerade dabei, das Konto zu ändern, welches Sie mit FeedReader "
-"benutzen möchten.\n"
-" Das hat zur Folge, dass alle lokalen Daten Ihres alten Kontos gelöscht "
+"Synchronisierung wird ausgeführt. Artikel sollten sekündlich angezeigt "
"werden."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Neues Konto"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "Nach oben blättern"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Auf das Fertigstellen der Synchronisation wird gewartet"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Kein Artikel ausgewählt"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Ich habe mich anders entschieden."
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit ist abgestürzt"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Als gelesen markieren"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Grafik speichern unter"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Entfernen (zusammen mit Feeds)"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Schlagwort hinzufügen:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Schlagwörter:"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "Schlagwort hinzufügen"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr "Alle zukünftigen TLS Fehler ignorieren"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Bitte zuerst einen Dienst auswählen"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Bitte einen gültigen Benutzernamen eingeben"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Bitte ein gültiges Passwort eingeben"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Bitte eine gültige Adresse eingeben"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
-msgstr "Bitte geben Ihre Anmeldedaten eingeben"
+msgstr "Bitte Ihre Anmeldedaten eingeben"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Leider ist ein Fehler ist aufgetreten."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "Der Server meldete einen API-Fehler"
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Entweder ist Ihr Benutzername oder das Passwort falsch."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -630,453 +613,317 @@ msgstr ""
"Keine Verbindung zum Server. Bitte überprüfen Sie Ihre Internetverbindung "
"und die Serveradresse!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
"Der API-Zugriff ist auf dem Server deaktiviert. Bitte diesen zuerst "
"aktivieren!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Nicht berechtigt um auf URL zuzugreifen"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Kein gültiges CA-Zertifikat verfügbar!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-"Bitte installiere das \"api_feedreader\"-plugin auf deinem tt-rss Server!"
+"Bitte installieren Sie das Plugin \"api_feedreader\" auf Ihrem tt-rss-Server!"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Kein Artikel ausgewählt"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Anhänge"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader säubert gerade die Datenbank.\n"
+"Das sollte nicht all zu lange dauern."
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Bild speichern unter"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Oberfläche"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Internes"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Teilen"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Feed-Liste:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Nur Feeds anzeigen"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Nur ungelesene anzeigen"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Feed-Liste sortieren nach"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Empfangen"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "alphabetisch"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Thema"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Dunkel"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Artikelliste:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Artikel sortieren nach"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Datum"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Neuestes zuerst"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Artikelansicht:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Standard"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Frühling"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Mitternacht"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergament"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Text Größe"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Klein"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Groß"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Artikel verschlagworten"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Riesig"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Artikel drucken"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synchronisieren:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Artikel teilen"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Anzahl der Artikel"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "„%s” entfernen"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Alle (Minuten)"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Feed „%s” entfernt"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Datenbank:"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr "Unbekanntes Schlagwort"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Artikel löschen nach"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Keine Vorschau verfügbar"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nie"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Kein Text für diesen Artikel verfügbar :("
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Woche"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "Erstellt von: %s, "
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Monat"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Speichern"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "In Browser öffnen"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Benutzername:"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Monate"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Passwort:"
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Zusätzliche Funtionen:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Benutzername oder Passwort falsch"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Komplette Artikel"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "Warten"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Hey,\n"
+"\n"
+"wirf mal einen Blick auf diesen interessanten Artikel: $URL"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Neues Konto"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader Autostart"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Vollbildmodus verlassen"
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Wo befinden sich Ihre Feeds?"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Beschränkung: "
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Zum fortzufahren, bitte den RSS-Dienst auswählen und anmelden."
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tweet"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Kategorie:"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Tweet an Follower"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Hinzufügen"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "Client-ID:"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "OPML-Datei:"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+#, fuzzy
+msgid "Client Secret:"
+msgstr "Client Secret:"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "OPML-Datei auswählen"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Bitte URL eingeben"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importieren"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "Die URL scheint ungültig zu sein."
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Feed hinzufügen"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Bitte Client-ID eingeben"
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "OPML improtieren"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Bitte Client Secret eingeben"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Nur von %s entfernen"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Bitte Passwort eingeben"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Bitte Benutzernamen eingeben"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Ein Fehler ist aufgetreten."
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Hey,\n"
+"\n"
+"wirf mal einen Blick auf diesen interessanten Artikel: $URL\n"
+"\n"
+"- gesendet von FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Schließen"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "An:"
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Feed-Liste:"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Senden"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "E-Mail senden"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Hey,\n"
+"wirf mal einen Blick auf diesen interessanten Artikel:\n"
+"%s\n"
+"\n"
+"- gesendet von FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Telegram senden"
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Artikelliste:"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
+"Info: Telegram muss installiert sein, damit dieses Plugin funktioniert."
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Artikel als (un)gelesen markieren"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS-URL:"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP-Autorisierung"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"Bitte melden Sie sich auf Ihrem freshRSS Server an und genießen Sie "
+"FeedReader"
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Heute"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Bitte melde Sie sich auf FeedHQ an und genießen Sie FeedReader"
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Gestern"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Fertig"
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Abmelden"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Feeds werden hinzugefügt"
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Über FeedReader"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Nichts zum Lesen hier."
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr "Nextcloud-URL:"
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Bitte melden Sie sich bei Ihrer Nextcloud-News-Instanz an und genießen Sie "
+"FeedReader."
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Keine Vorschau verfügbar"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Kein Text für diesen Artikel verfügbar :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "gepostet von: %s,"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr "Ungültige Adresse"
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "RSS Client"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr "Inhalt der URL ist HTML. Keine Feeds verfügbar"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Lese Feeds von Web-Angeboten"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr "Inhalt der URL ist HTML, welches mehrere Feeds enthält."
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "feedreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr "Inhalt der URL konnte nicht heruntergeladen werden."
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr "Inhalt ist ein ungültiges XML."
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr "Fehler beim Erreichen von tt-rss"
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "RSS Klient für eine Vielzahl von Web-Angeboten"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS URL:"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-"FeedReader ist ein Programm das bestehende Web-basierte RSS Konten ergänzt."
-
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Aktuell unterstützte Services:"
-
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+"Bitte melden Sie sich auf Ihrem Tiny Tiny RSS Server an und genießen Sie "
+"FeedReader"
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
-
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Bitte melden Sie sich auf The Old Reader an und genießen Sie FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Bitte melden Sie sich auf Feedbin an und genießen Sie FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Es kombiniert die Vorzüge von Web-Angeboten, wie Synchronisierung aller "
-"Geräte, mit allem was man von einem modernen Desktop-Programm erwartet: "
-"Benachrichtigungen, schnelle Suche und Filter, Tagging, Teilen zu \"read-it-"
-"later\" Angeboten wie Pocket und Instapaper, nützliche Tastenkürzel und eine "
-"Datenbank, die alle alten Artikel aufhebt so lange du willst."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Keiner der %i Artikel in der Datenbank passt zu den aktuellen Filtern."
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Keine ungelesenen und markierten Artikel, die auf die Beschreibung \"%s\" "
-#~ "passen, in dem Feed \"%s\" gefunden"
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr "Keine ungelesenen, markierten Artikel in Feed \"%s\" gefunden"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Keine ungelesenen und markierten Artikel, die auf die Beschreibung \"%s\" "
-#~ "passen, mit dem Tag \"%s\" gefunden"
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr "Keine ungelesenen, markierten Artikel mit dem Tag \"%s\" gefunden"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Keine ungelesenen und markierten Artikel, die auf die Beschreibung \"%s\" "
-#~ "passen, in der Kategorie \"%s\" gefunden"
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr ""
-#~ "Keine ungelesenen, markierten Artikel in der Kategorie \"%s\" gefunden"
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "Keine ungelesenen und markierten Artikel, die auf die Beschreibung \"%s\" "
-#~ "passen, gefunden"
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Keine ungelesenen und markierten Artikel gefunden"
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Ausgewählten Artikel zu Favoriten hinzufügen/entfernen"
diff --git a/po/el.po b/po/el.po
index 56ff8671..413f5512 100644
--- a/po/el.po
+++ b/po/el.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/en_AU.po b/po/en_AU.po
index 56ff8671..413f5512 100644
--- a/po/en_AU.po
+++ b/po/en_AU.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/en_CA.po b/po/en_CA.po
index 56ff8671..413f5512 100644
--- a/po/en_CA.po
+++ b/po/en_CA.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/en_GB.po b/po/en_GB.po
index da71b492..9ecafda0 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: feedreader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"PO-Revision-Date: 2015-08-29 14:18+0000\n"
"Last-Translator: Andi Chandler <Unknown>\n"
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -18,596 +18,617 @@ msgstr ""
"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
"X-Generator: Launchpad (build 17886)\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Username:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Password:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "About FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Login"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Logout"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
+#: src/Backend/FeedServer.vala:231
#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "TinyTinyRSS URL:"
+msgid "Getting articles"
+msgstr "New articles"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+#, fuzzy
+msgid "Getting starred articles"
+msgstr "New articles"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+#, fuzzy
+msgid "Getting tagged articles"
+msgstr "New articles"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+#, fuzzy
+msgid "Getting unread articles"
+msgstr "New articles"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "New articles"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:27
+#, fuzzy, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "There is 1 new article"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "waiting"
+#: src/Notification.vala:29
+#, fuzzy, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "There are %u new articles"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+#, fuzzy
+msgid "Rename"
+msgstr "Username:"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+#, fuzzy
+msgid "rename"
+msgstr "Username:"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+#, fuzzy
+msgid "add"
+msgstr "add Tag"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Username or Password incorrect"
+#: src/Widgets/SharePopover.vala:62
+#, fuzzy
+msgid "Add accounts"
+msgstr "New account"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+#, fuzzy
+msgid "Feed List"
+msgstr "Feed List:"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Please enter a valid password"
-
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Please enter a valid username"
-
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Sorry, something went wrong."
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "New Articles"
-
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "There is 1 new article"
-
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "There are %u new articles"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Backend/FeedServer.vala:167
+#: src/Widgets/ShortcutsWindow.vala:54
#, fuzzy
-msgid "Getting articles"
-msgstr "New Articles"
+msgid "Article List"
+msgstr "New articles"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "New Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Getting tagged articles"
-msgstr "New Articles"
+msgid "Toggle reading status of selected article"
+msgstr "There is 1 new article"
-#: src/Backend/FeedServer.vala:255
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Getting unread articles"
-msgstr "New Articles"
-
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Uncategorised"
+msgid "Toggle marking of selected article"
+msgstr "There is 1 new article"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:79
+#, fuzzy
+msgid "Article View"
+msgstr "New articles"
+
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
-msgstr "New Articles"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Where are your feeds?"
-#: src/Widgets/FeedList.vala:433
-#, fuzzy
-msgid "Tags"
-msgstr "Tags:"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Please select the RSS service you are using and log in to get going."
-#: src/Widgets/FeedList.vala:481
-#, fuzzy
-msgid "Categories"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr "Uncategorised"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
-
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
+#: src/Widgets/AddPopover.vala:48
#, fuzzy
-msgid "New Category"
+msgid "Category:"
msgstr "Uncategorised"
-#: src/Widgets/TagPopover.vala:36
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
#, fuzzy
-msgid "Add Tag:"
+msgid "Add"
msgstr "add Tag"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Tags:"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "add Tag"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "New Articles"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interface"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Internals"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Feed List:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+#, fuzzy
+msgid "Sort Feed List by"
+msgstr "Feed List:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Theme"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:95
+#, fuzzy
+msgid "Article List:"
+msgstr "New articles"
+
+#: src/Widgets/SettingsDialog.vala:97
+#, fuzzy
+msgid "Sort articles by"
+msgstr "New articles"
+
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:109
+#, fuzzy
+msgid "Article View:"
+msgstr "New articles"
+
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sync:"
+
+#: src/Widgets/SettingsDialog.vala:143
+#, fuzzy
+msgid "Number of articles"
+msgstr "New articles"
+
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Database:"
+
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Never"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 Week"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Month"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Months"
+
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Additional Functionality:"
+
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Content Grabber"
+
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
+#: src/Widgets/SettingsDialog.vala:322
#, fuzzy
-msgid "Mark article (un)read"
-msgstr "There are %u new articles"
+msgid "System Accounts"
+msgstr "Change Account"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+#, fuzzy
+msgid "FeedReader Accounts"
+msgstr "FeedReader"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Change Account?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "New account"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Waiting for current sync to finish"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "I changed my mind"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
#, fuzzy
msgid "Show all articles"
-msgstr "New Articles"
+msgstr "New articles"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-#, fuzzy
-msgid "Tag Article"
-msgstr "New Articles"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr "Search Articles"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-#, fuzzy
-msgid "Share Article"
-msgstr "Search Articles"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Settings"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Search Articles"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Settings"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
-msgid "Rename"
-msgstr "Username:"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
+#: src/Widgets/FeedList.vala:242
#, fuzzy
-msgid "rename"
-msgstr "Username:"
+msgid "All Articles"
+msgstr "New articles"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
+#: src/Widgets/FeedList.vala:441
#, fuzzy
-msgid "add"
-msgstr "add Tag"
+msgid "Tags"
+msgstr "Tags:"
-#: src/Widgets/SharePopover.vala:65
+#: src/Widgets/FeedList.vala:482
#, fuzzy
-msgid "Add accounts"
-msgstr "New account"
+msgid "Categories"
+msgstr "Uncategorised"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Change Account?"
+#: src/Widgets/FeedList.vala:487
+#, fuzzy
+msgid "Feeds"
+msgstr "Feedly"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "New account"
+#: src/Widgets/FeedList.vala:1139
+#, fuzzy
+msgid "New Category"
+msgstr "Uncategorised"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Waiting for current sync to finish"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+#, fuzzy
+msgid "No Articles"
+msgstr "New articles"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "I changed my mind"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+#, fuzzy
+msgid "No unread articles"
+msgstr "New articles"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+#, fuzzy
+msgid "No starred articles"
+msgstr "New articles"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+#, fuzzy
+msgid "No articles"
+msgstr "New articles"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "No Article selected."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+#, fuzzy
+msgid "Save image as"
+msgstr "Search Articles"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:45
+#, fuzzy
+msgid "Add Tag:"
+msgstr "add Tag"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Tags:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "add Tag"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Please select a service first"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Please enter a valid username"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Please enter a valid password"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Please enter a valid URL"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Please enter your Login details"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Sorry, something went wrong."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Either your username or the password are not correct."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -615,417 +636,341 @@ msgstr ""
"No connection to the server. Check your Internet connection and the server "
"URL!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "No Article selected."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
-#: src/Widgets/ArticleView.vala:768
+#: src/Widgets/ArticleViewHeader.vala:68
#, fuzzy
-msgid "Save image as"
-msgstr "Search Articles"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interface"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Internals"
+msgid "Tag article"
+msgstr "New articles"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:82
+#, fuzzy
+msgid "Print article"
+msgstr "New articles"
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Feed List:"
+#: src/Widgets/ArticleViewHeader.vala:93
+#, fuzzy
+msgid "Share article"
+msgstr "Search Articles"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-#, fuzzy
-msgid "Sort FeedList by"
-msgstr "Feed List:"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr ""
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "No Preview Available"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Theme"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "No Text available for this article :("
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-#, fuzzy
-msgid "Article List:"
-msgstr "New Articles"
-
-#: src/Widgets/SettingsDialog.vala:85
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
#, fuzzy
-msgid "Sort articles by"
-msgstr "New Articles"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr ""
+msgid "Username:"
+msgstr "Username:"
-#: src/Widgets/SettingsDialog.vala:95
-#, fuzzy
-msgid "Article View:"
-msgstr "New Articles"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Password:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Username or Password incorrect"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr ""
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "waiting"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sync:"
-
-#: src/Widgets/SettingsDialog.vala:130
-#, fuzzy
-msgid "Number of articles"
-msgstr "New Articles"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Database:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Never"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Week"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Month"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Months"
-
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Additional Functionality:"
-
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Content Grabber"
-
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Change Account"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
+#: plugins/share/Wallabag/WallabagSetup.vala:154
#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Where are your feeds?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Please select the RSS service you are using and log in to get going."
+msgid "Please fill in the password."
+msgstr "Please enter a valid password"
-#: src/Widgets/AddPopover.vala:48
+#: plugins/share/Wallabag/WallabagSetup.vala:161
#, fuzzy
-msgid "Category:"
-msgstr "Uncategorised"
+msgid "Please fill in the username."
+msgstr "Please enter a valid username"
-#: src/Widgets/AddPopover.vala:51
+#: plugins/share/Wallabag/WallabagSetup.vala:186
#, fuzzy
-msgid "Add"
-msgstr "add Tag"
+msgid "Something went wrong."
+msgstr "Sorry, something went wrong."
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Feed List:"
-
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "New Articles"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "There is 1 new article"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "OwnCloud URL:"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Logout"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "About FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "No Preview Available"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "No Text available for this article :("
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+#, fuzzy
+msgid "Tiny Tiny RSS URL:"
+msgstr "TinyTinyRSS URL:"
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
#, fuzzy
-msgid "feedreader"
-msgstr "FeedReader"
+#~ msgid "Mark article (un)read"
+#~ msgstr "There are %u new articles"
-#: data/feedreader-autostart.desktop.in:3
#, fuzzy
-msgid "FeedReader Autostart"
-msgstr "FeedReader"
-
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#~ msgid "Save Article as PDF"
+#~ msgstr "Search Articles"
-#: data/feedreader.appdata.xml.in:7
#, fuzzy
-msgid "RSS client for various webservices"
-msgstr "Desktop Client for various RSS Services"
-
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#~ msgid "Feed-List"
+#~ msgstr "Feed List:"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#, fuzzy
+#~ msgid "Article-List"
+#~ msgstr "New articles"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#, fuzzy
+#~ msgid "feedreader"
+#~ msgstr "FeedReader"
-#: data/feedreader.appdata.xml.in:17
#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
+#~ msgid "FeedReader Autostart"
+#~ msgstr "FeedReader"
-#: data/feedreader.appdata.xml.in:18
#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
+#~ msgid "RSS client for various webservices"
+#~ msgstr "Desktop Client for various RSS Services"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#~ msgid "Tiny Tiny RSS"
+#~ msgstr "Tiny Tiny RSS"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#, fuzzy
+#~ msgid "feedly"
+#~ msgstr "Feedly"
+
+#, fuzzy
+#~ msgid "ownCloud"
+#~ msgstr "OwnCloud"
#~ msgid "no Author"
#~ msgstr "no Author"
diff --git a/po/eo.po b/po/eo.po
index dc04209c..3af7d34a 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: feedreader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"PO-Revision-Date: 2015-03-19 00:29+0000\n"
"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
"Language-Team: Esperanto <eo@li.org>\n"
@@ -18,510 +18,388 @@ msgstr ""
"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
"X-Generator: Launchpad (build 17886)\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Uzantnomo:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Pasvorto:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-#, fuzzy
-msgid "OwnCloud URL:"
-msgstr "OwnCloud"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
+#: src/Backend/FeedServer.vala:231
#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+msgid "Getting articles"
+msgstr "Novaj artikoloj"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+#, fuzzy
+msgid "Getting starred articles"
+msgstr "Novaj artikoloj"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+#, fuzzy
+msgid "Getting tagged articles"
+msgstr "Novaj artikoloj"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+#, fuzzy
+msgid "Getting unread articles"
+msgstr "Novaj artikoloj"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Novaj artikoloj"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+#, fuzzy
+msgid "Rename"
+msgstr "Uzantnomo:"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+#, fuzzy
+msgid "rename"
+msgstr "Uzantnomo:"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+#, fuzzy
+msgid "Feed List"
+msgstr "Feedly"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Novaj artikoloj"
-
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Backend/FeedServer.vala:167
+#: src/Widgets/ShortcutsWindow.vala:54
#, fuzzy
-msgid "Getting articles"
+msgid "Article List"
msgstr "Novaj artikoloj"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Novaj artikoloj"
-
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Novaj artikoloj"
-
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Novaj artikoloj"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:234
+#: src/Widgets/ShortcutsWindow.vala:79
#, fuzzy
-msgid "All Articles"
+msgid "Article View"
msgstr "Novaj artikoloj"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
-
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+#, fuzzy
+msgid "Feed List:"
+msgstr "Feedly"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+#, fuzzy
+msgid "Sort Feed List by"
+msgstr "Feedly"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+#, fuzzy
+msgid "Article List:"
+msgstr "Novaj artikoloj"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+#, fuzzy
+msgid "Sort articles by"
+msgstr "Novaj artikoloj"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+#, fuzzy
+msgid "Article View:"
+msgstr "Novaj artikoloj"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/SettingsDialog.vala:143
#, fuzzy
-msgid "Show all articles"
+msgid "Number of articles"
msgstr "Novaj artikoloj"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-#, fuzzy
-msgid "Tag Article"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-#, fuzzy
-msgid "Share Article"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-#, fuzzy
-msgid "Search Articles"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
-msgid "Rename"
-msgstr "Uzantnomo:"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-#, fuzzy
-msgid "rename"
-msgstr "Uzantnomo:"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -546,462 +424,516 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/ColumnViewHeader.vala:37
+#, fuzzy
+msgid "Show all articles"
+msgstr "Novaj artikoloj"
+
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:75
+#, fuzzy
+msgid "Search Articles"
+msgstr "Novaj artikoloj"
+
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedList.vala:242
+#, fuzzy
+msgid "All Articles"
+msgstr "Novaj artikoloj"
+
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedList.vala:487
+#, fuzzy
+msgid "Feeds"
+msgstr "Feedly"
+
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
#, fuzzy
-msgid "No Article selected."
+msgid "No Articles"
msgstr "Novaj artikoloj"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+#, fuzzy
+msgid "No unread articles"
+msgstr "Novaj artikoloj"
-#: src/Widgets/ArticleView.vala:768
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
#, fuzzy
-msgid "Save image as"
+msgid "No starred articles"
msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+#, fuzzy
+msgid "No articles"
+msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
+#: src/Widgets/ArticleView.vala:62
#, fuzzy
-msgid "Feed List:"
-msgstr "Feedly"
+msgid "No Article selected."
+msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr ""
+#: src/Widgets/ArticleView.vala:790
+#, fuzzy
+msgid "Save image as"
+msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-#, fuzzy
-msgid "Article List:"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/SettingsDialog.vala:85
-#, fuzzy
-msgid "Sort articles by"
-msgstr "Novaj artikoloj"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-#, fuzzy
-msgid "Article View:"
-msgstr "Novaj artikoloj"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
+#: src/Widgets/ArticleViewHeader.vala:68
#, fuzzy
-msgid "Number of articles"
+msgid "Tag article"
msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:82
+#, fuzzy
+msgid "Print article"
+msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:93
+#, fuzzy
+msgid "Share article"
+msgstr "Novaj artikoloj"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+#, fuzzy
+msgid "Username:"
+msgstr "Uzantnomo:"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Pasvorto:"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Feedly"
-
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Novaj artikoloj"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+#, fuzzy
+msgid "Nextcloud URL:"
+msgstr "OwnCloud"
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+#, fuzzy
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS"
+
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#, fuzzy
+#~ msgid "Save Article as PDF"
+#~ msgstr "Novaj artikoloj"
-#: data/feedreader.appdata.xml.in:17
#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
+#~ msgid "Feed-List"
+#~ msgstr "Feedly"
-#: data/feedreader.appdata.xml.in:18
#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
+#~ msgid "Article-List"
+#~ msgstr "Novaj artikoloj"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#~ msgid "Tiny Tiny RSS"
+#~ msgstr "Tiny Tiny RSS"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#, fuzzy
+#~ msgid "feedly"
+#~ msgstr "Feedly"
+
+#, fuzzy
+#~ msgid "ownCloud"
+#~ msgstr "OwnCloud"
diff --git a/po/es.po b/po/es.po
index 23832c28..45bde59d 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,14 +7,14 @@
# Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>, 2016
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015
# Lucas Capalbo Lavezzo <lucas.capalbo@gmail.com>, 2016
-# Lucas Capalbo Lavezzo <lucas.capalbo@gmail.com>, 2016
+# Lucas Capalbo Lavezzo <lucas.capalbo@gmail.com>, 2016-2017
# Lucas Capalbo Lavezzo <lucas.capalbo@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/dev-feedreader/feedreader/"
"language/es/)\n"
@@ -24,604 +24,586 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nombre de usuario:"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Acerca de FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Contraseña:"
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
+msgid "Login"
+msgstr "Iniciar sesión"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Salir"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
-msgid "Login"
-msgstr "Conectar"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Obteniendo canales y categorías"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "URL de OwnCloud:"
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Obteniendo artículos"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorización HTTP"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Obteniendo artículos favoritos"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Obteniendo artículos etiquetados"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Obteniendo artículos no leídos"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Artículos nuevos"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Hay un artículo nuevo (%u no leídos)"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Hay %u artículos nuevos (%u no leídos)"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Ayer"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Categoría \"%s\" eliminada"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "esperando"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Marcar como leído"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Renombrar"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Eliminar"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Eliminar (con los canales)"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "renombrar"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "agregar"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Agregar cuentas"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "General"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Refrescar"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Nombre de usuario o contraseña incorrectos"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Buscar"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Salir"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Cliente RSS"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Lista de canales"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Seleccionar artículo siguiente"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Seleccionar artículo anterior"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Colapsar/Expandir categorías"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Marcar la selección actual como leída"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Lista de artículos"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Por favor, indique una contraseña válida"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Seleccionar el artículo siguiente/previo"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Por favor, indique un nombre de usuario válido"
+msgid "Toggle reading status of selected article"
+msgstr "Alternar el artículo seleccionado leído/no leído"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Something went wrong."
-msgstr "Lo siento, ha ocurrido un error."
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Artículos nuevos"
+msgid "Toggle marking of selected article"
+msgstr "Alternar el artículo seleccionado leído/no leído"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Marcar artículo como (no)leído"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Abrir la URL del artículo seleccionado"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Marcar artículo como (no)leído"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Deslizar hasta arriba/abajo"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Mostrar sólo artículos no leídos"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Centrar al artículo actualmente seleccionado"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Artículos nuevos"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Vista de artículo"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Mostrar sólo artículos favoritos"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Deslizar hasta arriba/abajo"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Mostrar sólo artículos favoritos"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "¿Dónde se ubican sus canales?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Mostrar sólo artículos no leídos"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Seleccione el servicio RSS que utilice y acceda a éste para comenzar."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Sin categorizar"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Eliminar \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Etiqueta \"%s\" eliminada"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categoría:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Canal \"%s\" eliminado"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Agregar"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Categoría \"%s\" eliminada"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Todos los Artículos"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Etiquetas"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importar"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Categorías"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Agregar canal"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Lista de canales"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importar OPML"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Nueva Etiqueta"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Aspecto"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Nueva Categoría"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Internos"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Añadir Etiqueta:"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Compartir"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Etiquetas:"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Lista de canales"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "agregar Etiqueta"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Mostrar sólo canales"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader está limpiando la base de datos.\n"
-"Esto no llevará mucho tiempo."
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Mostrar sólo artículos sin leer"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-"Sincronización en marcha. Los articulos aparecerán en cualquier momento."
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "deslizar hacia arriba"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Recibido"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Artículos nuevos"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabéticamente"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo pendiente de lectura coincidente con \"%s\" "
-"en el canal \"%s\""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "No se encontró ningún artículo pendiente de lectura en el canal \"%s\""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo marcado coincidente con \"%s\" en el canal "
-"\"%s\""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Oscuro"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "No se encontró ningún artículo marcado en el canal \"%s\""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo coincidente con \"%s\" en el canal \"%s\""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Lista de Artículos:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "No se encontró ningún artículo en el canal \"%s\""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Ordenar artículos por"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo pendiente de lectura coincidente con \"%s\" "
-"en la etiqueta \"%s\""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Fecha"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo pendiente de lectura en la etiqueta \"%s\""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Lo más antiguo primero"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo marcado coincidente con \"%s\" en la etiqueta "
-"\"%s\""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Sólo afecta la columna \"Sin leer\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "No se encontró ningún artículo marcado en la etiqueta \"%s\""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Marcar como leídos al deslizar"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo coincidente con \"%s\" en la etiqueta \"%s\""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Vista de artículo"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "No se encontró ningún artículo en la etiqueta \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Predeterminado"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo pendiente de lectura coincidente con \"%s\" "
-"en la categoría \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Primavera"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
-"No se encontró ningún artículo pendiente de lectura en la categoría \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Medianoche"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergamino"
+
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-"No se encontró ningún artículo marcado coincidente con \"%s\" en la "
-"categoría \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "No se encontró ningún artículo marcado en la categoría \"%s\""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sincronizar:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Número de artículos"
+
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-"No se encontró ningún artículo coincidente con \"%s\" en la categoría \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "No se encontró ningún artículo en la categoría \"%s\""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Base de datos:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Eliminar artículos después de"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nunca"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 semana"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 mes"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 meses"
+
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funcionalidad adicional:"
+
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Captador de contenido"
+
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-"No se encontró ningún artículo pendiente de lectura coincidente con \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "No se encontró ningún artículo pendiente de lectura"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Reproductor multimedia interno"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "No se encontró ningún artículo marcado coincidente con \"%s\""
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Cuentas del sistema"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "No se encontró ningún artículo marcado"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "Cuentas de FeedReader"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "No se encontró ningún artículo coincidente con \"%s\""
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "¿Quiere cambiar de cuenta?"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "No se encontró ningún artículo"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Está a punto de cambiar la cuenta que usa en FeedReader.\n"
+" Esto implica borrar todos los datos locales de su antigua cuenta."
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Marcar/desmarcar artículo como favorito"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Cuenta nueva"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Marcar artículo como (no)leído"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Esperando que termine la sincronización"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Leer artículo a pantalla completa"
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "He cambiado de idea"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Todo"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Mostrar todos los artículos"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "No leídos"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Mostrar sólo artículos no leídos"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Favoritos"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Mostrar sólo artículos favoritos"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Etiquetar artículo"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Actualizar canales"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Compartir artículo"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Buscar artículos"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Compartir artículo"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Configuración"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Adjuntos"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Leer artículo a pantalla completa"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Actualizar canales"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Etiqueta \"%s\" eliminada"
+
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Eliminar canal"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Buscar artículos"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Eliminar sólo de \"%s\""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Configuración"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Canal \"%s\" eliminado"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Renombrar"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Abandonar el modo de pantalla completa"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Eliminar"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Todos los Artículos"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "renombrar"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Etiquetas"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "agregar"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categorías"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Cuenta nueva"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Canales"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "¿Quiere cambiar de cuenta?"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nueva Etiqueta"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nueva Categoría"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "No hay artículos"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "No hay artículos pendientes de lectura"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "No hay artículos favoritos"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "No hay artículos"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-"Está a punto de cambiar la cuenta que usa en FeedReader.\n"
-" Esto implica borrar todos los datos locales de su antigua cuenta."
+"Sincronización en marcha. Los articulos aparecerán en cualquier momento."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Cuenta nueva"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "deslizar hacia arriba"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Esperando que termine la sincronización"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Ningún artículo seleccionado."
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "He cambiado de idea"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit falló"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Marcar como leído"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Guardar imagen como"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Eliminar (con los canales)"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Cancelar"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Añadir Etiqueta:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Etiquetas:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "agregar Etiqueta"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr "Ignorar todos los errores TLS de ahora en adelante"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Seleccione primero un servicio"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Por favor, indique un nombre de usuario válido"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Por favor, indique una contraseña válida"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Por favor, indique un URL válido"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Por favor, indique sus detalles de acceso"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Lo siento, ha ocurrido un error."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "El servidor reportó un error de API."
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Su usuario o su contraseña no son correctos."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -629,460 +611,315 @@ msgstr ""
"No hay conexión con el servidor. Revise su conexión a internet y la URL del "
"servidor."
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
"El acceso a la API está desactivado en el servidor. Por favor, pimero "
"actívelo."
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "No está autorizado para acceder la URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "¡No hay disponible un Certificado de Autorización válido!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr "Por favor instale el plugin \"api_feedreader\" en su instancia tt-rss"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Ningún artículo seleccionado."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Adjuntos"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader está limpiando la base de datos.\n"
+"Esto no llevará mucho tiempo."
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Guardar imagen como"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Aspecto"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Internos"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Compartir"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Lista de canales"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Mostrar sólo canales"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Mostrar sólo artículos sin leer"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Ordenar Lista de Canales por"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Recibido"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabéticamente"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Oscuro"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Etiquetar artículo"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Lista de Artículos:"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Imprimir artículo"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Ordenar artículos por"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Compartir artículo"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Fecha"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Eliminar \"%s\""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Lo más reciente primero"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Canal \"%s\" eliminado"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Vista de artículo"
+#: src/DataBaseReadOnly.vala:223
+#, fuzzy
+msgid "Unknown tag"
+msgstr "Canal desconocido"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Predeterminado"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "No hay vista previa disponible"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Primavera"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "No hay texto disponible en este artículo :("
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Medianoche"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "publicado por: %s, "
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergamino"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Guardar"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Abrir en navegador"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Nombre de usuario:"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Tamaño de Fuente"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Contraseña:"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Pequeño"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Nombre de usuario o Contraseña incorrecto"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "esperando"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Grande"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
+"Hola,\n"
+"\n"
+"Mira este interesante artículo que acabo de leer: $URL"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Enorme"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Límite:"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sincronizar:"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Twittear"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Número de artículos"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Twittear a seguidores"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Cada (minutos)"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "ID de Cliente:"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Base de datos:"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Secreto de Cliente:"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Eliminar artículos después de"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Por favor complete la URL."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nunca"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "La URL parece inválida."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 semana"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Por favor complete el ID de Cliente."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 mes"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Por favor complete el Secreto de Cliente."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 meses"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Por favor complete la contraseña."
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funcionalidad adicional:"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Por favor complete el nombre de usuario."
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Captador de contenido"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Algo salió mal."
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Hola,\n"
+"\n"
+"Mira este interesante artículo que acabo de leer: $URL\n"
+"\n"
+"- enviado por FeedReader"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Cuenta nueva"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Autoinicio de FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Abandonar el modo de pantalla completa"
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "¿Dónde se ubican sus canales?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Seleccione el servicio RSS que utilice y acceda a éste para comenzar."
-
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Categoría:"
-
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Agregar"
-
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Archivo OPML:"
-
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Seleccione un archivo OPML"
-
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importar"
-
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Agregar canal"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "A:"
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importar OPML"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Enviar"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Eliminar sólo de \"%s\""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Enviar Email"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Hola, mira este interesante artículo que acabo de leer - enviado por "
+"FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Enviar Telegram"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
+"Información: Necesitará instalar Telegram para que este plugin funcione"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Salir"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Lista de canales"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "URL de freshRSS:"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "Autorización HTTP"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"Por favor inicie sesión en su servidor freshRSS y disfrute usando Feed Reader"
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Por favor inicia sesión en FeedHQ y disfruta usando FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Lista de Artículos:"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Listo"
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Agregando canales"
+
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Nada que leer aquí"
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Marcar artículo como (no)leído"
+msgid "Nextcloud URL:"
+msgstr "URL de OwnCloud:"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+#, fuzzy
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Por favor inicie sesión a tu instancia de ownCloud News y disfrute de "
+"FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Hoy"
-
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Ayer"
-
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Salir"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Acerca de FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "No hay vista previa disponible"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "No hay texto disponible en este artículo :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "publicado por: %s, "
-
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Cliente RSS"
-
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Lea canales de noticias de servicios web"
-
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "feedreader"
-
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "Autoinicio de FeedReader"
-
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categories=Network;Feed;"
-
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Cliente RSS para varios servicios web"
-
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-"FeedReader es un programa diseñado para complementar su cuenta en un lector "
-"web RSS."
-
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Servicios actualmente soportados:"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL de Tiny Tiny RSS:"
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr ""
+"Por favor inicie sesión en su servidor Tiny Tiny RSS y disfrute usando Feed "
+"Reader"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr ""
+"Por favor inicie sesión en the Old Reader y disfrute usando Feed Reader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Por favor inicie sesión en Feedbin para disfrutar de FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Combina todas las ventajas de servicios web como la sincronización entre "
-"todos tus dispositivos con todo lo que esperas de una aplicación de "
-"escritorio moderna: notificaciones, búsqueda y filtros rápidos, etiquetado, "
-"compartir con servicios de lista de lectura como Pocket e Instapaper, atajos "
-"de teclado útiles y una base de datos que mantiene todos tus artículos, por "
-"todo el tiempo que desees."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Ninguno de los %i Artículos en la base de datos concuerda con los filtros "
-#~ "actuales."
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura coincidente "
-#~ "con \"%s\" en el canal \"%s\""
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura en el canal "
-#~ "\"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura coincidente "
-#~ "con \"%s\" en la etiqueta \"%s\""
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura en la "
-#~ "etiqueta \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura coincidente "
-#~ "con \"%s\" en la categoría \"%s\""
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura en la "
-#~ "categoría \"%s\""
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "No se encontró ningún artículo marcado pendiente de lectura coincidente "
-#~ "con \"%s\""
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "No se encontró ningún artículo marcado pendiente de lectura"
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Alternar el artículo seleccionado marcado/desmarcado"
diff --git a/po/et.po b/po/et.po
index 56ff8671..acffb821 100644
--- a/po/et.po
+++ b/po/et.po
@@ -1,497 +1,385 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-03-01 12:36+0000\n"
+"Last-Translator: Rivo Zängov <rivozangov@gmail.com>\n"
+"Language-Team: Estonian "
+"<https://hosted.weblate.org/projects/feedreader/translations/et/>\n"
+"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.20-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Info FeedReaderi kohta"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+msgstr "Logi sisse"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Logi välja"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Uudisvoogude ja kategooriate tõmbamine"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Artiklite tõmbamine"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Lugemata artiklite tõmbamine"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Uued artiklid"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Eile"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Märgi loetuks"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Nimeta ümber"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Eemalda"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Eemalda (koos uudisvoogudega)"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "nimeta ümber"
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "lisa"
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Lisa kontosid"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Üldine"
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Värskenda"
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Otsi"
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Vali järgmine kirje"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Vali eelmine kirje"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Artiklite nimekiri"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr ""
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Kus on sinu uudisvood?"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +404,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/eu.po b/po/eu.po
index 56ff8671..413f5512 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/fa.po b/po/fa.po
index 56ff8671..413f5512 100644
--- a/po/fa.po
+++ b/po/fa.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/fi.po b/po/fi.po
index 7e5330ed..fdbc789a 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: feedreader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"PO-Revision-Date: 2015-11-14 10:23+0000\n"
"Last-Translator: Jiri Grönroos <Unknown>\n"
"Language-Team: Finnish <fi@li.org>\n"
@@ -18,1007 +18,961 @@ msgstr ""
"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
"X-Generator: Launchpad (build 17886)\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Käyttäjätunnus:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Salasana:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Tietoja - Syötteenlukija"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Kirjaudu"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud-osoite:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Kirjaudu ulos"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+#, fuzzy
+msgid "Getting feeds and categories"
+msgstr "Näytä vain lukemattomat artikkelit"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
+#: src/Backend/FeedServer.vala:231
#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "TinyTinyRSS-osoite:"
+msgid "Getting articles"
+msgstr "Uudet artikkelit"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+#, fuzzy
+msgid "Getting starred articles"
+msgstr "Näytä vain vain tähdellä varustetut artikkelit"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+#, fuzzy
+msgid "Getting tagged articles"
+msgstr "Näytä vain vain tähdellä varustetut artikkelit"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+#, fuzzy
+msgid "Getting unread articles"
+msgstr "Näytä vain lukemattomat artikkelit"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Uudet artikkelit"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:27
+#, fuzzy, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "1 uusi artikkeli"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "odottaa"
+#: src/Notification.vala:29
+#, fuzzy, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "%u uutta artikkelia"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+#, fuzzy
+msgid "Mark as read"
+msgstr "Merkitse artikkeli luetuksi/lukemattomaksi"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+#, fuzzy
+msgid "Rename"
+msgstr "Käyttäjätunnus:"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+#, fuzzy
+msgid "rename"
+msgstr "Käyttäjätunnus:"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+#, fuzzy
+msgid "add"
+msgstr "lisää tunniste"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Väärä käyttäjätunnus tai salasana"
+#: src/Widgets/SharePopover.vala:62
+#, fuzzy
+msgid "Add accounts"
+msgstr "Uusi tili"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Lopeta"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+#, fuzzy
+msgid "Feed List"
+msgstr "Syöteluettelo:"
+
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
+#: src/Widgets/ShortcutsWindow.vala:54
#, fuzzy
-msgid "Please fill in the password."
-msgstr "Anna kelvollinen salasana"
+msgid "Article List"
+msgstr "Artikkelilista:"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Anna kelvollinen käyttäjätunnus"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Something went wrong."
-msgstr "Valitettavasti jokin meni vikaan"
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Uudet artikkelit"
+msgid "Toggle reading status of selected article"
+msgstr "1 uusi artikkeli"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:65
+#, fuzzy
+msgid "Toggle marking of selected article"
msgstr "1 uusi artikkeli"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "%u uutta artikkelia"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Näytä vain lukemattomat artikkelit"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Uudet artikkelit"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
+#: src/Widgets/ShortcutsWindow.vala:79
#, fuzzy
-msgid "Getting starred articles"
-msgstr "Näytä vain vain tähdellä varustetut artikkelit"
+msgid "Article View"
+msgstr "Artikkelinäkymä:"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Näytä vain vain tähdellä varustetut artikkelit"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Näytä vain lukemattomat artikkelit"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Missä syötteesi sijaitsevat?"
+
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Valitse käyttämäsi RSS-palvelu ja kirjaudu sisään aloittaaksesi."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Luokittelematon"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/AddPopover.vala:48
+#, fuzzy
+msgid "Category:"
+msgstr "Luokittelematon"
+
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+#, fuzzy
+msgid "Add"
+msgstr "lisää tunniste"
+
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
-msgstr "Uudet artikkelit"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-#, fuzzy
-msgid "Tags"
-msgstr "Tunnisteet:"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr ""
-#: src/Widgets/FeedList.vala:481
-#, fuzzy
-msgid "Categories"
-msgstr "Luokittelematon"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Käyttöliittymä"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Sisäiset"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Syöteluettelo:"
+
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Näytä vain syötteet"
+
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Näytä vain lukemattomat"
+
+#: src/Widgets/SettingsDialog.vala:85
#, fuzzy
-msgid "New Category"
-msgstr "Luokittelematon"
+msgid "Sort Feed List by"
+msgstr "Järjestä syötelista"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Lisää tunniste:"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Vastaanotettu"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Tunnisteet:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Aakkosjärjestyksessä"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "lisää tunniste"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Teema"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-"Syötteenlukija siivoaa tietokantaa.\n"
-"Tämän ei pitäisi kestää kovin kauan."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Synkronointi on meneillään. Artikkelien tulisi ilmestyä näkyviin pian."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Artikkelilista:"
+
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Artikkelien järjestysperuste"
+
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Päiväys"
+
+#: src/Widgets/SettingsDialog.vala:102
#, fuzzy
-msgid "No Articles"
-msgstr "Uudet artikkelit"
+msgid "Oldest first"
+msgstr "Uusin ensin"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Artikkelinäkymä:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Oletus"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Kevät"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Keskiyö"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergamentti"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synkronoi:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Artikkelien lukumäärä"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Tietokanta:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Poista artikkelit viiveellä"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Ei koskaan"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 viikko"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 kuukausi"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 kuukautta"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Lisätoiminnot:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Sisällön noutaja"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+#, fuzzy
+msgid "System Accounts"
+msgstr "Vaihda käyttäjätiliä"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+#, fuzzy
+msgid "FeedReader Accounts"
+msgstr "Syötteenlukija"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Vaihdetaanko tiliä?"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Olet aikeissa vaihtaa syötteenlukijassa käytettävää tiliä.\n"
+" Tämän myötä vanhan tilisi kaikki paikallinen data poistetaan."
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Merkitse artikkeli tähdellä/poista tähti artikkelilta"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Uusi tili"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Merkitse artikkeli luetuksi/lukemattomaksi"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Odotetaan nykyisen synkronoinnin valmistuvan"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Muutin mieleni"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Näytä kaikki artikkelit"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Näytä vain lukemattomat artikkelit"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Näytä vain vain tähdellä varustetut artikkelit"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Lisää tunniste artikkeliin"
-
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Jaa artikkeli"
-
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Jaa artikkeli"
-
-#: src/Widgets/ReaderHeaderbar.vala:157
+#: src/Widgets/ColumnViewHeader.vala:60
#, fuzzy
-msgid "Attachments"
-msgstr "Pergamentti"
-
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+msgid "Update feeds"
msgstr "Päivitä syötteet"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:205
+#: src/Widgets/ColumnViewHeader.vala:75
msgid "Search Articles"
msgstr "Etsi artikkeleja"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
+#: src/Widgets/ColumnViewHeader.vala:101
msgid "Settings"
msgstr "Asetukset"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
-msgid "Rename"
-msgstr "Käyttäjätunnus:"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr ""
+
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
+
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr ""
+
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr ""
+
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:242
#, fuzzy
-msgid "rename"
-msgstr "Käyttäjätunnus:"
+msgid "All Articles"
+msgstr "Uudet artikkelit"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
+#: src/Widgets/FeedList.vala:441
#, fuzzy
-msgid "add"
-msgstr "lisää tunniste"
+msgid "Tags"
+msgstr "Tunnisteet:"
-#: src/Widgets/SharePopover.vala:65
+#: src/Widgets/FeedList.vala:482
#, fuzzy
-msgid "Add accounts"
-msgstr "Uusi tili"
+msgid "Categories"
+msgstr "Luokittelematon"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Vaihdetaanko tiliä?"
+#: src/Widgets/FeedList.vala:487
+#, fuzzy
+msgid "Feeds"
+msgstr "Feedly"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-"Olet aikeissa vaihtaa syötteenlukijassa käytettävää tiliä.\n"
-" Tämän myötä vanhan tilisi kaikki paikallinen data poistetaan."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Uusi tili"
+#: src/Widgets/FeedList.vala:1139
+#, fuzzy
+msgid "New Category"
+msgstr "Luokittelematon"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Odotetaan nykyisen synkronoinnin valmistuvan"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+#, fuzzy
+msgid "No Articles"
+msgstr "Uudet artikkelit"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Muutin mieleni"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+#, fuzzy
+msgid "No unread articles"
+msgstr "Näytä vain lukemattomat artikkelit"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
#, fuzzy
-msgid "Mark as read"
-msgstr "Merkitse artikkeli luetuksi/lukemattomaksi"
+msgid "No starred articles"
+msgstr "Näytä vain vain tähdellä varustetut artikkelit"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+#, fuzzy
+msgid "No articles"
+msgstr "Uudet artikkelit"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Synkronointi on meneillään. Artikkelien tulisi ilmestyä näkyviin pian."
+
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Ei artikkelia valittuna"
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/ArticleView.vala:790
+#, fuzzy
+msgid "Save image as"
+msgstr "Jaa artikkeli"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Lisää tunniste:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Tunnisteet:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "lisää tunniste"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "Syötteenlukija"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+#, fuzzy
+msgid "Ignore all TLS errors from now on"
msgstr "Älä huomioi TLS-virheitä jatkossa"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Valitse palvelu ensin"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Anna kelvollinen käyttäjätunnus"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Anna kelvollinen salasana"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Anna kelvollinen osoite"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Anna kirjautumistietosi"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Valitettavasti jokin meni vikaan"
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Joko käyttäjätunnus tai salasana on väärin."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
"Ei yhteyttä palvelimeen. Tarkista verkkoyhteytesi ja palvelimen osoite!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
"API-käyttö on poistettu käytöstä palvelinpuolella. Salli API-käyttö ensin!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Kelvollista CA-varmennetta ei ole saatavilla!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Ei artikkelia valittuna"
+#: src/Widgets/MediaButton.vala:99
+#, fuzzy
+msgid "Attachments"
+msgstr "Pergamentti"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"Syötteenlukija siivoaa tietokantaa.\n"
+"Tämän ei pitäisi kestää kovin kauan."
-#: src/Widgets/ArticleView.vala:768
+#: src/Widgets/ArticleViewHeader.vala:68
#, fuzzy
-msgid "Save image as"
-msgstr "Jaa artikkeli"
+msgid "Tag article"
+msgstr "Lisää tunniste artikkeliin"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Käyttöliittymä"
+#: src/Widgets/ArticleViewHeader.vala:82
+#, fuzzy
+msgid "Print article"
+msgstr "Artikkelien järjestysperuste"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Sisäiset"
+#: src/Widgets/ArticleViewHeader.vala:93
+#, fuzzy
+msgid "Share article"
+msgstr "Jaa artikkeli"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Syöteluettelo:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Näytä vain syötteet"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Näytä vain lukemattomat"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Järjestä syötelista"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Vastaanotettu"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Aakkosjärjestyksessä"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Esikatselua ei ole saatavilla"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Teema"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Tälle artikkelille ei ole tekstiä tarjolla"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Artikkelilista:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Artikkelien järjestysperuste"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Päiväys"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Uusin ensin"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Artikkelinäkymä:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Oletus"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+#, fuzzy
+msgid "Username:"
+msgstr "Käyttäjätunnus:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Kevät"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Salasana:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Keskiyö"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Väärä käyttäjätunnus tai salasana"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergamentti"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "odottaa"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synkronoi:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Artikkelien lukumäärä"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Tietokanta:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Poista artikkelit viiveellä"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Ei koskaan"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 viikko"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 kuukausi"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 kuukautta"
-
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Lisätoiminnot:"
-
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Sisällön noutaja"
-
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Vaihda käyttäjätiliä"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Syötteenlukija"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Missä syötteesi sijaitsevat?"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Valitse käyttämäsi RSS-palvelu ja kirjaudu sisään aloittaaksesi."
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+#, fuzzy
+msgid "Please fill in the password."
+msgstr "Anna kelvollinen salasana"
-#: src/Widgets/AddPopover.vala:48
+#: plugins/share/Wallabag/WallabagSetup.vala:161
#, fuzzy
-msgid "Category:"
-msgstr "Luokittelematon"
+msgid "Please fill in the username."
+msgstr "Anna kelvollinen käyttäjätunnus"
-#: src/Widgets/AddPopover.vala:51
+#: plugins/share/Wallabag/WallabagSetup.vala:186
#, fuzzy
-msgid "Add"
-msgstr "lisää tunniste"
+msgid "Something went wrong."
+msgstr "Valitettavasti jokin meni vikaan"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Lopeta"
-
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Syöteluettelo:"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Artikkelilista:"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "1 uusi artikkeli"
+msgid "Nextcloud URL:"
+msgstr "OwnCloud-osoite:"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Kirjaudu ulos"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Tietoja - Syötteenlukija"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+#, fuzzy
+msgid "Tiny Tiny RSS URL:"
+msgstr "TinyTinyRSS-osoite:"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Esikatselua ei ole saatavilla"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Tälle artikkelille ei ole tekstiä tarjolla"
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#~ msgid "Mark article (un)starred"
+#~ msgstr "Merkitse artikkeli tähdellä/poista tähti artikkelilta"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr ""
+#~ msgid "Mark article (un)read"
+#~ msgstr "Merkitse artikkeli luetuksi/lukemattomaksi"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
#, fuzzy
-msgid "feedreader"
-msgstr "Syötteenlukija"
+#~ msgid "Save Article as PDF"
+#~ msgstr "Jaa artikkeli"
-#: data/feedreader-autostart.desktop.in:3
#, fuzzy
-msgid "FeedReader Autostart"
-msgstr "Syötteenlukija"
+#~ msgid "Feed-List"
+#~ msgstr "Syöteluettelo:"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#, fuzzy
+#~ msgid "Article-List"
+#~ msgstr "Artikkelilista:"
-#: data/feedreader.appdata.xml.in:7
#, fuzzy
-msgid "RSS client for various webservices"
-msgstr "Työpöytäsovellus useiden RSS-palveluiden käyttöön"
+#~ msgid "feedreader"
+#~ msgstr "Syötteenlukija"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#, fuzzy
+#~ msgid "FeedReader Autostart"
+#~ msgstr "Syötteenlukija"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#, fuzzy
+#~ msgid "RSS client for various webservices"
+#~ msgstr "Työpöytäsovellus useiden RSS-palveluiden käyttöön"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#~ msgid "Tiny Tiny RSS"
+#~ msgstr "Tiny Tiny RSS"
-#: data/feedreader.appdata.xml.in:17
#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
+#~ msgid "feedly"
+#~ msgstr "Feedly"
-#: data/feedreader.appdata.xml.in:18
#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
-
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
-
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "ownCloud"
+#~ msgstr "OwnCloud"
#~ msgid "About"
#~ msgstr "Tietoja"
diff --git a/po/fr.po b/po/fr.po
index dd2e8f42..f6a6d089 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -5,1076 +5,922 @@
# Translators:
# Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>, 2016
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015
-# Florian, 2016
-# Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>, 2016
+# Florian, 2016-2017
+# Jean-Baptiste Holcroft <jean-baptiste@holcroft.fr>, 2016-2017
+# Piexl <pierfroi@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: French (http://www.transifex.com/dev-feedreader/feedreader/"
-"language/fr/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-04-21 13:37+0000\n"
+"Last-Translator: wellinkstein <guilbaud.jeremie@tutanota.com>\n"
+"Language-Team: French <https://hosted.weblate.org/projects/feedreader/"
+"translations/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nom d'utilisateur :"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Mot de passe :"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 3.0-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "À propos de FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Se connecter"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL :"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Déconnexion"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorisation HTTP"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Obtention des flux et catégories"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Obtention des articles"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Obtention des articles importants"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Obtention des articles marqués"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Obtention des articles non lus"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nouveaux articles"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Il y a un nouvel article (%u non lu)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Il y a %u nouveaux articles (%u non lu)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "chargement"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Hier"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Catégorie « %s » supprimée"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Marquer comme lu"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Renommer"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Supprimer"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Supprimer (avec les flux)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "renommer"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "ajouter"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Ajouter compte"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Utilisateur ou mot de passe incorrect"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Général"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL :"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Rafraîchir"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Client RSS"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Rechercher"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Quitter"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Liste des flux"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Choisir le prochain item"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Choisir l'item précédent"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Réduire/Développer les catégories"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Veuillez saisir un mot de passe valide"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Marquer la sélection comme lu"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Veuillez saisir un nom d'utilisateur valide."
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Liste des articles"
+
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Sélectionner l’article suivant/précédent"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Something went wrong."
-msgstr "Désolé, il y a eu un problème."
+msgid "Toggle reading status of selected article"
+msgstr "Modifier le statut de lecture de l’article sélectionné"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nouveaux articles"
+#: src/Widgets/ShortcutsWindow.vala:65
+#, fuzzy
+msgid "Toggle marking of selected article"
+msgstr "Marquer l’article sélectionné comme non lu"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Marquer un article comme (non) lu"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Ouvrir l’URL de l’article sélectionné"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Marquer un article comme (non) lu"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Aller tout en haut/bas"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Voir seulement les articles non lus"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Centrer l’article sélectionné"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Nouveaux articles"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Vue de l'article"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Montrer uniquement les articles importants"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Faire défiler vers le haut/bas"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Montrer uniquement les articles importants"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Ou sont vos flux ?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Voir seulement les articles non lus"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Sélectionner le service de flux RSS que vous utilisez et connectez-vous pour "
+"y accéder."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Non classé"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Supprimer « %s »"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL :"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Étiquette « %s » supprimée "
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Catégorie :"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Flux « %s » supprimé"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Ajouter"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Catégorie « %s » supprimée"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "Fichier OPML :"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Tous les articles"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "Sélectionner un fichier OPML"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Étiquettes"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importer"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Catégories"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Ajouter un flux"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importer un fichier OPML"
+
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interface"
+
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Réglages"
+
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Partager"
+
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr "Liste des flux :"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Nouvelle étiquette"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Ne montrer que les flux"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Nouvelle catégorie"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Montrer uniquement les non lus"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Ajouter une étiquette :"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Trier la Liste des flux par"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Étiquettes :"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Date de réception"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "ajouter une étiquette"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "de A à Z"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader nettoie la base de données.\n"
-"Cela ne devrait pas durer longtemps."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Thème"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
-"La synchronisation est en cours. Les articles devraient apparaître très "
-"prochainement."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "défiler vers le haut"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Foncé"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Nouveaux articles"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "élémentaire"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Aucun article correspondant à « %s » n'a été trouvé dans le flux « %s »"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Liste des articles :"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Aucun article non lu n'a été trouvé dans le flux « %s »"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Classer les articles par"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Aucun article marqué correspondant à « %s » n'a été trouvé dans le flux « %s "
-"»"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Date"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Aucun article marqué n'a été trouvé dans le flux « %s »"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Le plus ancien d'abord"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Aucun article correspondant à « %s » n'a été trouvé dans le flux « %s »"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Affecte uniquement la colonne \"Non lu\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Aucun article n'a été trouvé dans le flux « %s »"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Marquer lu en défilant devant"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Aucun article correspondant à « %s » n'a été trouvé pour l'étiquette « %s »"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Vue article :"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Aucun article n'a été trouvé pour l'étiquette « %s »"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Par défaut"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Aucun article marqué correspondant à « %s » n'a été trouvé pour l'étiquette "
-"« %s »"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Spring"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Aucun article marqué n'a été trouvé pour l'étiquette « %s »"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Midnight"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Aucun article correspondant à « %s » n'a été trouvé pour l'étiquette « %s »"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Parchment"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Aucun article n'a été trouvé pour l'étiquette « %s »"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Police"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Aucun article correspondant à « %s » n'a été trouvé pour la catégorie « %s »"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synchroniser :"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Aucun article n'a été trouvé pour la catégorie « %s »"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Nombre d’articles"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Aucun article marqué correspondant à « %s » n'a été trouvé pour la catégorie "
-"« %s »"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Intervalle en Minutes (0 = OFF)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Aucun article marqué n'a été trouvé pour la catégorie « %s »"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Base de données :"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Aucun article correspondant à « %s » n'a été trouvé pour la catégorie « %s »"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Supprimer les articles après"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Aucun article n'a été trouvé pour la catégorie « %s »"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Jamais"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr "Aucun article correspondant à « %s » n'a été trouvé"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 semaine"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Aucun article non-lu n'a été trouvée"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 mois"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "Aucun article marqué correspondant à « %s » n'a été trouvé"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 mois"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Aucun article marqués n'a été trouvée"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Fonctionnalité additionnelle :"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Aucun article correspondant à « %s » n'a été trouvé"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Agrippeur de contenu"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Aucun article n'a été trouvée"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Télécharger les images"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Marquer un article comme important"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Lecteur média interne"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Marquer un article comme (non) lu"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Comptes systèmes"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Lire l'article en plein écran"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "Comptes FeedReader"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Changer de compte ?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Vous êtes sur le point de modifier le compte utilisé par FeedReader.\n"
+"Cela signifie que toutes les données locales de votre ancien compte vont "
+"être supprimées."
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nouveau compte"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Synchronisation en cours"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "J’ai changé d’avis"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Tout"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Montrer tous les articles"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Non lu"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Voir seulement les articles non lus"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Favoris"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Montrer uniquement les articles importants"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Associer une étiquette à un article"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Mettre à jour les flux"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Partager cet article"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Rechercher des articles"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Partager cet article"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Paramètres"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Pièces jointes"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Lire l’article en plein écran"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Mettre à jour les Flux"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Étiquette « %s » supprimée"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Supprimer ce flux"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Rechercher des articles"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "Copier le lien"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Paramètres"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Supprimer seulement de %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Renommer"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Flux « %s » supprimé"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Supprimer"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Quitter le mode plein écran"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "renommer"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Tous les articles"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "ajouter"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Étiquettes"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nouveau compte"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Catégories"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Changer de compte ?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Flux"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nouvelle étiquette"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nouvelle catégorie"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Aucuns articles"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Aucun article non-lu"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Aucun article favori"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Aucun article"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-"Vous êtes sur le point de modifier le compte utilisé par FeedReader.\n"
-"Cela signifie que toutes les données locales de votre ancien compte vont "
-"être supprimées."
+"La synchronisation est en cours. Les articles devraient apparaître très "
+"prochainement."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nouveau compte"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "défiler vers le haut"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Synchronisation en cours"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Aucun article sélectionné."
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "J'ai changé d'avis"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit a planté"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Marquer comme lu"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Enregistrer l’image"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Supprimer (avec les flux)"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Ajouter une étiquette :"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Étiquettes :"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "ajouter une étiquette"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr "Ignorer toutes les erreurs TLS à partir de maintenant"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
-msgstr "Veuillez d'abord sélectionner un service"
+msgstr "Veuillez d’abord sélectionner un service"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
-msgstr "Veuillez saisir un nom d'utilisateur valide."
+msgstr "Veuillez saisir un nom d’utilisateur valide"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Veuillez saisir un mot de passe valide"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Veuillez entrer une URL valide"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Veuillez entrer vos informations de connexion"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Désolé, il y a eu un problème."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "Le serveur a signalé une erreur d’API."
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
-msgstr "Votre nom d'utilisateur ou votre mot de passe est incorrect."
+msgstr "Votre nom d’utilisateur ou votre mot de passe est incorrect."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
-"Pas de connexion au serveur. Vérifiez votre connexion internet et l'URL du "
+"Pas de connexion au serveur. Vérifiez votre connexion internet et l’URL du "
"serveur !"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-"L'accès par l'API est désactivée sur le serveur. Veuillez l'activer d'abord !"
+"L’accès par l’API est désactivée sur le serveur. Veuillez l’activer d’abord !"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
-msgstr "Vous n'êtes pas autorisé à accéder à l'URL"
+msgstr "Vous n’êtes pas autorisé à accéder à l’URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Pas de certificat CA valide !"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-"Veuillez installer l'extension « api_feedreader » sur votre instance TT-RSS"
+"Veuillez installer l’extension « api_feedreader » sur votre instance TT-RSS !"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Aucun article sélectionné."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Pièces jointes"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader nettoie la base de données.\n"
+"Cela ne devrait pas durer longtemps."
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Enregistrer l'image"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interface"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Réglages"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Partager"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Liste des flux :"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Ne montrer que les flux"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Montrer uniquement les non lus"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Classer la liste des flux par"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Date de réception"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "de A à Z"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Thème"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Foncé"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Liste des articles :"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Classer les articles par"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Date"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Le plus récent en premier"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Vue article :"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Par défaut"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Spring"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Midnight"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Parchment"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Taille de police"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Petit"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Grand"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Gigantesque"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Marquer l'article"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synchroniser :"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Imprimer l'article"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Nombre d'articles"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Partager l'article"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Toutes les (minutes)"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Supprimer « %s »"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Base de données :"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Flux « %s » supprimé"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Supprimer les articles après"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr "Tag inconnu"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Jamais"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Aucun aperçu disponible"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Semaine"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Aucun texte disponible pour cet article :("
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 mois"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "Écrit par : %s, "
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 mois"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Enregistrer"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Ouvrir dans le Navigateur"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Nom d’utilisateur :"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Mot de passe :"
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Fonctionnalité additionnelle :"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Utilisateur ou mot de passe incorrect"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Agrippeur de contenu"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "chargement"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Salut,\n"
+"\n"
+"Regardez cet article intéressent que je viens de lire: $URL"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Nouveau compte"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Démarrage automatique de FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Quitter le mode plein écran"
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Ou sont vos flux ?"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Limite : "
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
-"Sélectionner le service de flux RSS que vous utilisez et connectez-vous pour "
-"y accéder."
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tweeter"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Catégorie :"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Tweeter à ses Followers"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Ajouter"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "Identifiant du client :"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Fichier OPML :"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Secret du client :"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Sélectionner un fichier OPML :"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Veuillez renseigner l’adresse."
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importer"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "L’adresse ne semble pas valide."
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Ajouter un flux"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Veuillez renseigner l’identifiant client."
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importer un fichier OPML"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Veuillez renseigner le secret du client."
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Supprimer seulement de %s"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Veuillez renseigner le mot de passe."
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Veuillez renseigner le nom d’utilisateur."
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Quelque chose s’est mal passé."
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Salut,\n"
+"\n"
+"Regarde cet article intéressant que je viens de lire : $URL\n"
+"\n"
+"- envoyé par FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Quitter"
-
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Liste des flux :"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "À :"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Envoyer"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Écrire un courriel"
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Salut, regarde cet article intéressant, que je viens de lire - envoyé par "
+"FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Liste des articles :"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Envoyer sur Telegram"
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
-msgstr ""
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr "Info: Telegram doit être installé pour que ce plugin fonctionne."
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/share/Telegram/Telegram.vala:81
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Marquer un article comme (non) lu"
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "URL freshRSS :"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "Autorisation HTTP"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"S’il vous plaît, connectez-vous à votre serveur freshRss et profitez de "
+"FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Veuillez vous connecter à FeedHQ et profiter de FeedReader"
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Aujourd'hui"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Fait"
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Hier"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Ajout de flux"
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Déconnexion"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Rien à lire ici."
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "À propos de FeedReader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr "URL Nextcloud :"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
-
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Connectez-vous à votre instance Nextcloud News et profitez de FeedReader"
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Aucun aperçu disponible"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Aucun texte disponible pour cette article :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "Ecrit par : %s"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr "URL invalide"
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Client RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr "Le contenu de l'URL est en HTML, aucun flux disponible"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Lire les flux depuis les services en ligne"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr "Le contenu de l'URL est en HTML et contient plusieurs flux."
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "feedreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr "Impossible de télécharger le contenu de l'URL."
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "Démarrage automatique de FeedReader"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr "Le contenu est un XML invalide."
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Catégories=Réseau;Flux;"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+#, fuzzy
+msgid "Error reaching tt-rss"
+msgstr "Erreur pour atteindre tt-rss"
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Client RSS pour de multiples services Web"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL Tiny Tiny RSS :"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-"FeedReader est un programme conçu pour compléter votre compte de lecture de "
-"flux RSS en mode web."
-
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Services actuellement supportés:"
-
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+"S’il vous plaît, connectez-vous à votre serveur Tiny Tiny RSS et profitez de "
+"FeedReader"
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
-
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "S’il vous plaît, connectez-vous à Old Reader et profitez de FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "S’il vous plaît, connectez-vous à Feedbin et profitez de FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Il complète tous les avantages d'un service en ligne, comme la "
-"synchronisation entre plusieurs périphériques avec tout ce que vous pouvez "
-"attendre d'une application de bureau moderne : notifications système, "
-"recherche efficace et filtres, étiquetage, partage avec services de stockage "
-"d'articles « pour plus tard » comme Pocket et Instapaper, des raccourcis "
-"claviers pratiques et une base de donnée qui stocke vos vieux articles aussi "
-"longtemps que vous le souhaitez."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Aucun des %i articles dans la base de données ne correspond aux filtres "
-#~ "actuels."
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Aucun article non lu et marqué correspondant à « %s » n'a été trouvé dans "
-#~ "le flux « %s »"
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr "Aucun article non lu et marqué n'a été trouvé dans le flux « %s »"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Aucun article non lu et marqué correspondant à « %s » n'a été trouvé pour "
-#~ "l'étiquette « %s »"
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr ""
-#~ "Aucun article non lu et marqué n'a été trouvé pour l'étiquette « %s »"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Aucun article non lu et marqué correspondant à « %s » n'a été trouvé pour "
-#~ "la catégorie « %s »"
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr ""
-#~ "Aucun article non lu et marqué n'a été trouvé pour la catégorie « %s »"
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "Aucun article non lu et marqué correspondant à « %s » n'a été trouvé"
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Aucun article non lu et marqué n'a été trouvé"
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Marquer l’article sélectionné comme non-marqué"
diff --git a/po/fr_CA.po b/po/fr_CA.po
index 56ff8671..413f5512 100644
--- a/po/fr_CA.po
+++ b/po/fr_CA.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/gl.po b/po/gl.po
index 56ff8671..413f5512 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/he.po b/po/he.po
index 56ff8671..413f5512 100644
--- a/po/he.po
+++ b/po/he.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/hi.po b/po/hi.po
index 56ff8671..413f5512 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/hr.po b/po/hr.po
index 56ff8671..413f5512 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/hu.po b/po/hu.po
index 56ff8671..413f5512 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/hy.po b/po/hy.po
index 56ff8671..413f5512 100644
--- a/po/hy.po
+++ b/po/hy.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/id.po b/po/id.po
index f5599aec..cb8ca70f 100644
--- a/po/id.po
+++ b/po/id.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# Mohamad Hasan Al Banna <se7entime@protonmail.com>, 2016
+# Mohamad Hasan Al Banna <se7entime@openmailbox.org>, 2016
+# Nino agus <ninoagoes4@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Indonesian (http://www.transifex.com/dev-feedreader/"
"feedreader/language/id/)\n"
@@ -19,999 +20,875 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nama Pengguna:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Kata Sandi:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Tentang FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr "Masuk log"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "URL OwnCloud:"
+msgstr "Masuk "
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Otorisasi HTTP"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Keluar log"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Artikel Baru"
+
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "menunggu"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Kemarin"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Nama Pengguna ata Kata sandi salah"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Keluar"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Harap masukkan kata sandi yang benar"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Harap masukkan nama pengguna yang benar"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Maaf, ada sesuatu yang salah."
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Artikel Baru"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
+msgstr ""
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Tandai artikel (tidak)terbaca"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr ""
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Tandai artikel (tidak)terbaca"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Tampilkan hanya artikel belum terbaca"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Artikel Baru"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Tampilkan hanya artikel berbintang"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Tampilkan hanya artikel berbintang"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Dimana umpan anda?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Tampilkan hanya artikel belum terbaca"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Harap pilih layanan RSS yang kamu gunakan dan masuk log untuk selanjutnya."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Tidak berkategori"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Semua Artikel"
-
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Tag"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Kategori"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr ""
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Daftar Umpan:"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-#, fuzzy
-msgid "New Category"
-msgstr "Kategori"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Tampilan"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Tambahkan Tag:"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Internal"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Tag:"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "tambahkan Tag"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Daftar Umpan:"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader sedang membersihkan basis data.\n"
-"Ini seharusnya tidak terlalu lama."
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Hanya tampilkan umpan"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
-"Sinkronisasi sedang berjalan. Artikel seharusnya tampil dalam beberapa detik."
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Hanya tampikan belum dibaca"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Artikel Baru"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Diterima"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Sesuai Abjad"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Daftar Artikel:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Urutkan artikel sesuai"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Tanggal"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Tampilan Artikel:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Standar"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Spring"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Midnight"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Parchment"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sinkron:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Jumlah artikel"
+
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Basis data:"
+
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Hapus artikel setelah"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Tidak pernah"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 Minggu"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Bulan"
+
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Bulan"
+
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Kegunaan Tambahan:"
+
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Pengambil Konten"
+
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Ganti Akun?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Anda sedang mengubah akun yang FeedReader ingin gunakan.\n"
+"Ini berarti menghapus semua data lokal dari akun lama anda."
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Tandai artikel (tidak)berbintang"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Akun Baru"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Tandai artikel (tidak)terbaca"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Menunggu sinkronisasi saat ini untuk selesai"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Saya berubah pikiran"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Semua"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Tampilkan semua artikel"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Belum dibaca"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Tampilkan hanya artikel belum terbaca"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Berbintang"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Tampilkan hanya artikel berbintang"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Tag Artikel"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
+
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Cari Artikel"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Bagikan Artikel"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Pengaturan"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Bagikan Artikel"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Parchment"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Perbarui Umpan"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Cari Artikel"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Pengaturan"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
-msgid "Rename"
-msgstr "Nama Pengguna:"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Semua Artikel"
+
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Label"
+
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Kategori"
+
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-#, fuzzy
-msgid "rename"
-msgstr "Nama Pengguna:"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-#, fuzzy
-msgid "add"
-msgstr "tambahkan Tag"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr ""
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Akun Baru"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Ganti Akun?"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-"Anda sedang mengubah akun yang FeedReader ingin gunakan.\n"
-"Ini berarti menghapus semua data lokal dari akun lama anda."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Akun Baru"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Tidak Ada Artikel"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Menunggu sinkronisasi saat ini untuk selesai"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr ""
+"Sinkronisasi sedang berjalan. Artikel seharusnya tampil dalam beberapa detik."
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Saya berubah pikiran"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-#, fuzzy
-msgid "Mark as read"
-msgstr "Tandai artikel (tidak)terbaca"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Tidak ada Artikel yang dipilih."
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Tambahkan Tag:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Tag:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "tambahkan Tag"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Diamkan semua galat tls mulai dari sekarang"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Harap pilih layanan untuk pertama kali"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Harap masukkan nama pengguna yang benar"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Harap masukkan kata sandi yang benar"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Harap masukkan tautan yang benar"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Harap masukkan rincian Masuk log anda"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Maaf, ada sesuatu yang salah."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Baik nama pengguna kamu atau kata sandi tidak benar"
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
"Tidak ada koneksi ke server. Periksa koneksi internet anda dan URL server!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "Akses API dimatikan diserver. Harap aktifkan terlebih dahulu!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Tidak diizinkan untuk mengakses URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Tidak ada sertifikat CA valid yang tersedia!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Tidak ada Artikel yang dipilih."
-
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Bagikan Artikel"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Tampilan"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Internal"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader sedang membersihkan basis data.\n"
+"Ini seharusnya tidak terlalu lama."
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Daftar Umpan:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Hanya tampilkan umpan"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Hanya tampikan belum dibaca"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Urutkan FeedList sesuai"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Diterima"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Sesuai Abjad"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Daftar Artikel:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Urutkan artikel sesuai"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Tanggal"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Tampilan Artikel:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Standar"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Spring"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Midnight"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Parchment"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Ukuran Font"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Kecil"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Besar"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Lebih Besar"
-
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sinkron:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Jumlah artikel"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Setiap (Menit)"
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Basis data:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Hapus artikel setelah"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Tidak pernah"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Minggu"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Bulan"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Bulan"
-
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Fungsionalitas Tambahan:"
-
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Pengambil Konten"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Akun Baru"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Tidak ada Pratinjau yang Tersedia"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Tidak ada Teks yang tersedia untuk artikel ini :("
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Dimana umpan anda?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-"Harap pilih layanan RSS yang kamu gunakan dan masuk log untuk selanjutnya."
-
-#: src/Widgets/AddPopover.vala:48
-#, fuzzy
-msgid "Category:"
-msgstr "Kategori"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Keluar"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Daftar Umpan:"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Daftar Artikel:"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Tandai artikel (tidak)terbaca"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Hari ini"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
+msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Kemarin"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Keluar log"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Tentang FeedReader"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Tidak ada Pratinjau yang Tersedia"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Tidak ada Teks yang tersedia untuk artikel ini :("
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Tidak ada Artikel %i yang sesuai dibasis data untuk penyaringan saat ini"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr ""
diff --git a/po/it.po b/po/it.po
index 22035c70..3fb8c04c 100644
--- a/po/it.po
+++ b/po/it.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# Gianvito Cavasoli <gianvito@gmx.it>, 2016
+# Fabio Iacovino <fabio.iacovino99@gmail.com>, 2016
+# Gianvito Cavasoli <gianvito@gmx.it>, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/dev-feedreader/feedreader/"
"language/it/)\n"
@@ -19,586 +20,585 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nome utente:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Password:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Informazioni su FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Accedi"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "URL OwnCloud:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Esci"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorizzazione HTTP"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Ottenendo notizie e categorie"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Ottenendo articoli"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Ottenendo articoli preferiti"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Ottenendo articoli taggati"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Ottenendo articoli non letti"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nuovi articoli"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "C'è 1 nuovo articolo (%u non letti)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Ci sono %u nuovi articoli (%u non letti)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "attendi"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Ieri"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Categoria «%s» rimossa"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Contrassegna come letto"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Rinomina"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Rimuovi"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Rimuovi (con i notiziari)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "rinomina"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "aggiungi"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Aggiungi account"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Nome utente o password non corretto"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Generale"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Aggiorna"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Client RSS"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Cerca"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Esci"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Riduci/Espandi categorie"
+
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Segna quello attualmente selezionato come letto"
+
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Inserire una password valida"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Selezione il prossimo/precedente articolo"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Inserire un nome utente valido"
+msgid "Toggle reading status of selected article"
+msgstr "Commuta l'articolo selezionato letto/non letto"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Something went wrong."
-msgstr "Qualcosa è andato storto."
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nuovi articoli"
+msgid "Toggle marking of selected article"
+msgstr "Commuta l'articolo selezionato letto/non letto"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Contrassegna l'articolo come letto/non letto"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Apri l URL dell'articolo selezionato"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Contrassegna l'articolo come letto/non letto"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Scorre tutto sotto/sopra"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Mostra solo gli articoli non letti"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Centra l'attuale articolo selezionato"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Nuovi articoli"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Mostra solo gli articoli speciali"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Mostra solo gli articoli speciali"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Dove sono i notiziari?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Mostra solo gli articoli non letti"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Selezionare il servizio RSS che si utilizza e accedere per continuare."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Senza categoria"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Rimuovi «%s»"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Etichetta «%s» rimossa"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categoria:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Notiziario «%s» rimosso"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Aggiungi"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Categoria «%s» rimossa"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Tutti gli articoli"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Etichette"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importa"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Categorie"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Aggiungi notiziario"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Elenco notiziari:"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importa OPML"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Nuova etichetta"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interfaccia"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Nuova categoria"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Interno"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Aggiungi etichetta:"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Condivisione"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Etichette:"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Elenco notiziari:"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "aggiungi etichetta"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Mostrare solo i notiziari"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Mostrare solo i non letti"
+
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-"L'applicazione sta pulendo il database.\n"
-"Potrebbe richiedere molto tempo."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Sincronizzazione in corso. Gli articoli appariranno a momenti."
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Ricezione"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "scorri sopra"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabeticamente"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Nuovi articoli"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Scuro"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "Elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Elenco articoli:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Ordinare articoli"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Visualizzazione articoli:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Predefinito"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Primavera"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Mezzanotte"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergamena"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sincronizzazione:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Numero di articoli"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Database:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Eliminare gli articoli dopo"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Mai"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 settimana"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 mese"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 mesi"
+
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funzionalità aggiuntive:"
+
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Contenuti grabber"
+
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Contrassegna l'articolo come speciale/non speciale"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Lettore multimediale interno"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Contrassegna l'articolo come letto/non letto"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Account di sistema"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader Account"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Cambiare account?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Si sta per cambiare l'account che si vuole che l'applicazione usi.\n"
+" Questo significa eliminare tutti i dati locali del vecchio account."
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nuovo account"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "In attesa che termini l'attuale sincronizzazione"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Ho cambiato idea"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Tutti"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Mostra tutti gli articoli"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Non letti"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Mostra solo gli articoli non letti"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Speciali"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Mostra solo gli articoli speciali"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Etichetta l'articolo"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Condivide l'articolo"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Cerca articoli"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Condivide l'articolo"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Impostazioni"
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Pergamena"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Leggi l'articolo a schermo intero"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Aggiorna notiziari"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Etichetta «%s» rimossa"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Cerca articoli"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Impostazioni"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Rimuovi solo da %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Rinomina"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Notiziario «%s» rimosso"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Rimuovi"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Lascia la modalità schermo intero"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "rinomina"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Tutti gli articoli"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "aggiungi"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Etichette"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nuovo account"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categorie"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Cambiare account?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Notizie"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nuova etichetta"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nuova categoria"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Nessun articolo"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-"Si sta per cambiare l'account che si vuole che l'applicazione usi.\n"
-" Questo significa eliminare tutti i dati locali del vecchio account."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nuovo account"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "In attesa che termini l'attuale sincronizzazione"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Ho cambiato idea"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Sincronizzazione in corso. Gli articoli appariranno a momenti."
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Contrassegna come letto"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "scorri sopra"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Rimuovi (con i notiziari)"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nessun articolo selezionato"
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit si è interrotto"
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Salva immagine come"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Cancella"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Aggiungi etichetta:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Etichette:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "aggiungi etichetta"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Ignorare tutti gli errori TLS da adesso"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Selezionare prima un servizio"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Inserire un nome utente valido"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Inserire una password valida"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Inserire un URL valido"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Inserire i dettagli d'accesso"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Qualcosa è andato storto."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "Il server ha segnalato un errore API."
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Sia il nome utente che la password non sono corretti."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -606,408 +606,304 @@ msgstr ""
"Nessuna connessione al server. Verificare la connessione Internet e l'URL "
"del server."
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "L'accesso API è disabilitato sul server. Abilitarlo."
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Non autorizzato ad accedere all'URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Non è disponibile nessun certificato CA valido."
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
+"Per favore installa il plugin \"api_feedreader\" nella tua instanza tt-rss"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nessun articolo selezionato"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Allegati"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"L'applicazione sta pulendo il database.\n"
+"Potrebbe richiedere molto tempo."
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Condivide l'articolo"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interfaccia"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Interno"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Condivisione"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Elenco notiziari:"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Mostrare solo i notiziari"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Mostrare solo i non letti"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Ordinare l'elenco notiziari"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Rimuovi «%s»"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Ricezione"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Notiziario «%s» rimosso"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabeticamente"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Nessuna anteprima disponibile"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Nessun testo disponibile per questo articolo"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Scuro"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "inserito da: %s, "
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "Elementary"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Salva"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr ""
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Nome utente:"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Elenco articoli:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Password:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Ordinare articoli"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Nome utente o password non corretti"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "attendi"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Ciao,\n"
+"\n"
+"guarda questo interessante articolo che ho letto: $URL"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Visualizzazione articoli:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Predefinito"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Primavera"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Mezzanotte"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergamena"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Dimensione carattere"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Limite: "
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Piccolo"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tweet"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normale"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Tweet ai seguaci"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Grande"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "ID client:"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Enorme"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Chiave segreta client:"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sincronizzazione:"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Compilare il campo URL."
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Numero di articoli"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "L'URL sembra non essere valido."
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Ogni (minuti)"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Compilare il campo ID client."
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Database:"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Compilare il campo chiave segreta client."
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Eliminare gli articoli dopo"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Compilare il campo password."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Mai"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Compilare il campo nome utente."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 settimana"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Qualcosa è andato storto."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 mese"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
+msgstr ""
+"Ciao,\n"
+"\n"
+"guarda questo interessante articolo che ho letto: $URL\n"
+"\n"
+"- inviata tramite FeedReader"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 mesi"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "A:"
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funzionalità aggiuntive:"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Invia"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Accaparrare contenuti"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Scrivi email"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Nuovo account"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Dove sono i notiziari?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Selezionare il servizio RSS che si utilizza e accedere per continuare."
-
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Categoria:"
-
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Aggiungi"
-
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "File OPML:"
-
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Seleziona file OPML"
-
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importa"
-
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Aggiungi notiziario"
-
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importa OPML"
-
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Rimuovi solo da %s"
-
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "URL freshRSS:"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Esci"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "Autorizzazione HTTP"
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Elenco notiziari:"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+msgstr "Accedi al server freshRSS per godere dell'uso di FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Fatto"
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Elenco articoli:"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Contrassegna l'articolo come letto/non letto"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "URL OwnCloud:"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+#, fuzzy
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr "Accedi all'istanza di ownCloud News per godere dell'uso di FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Oggi"
-
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Ieri"
-
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Esci"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Informazioni su FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
-
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Nessuna anteprima disponibile"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Nessun testo disponibile per questo articolo"
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "inserito da: %s, "
-
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Client RSS"
-
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Leggi i notiziari dai servizi web"
-
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "feedreader"
-
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Client RSS per vari servizi web"
-
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-"FeedReader è un programma progettato per complementare un account già "
-"esistente di un lettore RSS basato sul web. "
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Servizi attualmente supportati:"
-
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
-
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL Tiny Tiny RSS:"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr "Accedi al server Tiny Tiny RSS per godere dell'uso di FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Accedi in Old Reader per godere dell'uso di FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Accedi a Feedbin per godere dell'uso di FeedReader"
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Nessuno dei %i articoli nel database corrispondono agli attuali filtri."
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Commuta l'articolo selezionato contrassegnato/non contrassegnato"
diff --git a/po/ja.po b/po/ja.po
index 56ff8671..ba5d3473 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -1,502 +1,394 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-04-02 12:38+0000\n"
+"Last-Translator: Koji Kanao <kk2796@nyu.edu>\n"
+"Language-Team: Japanese <https://hosted.weblate.org/projects/feedreader/"
+"translations/ja/>\n"
+"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.20-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "FeedReaderについて"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+msgstr "ログイン"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "ログアウト"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "フィードとカテゴリの取得"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "記事の取得"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "星をつけた記事を取得"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "タグ付けした記事を取得"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "未読の記事を取得"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "新着記事"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "昨日"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "既読にする"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "リネーム"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "削除"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "フィードも削除する"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "リネーム"
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "追加する"
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "アカウントを追加する"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "一般"
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "リフレッシュ"
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "検索"
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "中止する"
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "フィードリスト"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "次のアイテムを選択する"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "前のアイテムを選択する"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "折りたたむ/開く カテゴリ"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "選択している記事を既読にする"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "記事リスト"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "次/前の記事を選択する"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "選択している記事のURLを開く"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "記事ビュー"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "スクロール アップ/ダウン"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr ""
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "あなたのフィードはどこですか?"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "あなたの利用しているRSSサービスを選択して、ログインしてください。"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "未分類"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr ""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+#, fuzzy
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
-msgstr ""
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "カテゴリー:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "追加"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:65
+#, fuzzy
+msgid "OPML File:"
+msgstr "OPML File:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "OPMLファイルを選択する"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "インポート"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "フィードを追加する"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "OPMLをインポートする"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "インターフェース"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "シェアする"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "フィードリスト:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "フィードのみを表示"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "未読のみ表示"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "フィードリストを並べる"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "受信した"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "アルファベット順"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "テーマ"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+#, fuzzy
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+#, fuzzy
+msgid "Dark"
+msgstr "Dark"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "記事リスト"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "記事を並べ替える"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "日付"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "古いものから"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "デフォルト"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "春"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "真夜中"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "証書"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "同期:"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "記事の数"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "データベース:"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1週間"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1ヶ月"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6ヶ月"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "イメージをダウンロードする"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "システムアカウント"
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "フィードリーダーアカウント"
#: src/Widgets/ResetPage.vala:33
msgid "Change Account?"
-msgstr ""
+msgstr "アカウントを切替?"
#: src/Widgets/ResetPage.vala:37
msgid ""
@@ -506,7 +398,7 @@ msgstr ""
#: src/Widgets/ResetPage.vala:41
msgid "New account"
-msgstr ""
+msgstr "新規アカウント"
#: src/Widgets/ResetPage.vala:44
msgid "Waiting for current sync to finish"
@@ -516,451 +408,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
+msgstr "全ての記事を表示"
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
+msgstr "未読"
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
+msgstr "未読記事のみ表示"
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
+msgstr "星付き"
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
+msgstr "星付き記事のみ表示"
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "フィードを更新する"
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "記事を検索"
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "セッティング"
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "フィードを削除する"
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
-msgstr ""
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "URLをコピーする"
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "すべての記事"
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr ""
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "タグ"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr ""
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "カテゴリ"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr ""
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "フィード"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "新しいタグ"
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr ""
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "新規カテゴリー"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "未読記事なし"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "星付き記事なし"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "スクロールアップ"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr ""
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "選択済み記事なし"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr ""
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "画像として保存する"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr ""
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "キャンセル"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr ""
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "タグ追加:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr ""
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "タグ:"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr ""
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "タグ追加"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
+msgstr "フィードリーダー"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr ""
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "全てのTLSを無視する"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr ""
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
+msgstr "最初にサービスを選択してください"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr ""
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr "正しいユーザー名を入力してください"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr ""
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
+msgstr "正しいパスワードを入力してください"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr ""
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
+msgstr "正しいURLを入力してください"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr ""
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr "ログイン詳細を入力してください"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr ""
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
+msgstr "問題があります"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr ""
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
+msgstr "サーバーがAPIエラーを報告しました。"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr ""
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
+msgstr "あなたのユーザー名もしくはパスワードが正しくありません。"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
+msgstr "サーバーとの接続に失敗しました。インターネットへの接続とサーバーのURLを確認してください!"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ka.po b/po/ka.po
index 56ff8671..413f5512 100644
--- a/po/ka.po
+++ b/po/ka.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ko.po b/po/ko.po
index 56ff8671..0bd4ae04 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -1,966 +1,905 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
msgid ""
msgstr ""
+"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
+"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
+"Language-Team: Korean (http://www.transifex.com/dev-feedreader/feedreader/"
+"language/ko/)\n"
+"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "피드리더 소개"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr ""
+msgstr "로그인"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "로그아웃"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "피드와 카테고리 가져오기"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "기사 가져오기"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "별표 한 기사 가져오기"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "태그 한 기사 가져오기"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "안 읽은 기사 가져오기"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "새 기사"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "새 기사가 1개 있습니다 (안 읽은 기사 %u개)"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "새 기사가 %u개 있습니다 (안 읽은 기사 %u개)"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "어제"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "\"%s\" 카테고리는 지워졌습니다"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "읽음으로 표시"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "이름 바꾸기"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "제거하기"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "제거하기 (피드 포함)"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "이름 바꾸기"
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "추가"
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "계정 추가"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "일반"
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "새로 고침"
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "검색"
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "끝내기"
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "피드 목록"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "새 항목 선택"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "이전 항목 선택"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "카테고리 접기/펼치기"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "현재 선택 항목 읽음으로 표시"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "기사 목록"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "다음/이전 기사 선택"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:64
+#, fuzzy
+msgid "Toggle reading status of selected article"
+msgstr "선택한 기사 안 읽음/읽음 표시"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:65
+#, fuzzy
+msgid "Toggle marking of selected article"
+msgstr "선택한 기사 안 읽음/읽음 표시"
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "선택한 기사의 URL 열기"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "모든 방향으로 위/아래 스크롤하기"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "현재 선택한 기사를 가운데 두기"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "기사 보기"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "위/아래로 스크롤하기"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr ""
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "피드를 만드셨나요?"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "사용하실 RSS 서비스를 고르신 후 로그인해서 이용하시면 됩니다."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "카테고리에 없는 피드"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr ""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
-msgstr ""
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "카테고리:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "추가"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "가져오기"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "피드 추가"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "OPML 가져오기"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "인터페이스"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "내부"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "공유"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "피드 목록:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "피드만 보이기"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "안 읽은 것만 보이기"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "받은 순으로"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "알파벳 순으로"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "테마"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "어두운 테마"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "기사 목록:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "기사 정력 방식"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "날짜"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "옛 것부터"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "\"안 읽음\" 에만 적용"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "지난 스크롤로 읽음 표시"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "기사 보기:"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "기본"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "봄"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "한 밤중"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "양피지"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "동기화:"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "기사 수"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "데이터 베이스:"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "기사 지우기"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "안 지움"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 주일 마다"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 개월 마다"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 개월 마다"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "추가 기능:"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "콘텐츠 그래버"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "내부 미디어 플레이어"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "시스템 계정"
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "피드리더 계정"
#: src/Widgets/ResetPage.vala:33
msgid "Change Account?"
-msgstr ""
+msgstr "계정을 바꾸실 건가요?"
#: src/Widgets/ResetPage.vala:37
msgid ""
"You are about to change the account you want FeedReader to use.\n"
" This means deleting all local data of your old account."
msgstr ""
+"피드리더에 사용하는 계정을 바꾸려 하고 계십니다.\n"
+"진행하시면 이전에 사용하시던 계정의 모든 데이터를 지우게 됩니다."
#: src/Widgets/ResetPage.vala:41
msgid "New account"
-msgstr ""
+msgstr "새 계정"
#: src/Widgets/ResetPage.vala:44
msgid "Waiting for current sync to finish"
-msgstr ""
+msgstr "사용 중인 동기화 연결을 해제하고 있습니다"
#: src/Widgets/ResetPage.vala:54
msgid "I changed my mind"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr ""
+msgstr "생각이 바뀌었어요"
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
+msgstr "모두"
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
+msgstr "모든 기사 보이기"
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
+msgstr "안 읽음"
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
+msgstr "안 읽은 기사만 보이기"
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
+msgstr "별표 함"
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
+msgstr "별표 한 기사만 보이기"
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "피드 업데이트"
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "기사 검색"
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "설정"
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "전체 화면으로 기사 보기"
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
-msgstr ""
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "\"%s\" 태그를 지웠습니다"
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "피드 제거"
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr ""
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "%s 에서만 지웁니다"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "\"%s\" 피드를 지웠습니다"
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr ""
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "전체 화면 모드에서 나오기"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr ""
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "모든 기사"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr ""
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "태그한 기사"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "카테고리"
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr ""
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "피드"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr ""
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "새 태그"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr ""
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "새 카테고리"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "기사 없음"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "안 읽은 기사 없음"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "별표 한 기사 없음"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "기사 없음"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "동기화하고 있습니다. 기사가 곧 보일 겁니다."
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "위로 스크롤"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr ""
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "선택한 기사 없음."
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr ""
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit이 다운되었습니다"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr ""
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "다른 이름으로 이미지 저장하기"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr ""
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "취소"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr ""
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "태그 추가:"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr ""
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "태그:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr ""
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "태그 추가"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr ""
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
+msgstr "피드리더"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr ""
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "이제 부터는 모든 TLS오류를 건너뜁니다"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr ""
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
+msgstr "서비스를 먼저 선택해주세요"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr ""
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr "올바른 사용자 계정으로 입력해주세요"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr ""
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
+msgstr "올바른 비밀번호를 입력해주세요"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr ""
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
+msgstr "올바른 URL을 입력해주세요"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr ""
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr "자세한 로그인 정보를 입력해주세요"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr ""
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
+msgstr "죄송합니다만, 작업이 제대로 마무리되고 있지 않네요."
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
+msgstr "서버에서 API 오류를 알려왔습니다."
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr ""
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
+msgstr "사용자 계정과 비밀 번호가 맞지 않습니다."
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr ""
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
+msgstr "서버에 연결되어 있지 않습니다. 인터넷 연결과 서버 URL을 확인해 주세요!"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
+msgstr "서버에서 API 접근을 차단했습니다. 우선 접근할 수 있도록 해주세요."
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr ""
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
+msgstr "URL에 접근할 수 있는 권한이 없습니다"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr ""
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
+msgstr "올바른 인증 절차를 이용할 수 없습니다!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr ""
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+msgstr "먼저 \"api_feedreader\" 플러그인을 tt-rss 인스턴스에 설치해주세요!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr ""
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "첨부 파일"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"피드리더의 데이터 베이스를 청소하고 있습니다.\n"
+"오래 걸리진 않을 거예요."
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "기사 태그하기"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "기사 출력하기"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "기사 공유하기"
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "\"%s\" 제거하기"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "\"%s\" 피드를 지웠습니다"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
+#: src/DataBaseReadOnly.vala:223
+#, fuzzy
+msgid "Unknown tag"
+msgstr "항목에 없는 피드"
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr ""
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "미리보기 없음"
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "이 기사에는 아쉽게도 텍스트가 없습니다"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr ""
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "포스트 by: %s,"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr ""
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "저장"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "브라우저에서 열기"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "사용자 계정:"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "비밀번호:"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "사용자 계정이나 비밀번호가 맞지 않습니다"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr ""
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "기다리고 있습니다"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"안녕하세요,\n"
+"\n"
+"제가 읽은 기사 하나 소개해 드릴게요 : $URL"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "한계:"
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "트윗"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "팔로워들에게 트윗하기"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "클라이언트 ID:"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "클라이언트 시크릿:"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "URL을 채워주세요."
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "URL이 맞지 않는 것 같습니다."
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "클라이언트 ID를 채워주세요."
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "클라이언트 시크릿을 채워주세요."
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "비밀번호를 채워주세요."
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "사용자 계정을 채워주세요."
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "오류가 있나 봅니다."
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"안녕하세요,\n"
+"\n"
+"제가 읽은 기사 하나 소개해 드릴게요: $URL\n"
+"\n"
+"-보내는이 피드리더"
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "받는 사람:"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "보내기"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "이메일 쓰기"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
+msgstr "안녕하세요, 제가 읽은 기사 하나 소개해 드릴게요 - 보내는이 피드리더"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "텔레그램으로 보내기"
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr ""
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr "정보: 이 플러그인을 이용하시려면 텔레그램을 설치하셔야 합니다."
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr ""
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "텔레그램"
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS URL:"
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP 인증"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+msgstr "freshRSS에 로그인하신 후에 피드리더를 즐겨주세요"
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "FeedHQ에 로그인하신 후에 피드리더를 즐겨주세요"
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "마쳤습니다"
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "피드를 추가하고 있습니다"
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr ""
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "읽을 내용이 없습니다."
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+#, fuzzy
+msgid "Nextcloud URL:"
+msgstr "OwnCloud URL:"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+#, fuzzy
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr "ownCloud 뉴스 인스턴스에 로그인하신 후에 피드리더를 즐겨주세요"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr ""
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS URL:"
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr ""
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr "Tiny Tiny RSS 서버에 로그인하신 후에 피드리더를 즐겨주세요"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr ""
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Old Reader에 로그인하신 후에 피드리더를 즐겨주세요"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Feedbin에 로그인하신 후에 피드리더를 즐겨주세요"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "선택한 기사 표시 안 함/표시함 표시"
diff --git a/po/ky.po b/po/ky.po
index 56ff8671..413f5512 100644
--- a/po/ky.po
+++ b/po/ky.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/lb.po b/po/lb.po
index 56ff8671..413f5512 100644
--- a/po/lb.po
+++ b/po/lb.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/lo.po b/po/lo.po
index 56ff8671..413f5512 100644
--- a/po/lo.po
+++ b/po/lo.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/lt.po b/po/lt.po
index 56ff8671..2c1c90b4 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -1,966 +1,916 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Moo, 2017
msgid ""
msgstr ""
+"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-02-28 00:32+0000\n"
+"Last-Translator: Moo <hazap@hotmail.com>\n"
+"Language-Team: Lithuanian "
+"<https://hosted.weblate.org/projects/feedreader/translations/lt/>\n"
+"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > "
+"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? "
+"1 : 2);\n"
+"X-Generator: Weblate 2.20-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Apie FeedReader"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr ""
+msgstr "Prisijungti"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Atsijungti"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Gaunami kanalai ir kategorijos"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Gaunami straipsniai"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Gaunami žvaigždute pažymėti straipsniai"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Gaunami pažymėti straipsniai"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Gaunami neskaityti straipsniai"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nauji straipsniai"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Yra 1 naujas straipsnis (%u neskaitytų)"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Yra %u nauji straipsniai(-ių) (%u neskaitytų)"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Vakar"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Kategorija \"%s\" pašalinta"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Žymėti kaip skaitytą"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Pervadinti"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Šalinti"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Šalinti (su kanalais)"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "pervadinti"
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "pridėti"
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Pridėti paskyras"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Bendra"
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Įkelti iš naujo"
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Ieškoti"
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Išeiti"
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Kanalų sąrašas"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Pasirinkti kitą elementą"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Pasirinkti ankstesnį elementą"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Suskleisti/Išskleisti kategorijas"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Žymėti šiuo metu pasirinktą kaip skaitytą"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Straipsnių sąrašas"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Pasirinkti ankstesnį/kitą straipsnį"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr "Perjungti pasirinkto straipsnio skaitymo būseną"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
+msgstr "Perjungti pasirinkto straipsnio žymėjimą"
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Atverti pasirinkto straipsnio URL"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Slinkti į patį viršų/apačią"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Centruoti šiuo metu pasirinktą straipsnį"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Straipsnio rodinys"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Slinkti aukštyn/žemyn"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr ""
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Kur yra jūsų kanalai?"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Norėdami tęsti, pasirinkite naudojamą RSS tarnybą ir prisijunkite."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Be kategorijos"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr ""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
-msgstr ""
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Kategorija:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Pridėti"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "OPML failas:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "Pasirinkti OPML failą"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importuoti"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Pridėti kanalą"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importuoti OPML"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Sąsaja"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Vidus"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Dalinimasis"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Kanalų sąrašas:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Rodyti tik kanalus"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Rodyti tik neskaitytus"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Rikiuoti kanalų sąrašą pagal"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Gauta"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Abėcėlė"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Tamsi"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Straipsnių sąrašas:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Rikiuoti straipsnius pagal"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Iš pradžių, seniausi"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Įtakoja tik stulpelį \"Neskaityti\""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Praslinkus, žymėti kaip skaitytus"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Straipsnio rodinys:"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Numatytasis"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Pavasaris"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Vidurnaktis"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergamentas"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Šriftas"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sinchronizavimas:"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Straipsnių skaičius"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Intervalas, minutėmis (0 = IŠJUNGTA)"
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Duomenų bazė:"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Ištrinti straipsnius po"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Niekada"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 savaitė"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 mėnesis"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 mėnesiai"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Papildomas funkcionalumas:"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Turinio glemžikas"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Atsisiųsti paveikslus"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Vidinis medijos grotuvas"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Sistemos paskyros"
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader paskyros"
#: src/Widgets/ResetPage.vala:33
msgid "Change Account?"
-msgstr ""
+msgstr "Pakeisti paskyrą?"
#: src/Widgets/ResetPage.vala:37
msgid ""
"You are about to change the account you want FeedReader to use.\n"
" This means deleting all local data of your old account."
msgstr ""
+"Jūs ketinate pakeisti paskyrą, kurią naudos FeedReader.\n"
+" Tai reiškia, kad bus ištrinti visi jūsų senos paskyros vietiniai duomenys."
#: src/Widgets/ResetPage.vala:41
msgid "New account"
-msgstr ""
+msgstr "Nauja paskyra"
#: src/Widgets/ResetPage.vala:44
msgid "Waiting for current sync to finish"
-msgstr ""
+msgstr "Laukiama kol bus užbaigtas esamas sinchronizavimas"
#: src/Widgets/ResetPage.vala:54
msgid "I changed my mind"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
+msgstr "Aš persigalvojau"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
+msgstr "Visi"
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
+msgstr "Rodyti visus straipsnius"
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
+msgstr "Neskaityti"
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
+msgstr "Rodyti tik neskaitytus straipsnius"
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
+msgstr "Pažymėti žvaigždute"
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
+msgstr "Rodyti tik žvaigždute pažymėtus straipsnius"
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Atnaujinti kanalus"
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Ieškoti straipsnius"
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Nustatymai"
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Skaityti straipsnį viso ekrano veiksenoje"
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
-msgstr ""
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Žymė \"%s\" pašalinta"
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Šalinti kanalą"
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr ""
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "Kopijuoti URL"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr ""
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Šalinti tik iš %s"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr "Kanalas pašalintas: %s"
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr ""
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Išeiti iš viso ekrano veiksenos"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr ""
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Visi straipsniai"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr ""
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Žymės"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Kategorijos"
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr ""
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Kanalai"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr ""
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nauja žymė"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr ""
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nauja kategorija"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Nėra straipsnių"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Nėra neskaitytų straipsnių"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Nėra žvaigždute pažymėtų straipsnių"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Nėra straipsnių"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
+"Sinchronizavimas yra eigoje. Straipsniai turėtų pasirodyti bet kuriuo metu."
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "slinkti aukštyn"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr ""
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nepasirinktas joks straipsnis."
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr ""
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit užstrigo"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr ""
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Įrašyti paveikslą kaip"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr ""
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Atsisakyti"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr ""
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Pridėti žymę:"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr ""
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Žymės:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr ""
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "pridėti žymę"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr ""
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
+msgstr "FeedReader"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr ""
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "Nuo šiol, nepaisyti visų TLS klaidų"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr ""
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
+msgstr "Prašome, iš pradžių, pasirinkti tarnybą"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr ""
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr "Prašome įvesti teisingą naudotojo vardą"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr ""
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
+msgstr "Prašome įvesti teisingą slaptažodį"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr ""
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
+msgstr "Prašome įvesti teisingą URL"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr ""
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr "Prašome įvesti savo prisijungimo informaciją"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr ""
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
+msgstr "Atleiskite, kažkas nutiko."
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
+msgstr "Serveris pranešė apie API klaidą."
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr ""
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
+msgstr "Jūsų naudotojo vardas arba slaptažodis yra neteisingas."
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
+"Nėra ryšio su serveriu. Patikrinkite savo interneto ryšį ir serverio URL!"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
+msgstr "API prieiga serveryje yra išjungta. Prašome, iš pradžių, ją įjungti!"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr ""
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
+msgstr "Nesuteikta teisių URL prieigai"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr ""
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
+msgstr "Neprieinamas joks teisingas liudijimų įstaigos liudijimas!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr ""
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+msgstr "Prašome savo tt-rss egzemplioriuje įdiegti \"api_feedreader\" įskiepį!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr ""
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Priedai"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader išvalo duomenų bazę.\n"
+"Tai neturėtų ilgai užtrukti."
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Pridėti straipsniui žymę"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Spausdinti straipsnį"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Dalintis straipsniu"
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Šalinti \"%s\""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Kanalas \"%s\" pašalintas"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr "Nežinoma žymė"
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr ""
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Peržiūra neprieinama"
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Šiam straipsniui tekstas neprieinamas :("
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr ""
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "paskelbė: %s, "
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr ""
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Įrašyti"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Atverti naršyklėje"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Naudotojo vardas:"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Slaptažodis:"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Neteisingas naudotojo vardas ar slaptažodis"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr ""
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "laukiama"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Labas,\n"
+"\n"
+"Pasižiūrėk šį įdomų straipsnį, kurį ką perskaičiau: $URL"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Riba: "
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tauškalas"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Siųsti tauškalą sekėjams"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "Kliento ID:"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Kliento paslaptis:"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Prašome užpildyti URL."
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "Atrodo, kad URL yra neteisingas."
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Prašome užpildyti kliento ID."
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Prašome užpildyti kliento paslaptį."
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Prašome užpildyti slaptažodį."
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Prašome užpildyti naudotojo vardą."
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Kažkas nutiko."
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Labas,\n"
+"\n"
+"Pasižiūrėk šį įdomų straipsnį, kurį ką perskaičiau: $URL\n"
+"\n"
+"- išsiųsta per FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Kam:"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Siųsti"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Rašyti el. laišką"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Labas, pasižiūrėk šį įdomų straipsnį, kurį ką tik perskaičiau - išsiųsta per "
+"FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Siųsti Telegram"
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
+"Informacija: Tam, kad šis įskiepis veiktų, reikės įdiegti programą Telegram."
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr ""
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS URL:"
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP prieigos teisių suteikimas"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"Prašome prisijungti prie savo freshRSS serverio ir mėgautis, naudojantis "
+"FeedReader"
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Prašome prisijungti prie FeedHQ ir mėgautis, naudojantis FeedReader"
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Atlikta"
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Pridedami kanalai"
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr ""
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Čia nėra ką skaityti."
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr "Nextcloud URL:"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Prašome prisijungti prie savo Nextcloud naujienų egzemplioriaus ir mėgautis, "
+"naudojantis FeedReader"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr "Neteisingas URL"
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr "URL turinys yra HTML, neprieinami jokie kanalai"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr "URL turinys yra HTML, kuriame yra keletas kanalų."
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr "Nepavyko atsisiųsti URL turinio."
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr "Turinys yra neteisingas XML."
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr "Klaida, gaunant prieigą prie tt-rss"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr ""
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS URL:"
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
+"Prašome prisijungti prie savo Tiny Tiny RSS serverio ir mėgautis, "
+"naudojantis FeedReader"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
+"Prašome prisijungti prie Old Reader ir mėgautis, naudojantis FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Norint mėgautis FeedReader naudojimusi, prašome prisijungti"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Perjungti pasirinkto straipsnio būseną \"pažymėtas/nepažymėtas\""
diff --git a/po/lv.po b/po/lv.po
index 56ff8671..413f5512 100644
--- a/po/lv.po
+++ b/po/lv.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/meson.build b/po/meson.build
new file mode 100644
index 00000000..e9b77d79
--- /dev/null
+++ b/po/meson.build
@@ -0,0 +1 @@
+i18n.gettext(meson.project_name(), preset: 'glib')
diff --git a/po/ml.po b/po/ml.po
index 56ff8671..413f5512 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/mr.po b/po/mr.po
index 56ff8671..413f5512 100644
--- a/po/mr.po
+++ b/po/mr.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ms.po b/po/ms.po
index 56ff8671..413f5512 100644
--- a/po/ms.po
+++ b/po/ms.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/nb.po b/po/nb.po
index d9e0e564..c415bc1e 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -1,1068 +1,907 @@
-# Norwegian Bokmal translation for feedreader
-# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
-# This file is distributed under the same license as the feedreader package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014
+# Martin Myrvold <myrvold.martin@gmail.com>, 2017
msgid ""
msgstr ""
-"Project-Id-Version: feedreader\n"
+"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2015-10-05 17:35+0000\n"
-"Last-Translator: Harald H. <haarektrans@gmail.com>\n"
-"Language-Team: Norwegian Bokmal <nb@li.org>\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-04-28 18:39+0000\n"
+"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
+"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
+"feedreader/translations/nb/>\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
-"X-Generator: Launchpad (build 17886)\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Brukernavn:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Passord:"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.0-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Om FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Logg inn"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "TinyTinyRSS URL:"
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "venter"
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
-
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Brukernavn eller passord er feil"
-
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
-
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Angi et gyldig passord"
-
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Angi et gyldig brukernavn"
-
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Beklager, noe gikk galt."
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nye artikler"
-
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Det er 1 ny artikkel"
-
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Det er %u nye artikler"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Logg ut"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
msgid "Getting feeds and categories"
-msgstr "Vis kun uleste artikler"
+msgstr "Henter feeds og kategorier"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
+#: src/Backend/FeedServer.vala:231
msgid "Getting articles"
-msgstr "Nye artikler"
+msgstr "Henter artikler"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
+#: src/Backend/FeedServer.vala:311
msgid "Getting starred articles"
-msgstr "Vis kun stjernemerkede artikler"
+msgstr "Henter stjernemerkede artikler"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
+#: src/Backend/FeedServer.vala:318
msgid "Getting tagged articles"
-msgstr "Vis kun stjernemerkede artikler"
+msgstr "Henter merkte artikler"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
+#: src/Backend/FeedServer.vala:336
msgid "Getting unread articles"
-msgstr "Vis kun uleste artikler"
-
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Ukategorisert"
-
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr ""
+msgstr "Henter uleste artikler"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
-
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr "Nye artikler"
-#: src/Widgets/FeedList.vala:433
-#, fuzzy
-msgid "Tags"
-msgstr "Merkelapper:"
-
-#: src/Widgets/FeedList.vala:481
-#, fuzzy
-msgid "Categories"
-msgstr "Ukategorisert"
-
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
-
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr ""
-
-#: src/Widgets/FeedList.vala:1129
-#, fuzzy
-msgid "New Category"
-msgstr "Ukategorisert"
-
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Legg til merkelapp:"
-
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Merkelapper:"
-
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "legg til merkelapp"
-
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader rengjør databasen.\n"
-"Dette burde ikke ta for lang tid."
-
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Synkronisering pågår. Artiklene bør vises ganske snart."
-
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Nye artikler"
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
+#: src/Notification.vala:27
#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+msgid "There is 1 new article (%u unread)"
+msgstr "Det er 1 ny artikkel (%u ulest)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
+#: src/Notification.vala:29
#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+msgid "There are %u new articles (%u unread)"
+msgstr "Det er %u nye artikler (%u uleste)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "I går"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Merk eller fjern stjerne fra artikkel"
-
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Merk artikkel som (u)lest"
-
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
-msgstr "Vis alle artikler"
-
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
-msgstr "Vis kun uleste artikler"
-
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
-msgstr "Vis kun stjernemerkede artikler"
-
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Merk artikkel"
-
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Del artikkel"
-
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Del artikkel"
-
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Pergament"
-
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Oppdater nyhetskilder"
-
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
-
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Søk artikler"
+msgid "Category \"%s\" removed"
+msgstr "Kategorien \"%s\" er fjernet"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Innstillinger"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Merk som lest"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
msgid "Rename"
-msgstr "Brukernavn:"
+msgstr "Endre navn"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
msgid "Remove"
-msgstr ""
+msgstr "Fjern"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-#, fuzzy
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Fjern (med feed)"
+
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
msgid "rename"
-msgstr "Brukernavn:"
+msgstr "endre navn"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-#, fuzzy
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
msgid "add"
-msgstr "legg til merkelapp"
+msgstr "legg til"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
+#: src/Widgets/SharePopover.vala:62
msgid "Add accounts"
-msgstr "Ny konto"
+msgstr "Legg til kontoer"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Endre konto?"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Generellt"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
-msgstr ""
-"Du er i ferd med å endre kontoen som du vil at FeedReader skal bruke.\n"
-"Dette innebærer å slette alle lokale data fra den gamle kontoen."
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Last inn på nytt"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Ny konto"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Søk"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Venter på at pågående synkronisering skal fullføre"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Avslutt"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Jeg har ombestemt meg"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Feed-liste"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-#, fuzzy
-msgid "Mark as read"
-msgstr "Merk artikkel som (u)lest"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Velg neste element"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Velg forrige element"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
-msgstr "FeedReader"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Kollaps/utvid kategorier"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Merk den valgte som lest"
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
-msgstr "Velg først en tjeneste"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Artikkel-liste"
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
-msgstr "Angi et gyldig brukernavn"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Velg neste/forrige artikkel"
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
-msgstr "Angi et gyldig passord"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr "Veksle lesetilstand for artikkelen"
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
-msgstr "Angi en gyldig nettadresse"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
+msgstr "Veksle markering av valgt artikkel"
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
-msgstr "Angi dine innloggingsdetaljer"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Åpne nettadressen tilhørende valgt adresse"
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
-msgstr "Beklager, noe gikk galt."
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Rull hele veien ned/opp"
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Sentrer valgt artikkel"
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
-msgstr "Enten er ditt brukernavn eller passord feil."
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Artikkelvisning"
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
-msgstr ""
-"Ingen forbindelse til tjeneren. Kontroller internettforbindelsen din og "
-"lenken til tjeneren."
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Rull opp/ned"
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
-msgstr "API-tilgang er deaktivert på tjeneren. Vennligst aktiver dette først!"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Hvor er dine nyhetskilder?"
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
-msgstr ""
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Velg RSS-tjenesten du bruker og logg inn for å komme i gang."
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
-msgstr "Ingen gyldig CA-sertifikat tilgjengelig!"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Ukategorisert"
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr ""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Ingen artikkel valgt."
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Kategori:"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Legg til"
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Del artikkel"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "OPML-fil:"
+
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "Velg OPML-fil"
+
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importer"
+
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Legg til feed"
+
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importer OPML"
-#: src/Widgets/SettingsDialog.vala:38
+#: src/Widgets/SettingsDialog.vala:48
msgid "Interface"
msgstr "Grensesnitt"
-#: src/Widgets/SettingsDialog.vala:39
+#: src/Widgets/SettingsDialog.vala:49
msgid "Internals"
msgstr "Interne"
-#: src/Widgets/SettingsDialog.vala:40
+#: src/Widgets/SettingsDialog.vala:50
msgid "Share"
-msgstr ""
+msgstr "Del"
-#: src/Widgets/SettingsDialog.vala:59
+#: src/Widgets/SettingsDialog.vala:71
msgid "Feed List:"
msgstr "Nyhetsliste:"
-#: src/Widgets/SettingsDialog.vala:61
+#: src/Widgets/SettingsDialog.vala:73
msgid "Only show feeds"
msgstr "Vis kun nyhetskilder"
-#: src/Widgets/SettingsDialog.vala:68
+#: src/Widgets/SettingsDialog.vala:80
msgid "Only show unread"
msgstr "Vis kun uleste"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Sorter nyhetsliste etter"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Sorter informasjonskanalsliste etter"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
msgid "Received"
msgstr "Mottatt"
-#: src/Widgets/SettingsDialog.vala:73
+#: src/Widgets/SettingsDialog.vala:85
msgid "Alphabetically"
msgstr "Alfabetisk"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
msgid "Theme"
msgstr "Utseende"
-#: src/Widgets/SettingsDialog.vala:78
+#: src/Widgets/SettingsDialog.vala:90
msgid "Gtk+"
-msgstr ""
+msgstr "Gtk+"
-#: src/Widgets/SettingsDialog.vala:78
+#: src/Widgets/SettingsDialog.vala:90
msgid "Dark"
-msgstr ""
+msgstr "Mørk"
-#: src/Widgets/SettingsDialog.vala:78
+#: src/Widgets/SettingsDialog.vala:90
msgid "elementary"
-msgstr ""
+msgstr "grunnleggende"
-#: src/Widgets/SettingsDialog.vala:83
+#: src/Widgets/SettingsDialog.vala:95
msgid "Article List:"
msgstr "Artikkelliste:"
-#: src/Widgets/SettingsDialog.vala:85
+#: src/Widgets/SettingsDialog.vala:97
msgid "Sort articles by"
msgstr "Sorter artikler etter"
-#: src/Widgets/SettingsDialog.vala:85
+#: src/Widgets/SettingsDialog.vala:97
msgid "Date"
msgstr "Dato"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Nyeste først"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Eldste først"
-#: src/Widgets/SettingsDialog.vala:95
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Har bare innvirkning på \"lest\"-kolonnen"
+
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Merk som lest ved å rulle forbi"
+
+#: src/Widgets/SettingsDialog.vala:109
msgid "Article View:"
msgstr "Artikkelvisning:"
-#: src/Widgets/SettingsDialog.vala:97
+#: src/Widgets/SettingsDialog.vala:111
msgid "Default"
msgstr "Standard"
-#: src/Widgets/SettingsDialog.vala:97
+#: src/Widgets/SettingsDialog.vala:111
msgid "Spring"
msgstr "Vår"
-#: src/Widgets/SettingsDialog.vala:97
+#: src/Widgets/SettingsDialog.vala:111
msgid "Midnight"
msgstr "Midnatt"
-#: src/Widgets/SettingsDialog.vala:97
+#: src/Widgets/SettingsDialog.vala:111
msgid "Parchment"
msgstr "Pergament"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Skriftfamilie"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:128
+#: src/Widgets/SettingsDialog.vala:141
msgid "Sync:"
msgstr "Synkroniser:"
-#: src/Widgets/SettingsDialog.vala:130
+#: src/Widgets/SettingsDialog.vala:143
msgid "Number of articles"
msgstr "Antall artikler"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Intervall i minutter (0 = AV)"
-#: src/Widgets/SettingsDialog.vala:144
+#: src/Widgets/SettingsDialog.vala:150
msgid "Database:"
msgstr "Database:"
-#: src/Widgets/SettingsDialog.vala:146
+#: src/Widgets/SettingsDialog.vala:152
msgid "Delete articles after"
-msgstr ""
+msgstr "Slett artikler etter"
-#: src/Widgets/SettingsDialog.vala:147
+#: src/Widgets/SettingsDialog.vala:153
msgid "Never"
msgstr "Aldri"
-#: src/Widgets/SettingsDialog.vala:147
+#: src/Widgets/SettingsDialog.vala:153
msgid "1 Week"
msgstr "1 uke"
-#: src/Widgets/SettingsDialog.vala:147
+#: src/Widgets/SettingsDialog.vala:153
msgid "1 Month"
msgstr "1 måned"
-#: src/Widgets/SettingsDialog.vala:147
+#: src/Widgets/SettingsDialog.vala:153
msgid "6 Months"
msgstr "6 måneder"
-#: src/Widgets/SettingsDialog.vala:149
+#: src/Widgets/SettingsDialog.vala:155
msgid "Additional Functionality:"
msgstr "Ytterligere funksjoner:"
-#: src/Widgets/SettingsDialog.vala:151
+#: src/Widgets/SettingsDialog.vala:157
msgid "Content Grabber"
msgstr "Innholdsskraper"
-#: src/Widgets/SettingsDialog.vala:153
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Last ned bilder"
+
+#: src/Widgets/SettingsDialog.vala:161
msgid "Internal Media Player"
-msgstr ""
+msgstr "Innebygd medieavspiller"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
+#: src/Widgets/SettingsDialog.vala:322
msgid "System Accounts"
-msgstr "Endre konto"
+msgstr "Systemkontoer"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
msgid "FeedReader Accounts"
-msgstr "FeedReader"
+msgstr "FeedReader-kontoer"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Endre konto?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Du er i ferd med å endre kontoen som du vil at FeedReader skal bruke.\n"
+"Dette innebærer å slette alle lokale data fra den gamle kontoen."
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Hvor er dine nyhetskilder?"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Ny konto"
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Velg RSS-tjenesten du bruker og logg inn for å komme i gang."
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Venter på at pågående synkronisering skal fullføre"
-#: src/Widgets/AddPopover.vala:48
-#, fuzzy
-msgid "Category:"
-msgstr "Ukategorisert"
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Jeg har ombestemt meg"
-#: src/Widgets/AddPopover.vala:51
-#, fuzzy
-msgid "Add"
-msgstr "legg til merkelapp"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
+msgstr "Alle"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
+msgstr "Vis alle artikler"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
+msgstr "Ulest"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
+msgstr "Vis kun uleste artikler"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
+msgstr "Stjernemerket"
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
+msgstr "Vis kun stjernemerkede artikler"
+
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Oppdater feed"
+
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Søk i artikler"
+
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Innstillinger"
+
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Les artikkelen i fullskjerm"
-#: src/Widgets/FeedRow.vala:247
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
#, c-format
-msgid "Remove only from %s"
-msgstr ""
+msgid "Tag \"%s\" removed"
+msgstr "Merkelappen \"%s\" er fjernet"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Fjern feed"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "Kopier nettadresse"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Fjern kun fra %s"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr ""
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr "Kilden \"%s\" er fjernet"
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Nyhetsliste:"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Gå ut av fullskjerm"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Alle artikler"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Merkelapper"
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Kategorier"
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Artikkelliste:"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Feeds"
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
-msgstr ""
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Ny merkelapp"
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Det er 1 ny artikkel"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Ny kategori"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Ingen artikler"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Ingen uleste artikler"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Ingen stjernemerkede artikler"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Ingen artikler"
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Synkronisering pågår. Artiklene bør vises ganske snart."
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "rull opp"
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Logg ut"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Ingen artikkel valgt."
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Om FeedReader"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit har krasjet"
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Lagre bildet som"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Legg til merkelapp:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Merkelapper:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "legg til merkelapp"
+
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
+msgstr "FeedReader"
+
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "Ignorer alle TLS-feil fra nå av"
+
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
+msgstr "Velg først en tjeneste"
+
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr "Angi et gyldig brukernavn"
+
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
+msgstr "Angi et gyldig passord"
+
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
+msgstr "Angi en gyldig nettadresse"
+
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr "Angi dine innloggingsdetaljer"
+
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
+msgstr "Beklager, noe gikk galt."
+
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
+msgstr "Tjeneren meldte om en API-feil."
+
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
+msgstr "Enten er brukernavnet eller passordet ditt feil."
+
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
+"Ingen forbindelse til tjeneren. Kontroller internettforbindelsen din og "
+"lenken til tjeneren."
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
+msgstr "API-tilgang er deaktivert på tjeneren. Vennligst aktiver dette først!"
+
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
+msgstr "Ikke autorisert til å besøke denne URLen"
+
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
+msgstr "Ingen gyldig CA-sertifikat tilgjengelig!"
+
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+msgstr "Installer programtillegget \"api_feedreader\" på din tt-rss -instans."
+
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Vedlegg"
+
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader rengjør databasen.\n"
+"Dette burde ikke ta for lang tid."
+
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Merk artikkel"
-#: src/Utils.vala:20
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Skriv ut artikkel"
+
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Del artikkel"
+
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Fjern \"%s\""
+
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Feeden \"%s\" er fjernet"
+
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr "Ukjent etikett"
+
+#: src/Utils.vala:35
msgid "No Preview Available"
msgstr "Ingen forhåndsvisning tilgjengelig"
-#: src/Utils.vala:98
+#: src/Utils.vala:93
msgid "No Text available for this article :("
msgstr "Ingen tekst tilgjengelig for denne artikkelen :("
-#: src/Utils.vala:208
+#: src/Utils.vala:601
#, c-format
msgid "posted by: %s, "
-msgstr ""
+msgstr "publisert av: %s, "
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Lagre"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Åpne i nettleseren"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Passord:"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Brukernavn og passord er feil"
+
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "venter"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Hei,\n"
+"\n"
+"Sjekk ut denne interessante artikkelen jeg akkurat leste: $URL"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-#, fuzzy
-msgid "feedreader"
-msgstr "FeedReader"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Grense: "
-#: data/feedreader-autostart.desktop.in:3
-#, fuzzy
-msgid "FeedReader Autostart"
-msgstr "FeedReader"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tvitre"
+
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Tvitre til følgere"
+
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "Klient ID:"
+
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Klienthemmelighet:"
+
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Skriv inn URL."
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "URL er ikke gyldig."
+
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Fyll inn klient-ID-en."
+
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Skriv inn klient-hemmeligheten."
+
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Skriv inn passordet."
+
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Skriv inn brukernavnet."
+
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Noe gikk galt."
+
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Hei,\n"
+"\n"
+"Sjekk ut denne interessante artikkelen jeg akkurat leste med FeedReader: $URL"
-#: data/feedreader.appdata.xml.in:7
-#, fuzzy
-msgid "RSS client for various webservices"
-msgstr "Skrivebordsklient for ulike RSS-tjenester"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Til:"
-#: data/feedreader.appdata.xml.in:10
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Send"
+
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Skriv epost"
+
+#: plugins/share/Telegram/TelegramForm.vala:23
msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Hei, sjekk ut denne interessante artikkelen jeg nettopp leste - sent av "
+"FeedReader"
+
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Send telegram"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
+"Info: Telegram må være installert for at denne utvidelsen skal fungere."
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: data/feedreader.appdata.xml.in:17
-#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS-nettadresse:"
-#: data/feedreader.appdata.xml.in:18
-#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP-autorisering"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+msgstr "Logg inn i din freshRSS-tjener og kos deg FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Logg inn i FeedHQ og kos deg med FeedReader"
-#~ msgid "no Author"
-#~ msgstr "ingen forfatter"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Ferdig"
-#~ msgid "no Title"
-#~ msgstr "ingen tittel"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Legger til feeds"
-#~ msgid "no Preview"
-#~ msgstr "ingen forhåndsvisning"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Ingenting å lese her."
-#~ msgid "no content"
-#~ msgstr "uten innhold"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr "Nextcloud-nettadresse:"
-#~ msgid "Not available"
-#~ msgstr "Ikke tilgjengelig"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr "Logg deg inn i Nextcloud News-installasjonen og kos deg med FeedReader"
-#~ msgid "No service selected."
-#~ msgstr "Ingen tjeneste valgt."
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr "Ugyldig nettadresse"
-#~ msgid ""
-#~ "You will be redirected to the feedly website where you can use your "
-#~ "Facebook-, Google-, Twitter-, Microsoft- or Evernote-Account to log in."
-#~ msgstr ""
-#~ "Du vil bli videresendt til Feedlys nettside hvor du kan bruke din "
-#~ "Facebook-, Google-, Twitter-, Microsoft- eller Evernote-konto for å logge "
-#~ "inn."
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr "Nettadresseinnholdet er HTML, ingen kilder tilgjengelig"
-#~ msgid "Services"
-#~ msgstr "Tjenester"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr "Nettadresseinnholdet er HTML, hvis innhold er flere kilder."
-#~ msgid "None"
-#~ msgstr "Ingen"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr "Kunne ikke laste ned nettadresseinnholdet."
-#~ msgid "Built in grabber"
-#~ msgstr "Innebygget innholdsskraper"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr "Innholdet er ugyldig XML."
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr "Ingen av de %i artiklene i databasen passer med gjeldende filtre."
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr "Fikk ikke kontakt med tt-rss"
-#~ msgid "Please"
-#~ msgstr "Vennligst"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS-nettadresse:"
-#~ msgid "to a service to share this article."
-#~ msgstr "til en tjeneste for å dele denne artikkelen."
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr "Logg deg inn i din Tiny Tiny RSS-tjener og kos deg med FeedReader"
-#~ msgid "not found"
-#~ msgstr "ikke funnet"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Logg deg inn i Old Reader og kos deg med FeedReader"
+
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Logg inn i Feedbin og kos deg med FeedReader"
+
+#, fuzzy
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Veksle merking av artikkelen"
diff --git a/po/nl.po b/po/nl.po
index fd39e89b..33efd217 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -1,1076 +1,919 @@
-# Dutch translation for feedreader
-# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015
-# This file is distributed under the same license as the feedreader package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2015
+# Heimen Stoffels <vistausss@outlook.com>, 2017
msgid ""
msgstr ""
-"Project-Id-Version: feedreader\n"
+"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-01-12 22:03+0000\n"
-"Last-Translator: Valentijn <valentijnishaqsada@protonmail.com>\n"
-"Language-Team: Dutch <nl@li.org>\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
+"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
+"Language-Team: Dutch (http://www.transifex.com/dev-feedreader/feedreader/"
+"language/nl/)\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
-"X-Generator: Launchpad (build 17886)\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Gebruikersnaam:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Wachtwoord:"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Over FeedReader"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Inloggen"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "TinyTinyRSS URL:"
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Uitloggen"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Bezig met ophalen van feeds en categorieën"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Bezig met ophalen van artikelen"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "aan het wachten"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Bezig met ophalen van artikelen met ster"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Bezig met ophalen van gelabelde artikele"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Bezig met ophalen van ongelezen artikelen"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nieuwe artikelen"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Er is 1 nieuw artikel (%u ongelezen)"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Er zijn %u nieuwe artikelen (%u ongelezen)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Gisteren"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Categorie \"%s\" is verwijderd"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Markeren als gelezen"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Gebruikersnaam of wachtwoord is incorrect"
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Naam wijzigen"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Verwijderen"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Verwijderen (inclusief feeds)"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "naam wijzigen"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "toevoegen"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Accounts toevoegen"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Algemeen"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Verversen"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Voer een geldig wachtwoord in"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Zoeke"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Voer een geldige gebruikersnaam in"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Afsluiten"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Sorry, er ging iets mis"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Feedlijst"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nieuwe artikelen"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Volgende item selecteren"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Er is 1 nieuw artikel"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Vorig item selecteren"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Er zijn %u nieuwe artikelen"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Categorieën inklappen/uitklappen"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Toon alleen ongelezen artikelen"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Huidig geselecteerd artikel markeren als gelezen"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Nieuwe artikelen"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Artikellijst"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Toon alleen gemarkeerde artikelen"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Volgend/vorig artikel selecteren"
-#: src/Backend/FeedServer.vala:242
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Toon alleen gemarkeerde artikelen"
+msgid "Toggle reading status of selected article"
+msgstr "Geselecteerd artikel markeren als (on)gelezen"
-#: src/Backend/FeedServer.vala:255
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Getting unread articles"
-msgstr "Toon alleen ongelezen artikelen"
-
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Niet gecategoriseerd"
+msgid "Toggle marking of selected article"
+msgstr "Geselecteerd artikel markeren als (on)gelezen"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "URL van geselecteerd artikel openen"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Volledig omhoog/omlaag scrollen"
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
-msgstr "Nieuwe artikelen"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Huidig geselecteerd artikel centreren"
-#: src/Widgets/FeedList.vala:433
-#, fuzzy
-msgid "Tags"
-msgstr "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Artikelweergave"
-#: src/Widgets/FeedList.vala:481
-#, fuzzy
-msgid "Categories"
-msgstr "Niet gecategoriseerd"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Omhoog/omlaag scrollen"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Waar zijn uw feeds?"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
+"Selecteer de RSS-dienst die u gebruikt en log in om aan de slag te gaan."
-#: src/Widgets/FeedList.vala:1129
-#, fuzzy
-msgid "New Category"
-msgstr "Niet gecategoriseerd"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Niet-gecategoriseerd"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Tag toevoegen:"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Tags:"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categorie:"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "Tag toevoegen"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Toevoegen"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-"FeedReader is de database aan het opschonen.\n"
-"Dit duurt zou niet lang moeten duren."
-
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Synchronisatie is bezig. Artikelen kunnen op elk moment verschijnen."
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Nieuwe artikelen"
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importeren"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Feed toevoegen"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "OPML importeren"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Uiterlijk"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Interne werking"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Delen"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Feedlijst:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Alleen feeds weergeven"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Alleen ongelezen weergeven"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Ontvangen"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabetisch"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Thema"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Donker"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "ArtikelLijst:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Artikels sorteren op"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Datum"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Oudste eerst"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Alleen van toepassing op \"Ongelezen\"-kolom"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Markeren als gelezen door voorbijscrollen"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Artikelweergave:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Standaard"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Markeer artikel als (on)gemarkeerd"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Lente"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Markeer artikel als (on)gelezen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Middernacht"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Perkament"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
-msgstr "Toon alle artikelen"
-
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synchroniseren:"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
-msgstr "Toon alleen ongelezen artikelen"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Aantal artikelen"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
-msgstr "Toon alleen gemarkeerde artikelen"
-
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Tag Artikel"
-
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Deel Artikel"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Database:"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Deel Artikel"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Artikelen verwijderen na"
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Perkament"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nooit"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Feeds Updaten"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 week"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 maand"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Zoek Artikelen"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 maanden"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Instellingen"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Extra functionaliteit:"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-#, fuzzy
-msgid "Rename"
-msgstr "Gebruikersnaam:"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Inhoudsophaling"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-#, fuzzy
-msgid "rename"
-msgstr "Gebruikersnaam:"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Interne mediaspeler"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-#, fuzzy
-msgid "add"
-msgstr "Tag toevoegen"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Systeemaccounts"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nieuwe account"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader-accounts"
#: src/Widgets/ResetPage.vala:33
msgid "Change Account?"
-msgstr "Verander Account?"
+msgstr "Account wijzigen?"
#: src/Widgets/ResetPage.vala:37
msgid ""
"You are about to change the account you want FeedReader to use.\n"
" This means deleting all local data of your old account."
msgstr ""
-"U staat op het punt om de account welke voor Feedreader wordt gebruikt te "
-"veranderen.\n"
-" Dit betekent dat alle lokale data van uw oude account wordt verwijdert."
+"U staat op het punt om het door FeedReader gebruikte account te wijzigen.\n"
+"Dit betekent dat alle lokale gegevens van uw oude account worden verwijderd."
#: src/Widgets/ResetPage.vala:41
msgid "New account"
-msgstr "Nieuwe account"
+msgstr "Nieuw account"
#: src/Widgets/ResetPage.vala:44
msgid "Waiting for current sync to finish"
-msgstr "Aan het wachten totdat de huidige synchronisatie afgerond is"
+msgstr "Bezig met wachten op afronden van synchronisatie"
#: src/Widgets/ResetPage.vala:54
msgid "I changed my mind"
msgstr "Ik ben van gedachten veranderd"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-#, fuzzy
-msgid "Mark as read"
-msgstr "Markeer artikel als (on)gelezen"
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
+msgstr "Alles"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
-msgstr "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
+msgstr "Alle artikelen weergeven"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Negeer alle tls foutmeldingen vanaf nu"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
+msgstr "Ongelezen"
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
-msgstr "Selecteer alstublieft eerst een dienst"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
+msgstr "Alleen ongelezen artikelen weergeven"
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
-msgstr "Voer een geldige gebruikersnaam in"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
+msgstr "Met ster"
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
-msgstr "Voer een geldig wachtwoord in"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
+msgstr "Alleen artikelen met ster weergeven"
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
-msgstr "Voer alstublieft een correcte URL in"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Feeds bijwerken"
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
-msgstr "Voer alstublieft je inloggevens in"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Artikelen zoeken"
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
-msgstr "Sorry, er ging iets mis"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Instellingen"
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Artikel lezen in volledig scherm"
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
-msgstr "Je gebruikersnaam of je wachtwoord is niet juist"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Het label \"%s\" is verwijderd"
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
-msgstr ""
-"Geen verbinding met de server. Controleer je internetverbinding en de URL "
-"van de server!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Feed verwijderen"
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-"API toegang is uitgeschakeld op deze server. Zet deze alstublieft eerst aan."
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
-msgstr ""
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Alleen verwijderen uit %s"
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
-msgstr "Geen geldig CA certificaat beschikbaar!"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "De feed \"%s\" is verwijderd"
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr ""
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Volledig scherm verlaten"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Geen artikel geselecteerd"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Alle artikelen"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Labels"
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Deel Artikel"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categorieën"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interface"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Feeds"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Intern"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nieuw label"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nieuwe categorie"
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Feed lijst:"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Geen artikele"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Toon alleen feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Geen ongelezen artikelen"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Toon alleen ongelezen"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Geen artikelen met ster"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Sorteer FeedLijst op"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Geen artikelen"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Ontvangen"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr ""
+"Bezig met synchroniseren. De artikelen zullen elk ogenblik verschijnen."
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabetisch"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "omhoog scrollen"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Thema"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Geen artikel geselecteerd."
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr ""
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit is gecrashed"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr ""
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Afbeelding opslaan als"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr ""
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Annuleren"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Artikel Lijst:"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Label toevoegen:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Sorteer artikels op"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Labels:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Datum"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "Label toevoegen"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Nieuwste eerst"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
+msgstr "FeedReader"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Artikel Weergeving:"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "Alle TLS-fouten voortaan negeren"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Standaard"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
+msgstr "Selecteer eerst een dienst"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Lente"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr "Voer een geldige gebruikersnaam in"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Middernacht"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
+msgstr "Voer een geldig wachtwoord in"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Perkament"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
+msgstr "Voer een geldige URL in"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr ""
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr "Voer uw inloggegevens in"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr ""
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
+msgstr "Sorry, er ging iets mis."
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr ""
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
+msgstr "De server meldt dat er een API-fout is."
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr ""
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
+msgstr "Uw gebruikersnaam of wachtwoord is onjuist."
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
+"Geen verbinding met de server. Controleer uw internetverbinding en de server-"
+"URL!"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synchroniseren:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Aantal artikelen"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Elke (Minuten)"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
+msgstr "API-toegang is uitgeschakeld op deze server. Schakel deze in!"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Database:"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
+msgstr "U heeft geen toegang tot deze URL"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Verwijder artikelen na"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
+msgstr "Geen geldig CA-certificaat beschikbaar!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nooit"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+msgstr "Installeer de \"api_feedreader\"-plug-in in uw tt-rss-instantie!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Week"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Bijlagen"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Maand"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
+msgstr ""
+"FeedReader is bezig met het schoonmaken van de database.\n"
+"Dit zou niet lang moeten duren."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Maanden"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Artikel labelen"
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Additionele Functionaliteit:"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Artikel afdrukken"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Content Grabber"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Artikel delen"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "\"%s\" verwijderen"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Wijzig account"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "De feed \"%s\" is verwijderd"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
+#: src/DataBaseReadOnly.vala:223
#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
+msgid "Unknown tag"
+msgstr "onbekende feed"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Er is geen voorbeeldweergave beschikbaar"
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Waar zijn uw feeds?"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Er is geen tekst beschikbaar bij dit artikel :("
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
-"Selecteer alstublieft de RSS dienst die u gebruikt en log in om aan de slag "
-"te gaan."
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "geplaatst door: %s"
-#: src/Widgets/AddPopover.vala:48
-#, fuzzy
-msgid "Category:"
-msgstr "Niet gecategoriseerd"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Opslaan"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Openen in webbrowser"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Gebruikersnaam:"
-#: src/Widgets/AddPopover.vala:51
-#, fuzzy
-msgid "Add"
-msgstr "Tag toevoegen"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Wachtwoord:"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Gebruikersnaam of wachtwoord onjuist"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr ""
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "bezig met wachten"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Hoi!\n"
+"\n"
+"Kijk eens naar dit interessante artikel dat ik zojuist heb gelezen: $URL"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Limiet:"
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tweeten"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Tweeten naar volgers"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "Cliënt-ID:"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Cliënt-geheim:"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Voer de URL in."
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Afsluiten"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "De URL lijkt ongeldig te zijn."
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Feed lijst:"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Voer de clientID in."
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Voer de clientSecret in."
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Voer het wachtwoord in."
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Voer de gebruikersnaam in"
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Artikel Lijst:"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Er is iets misgegaan."
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Hoi!\n"
+"\n"
+"Kijk eens naar dit interessante artikel dat ik zojuist heb gelezen: $URL\n"
+"\n"
+"- verstuurd door FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Er is 1 nieuw artikel"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Aan:"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Versturen"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "E-mail schrijven"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Hoi! Kijk eens naar dit interessante artikel dat ik zojuist heb gelezen - "
+"verstuurd door FeedReader"
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Naar Telegram versturen"
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
+"Let op: Telegram moet geïnstalleerd zijn, anders werkt deze plug-in niet."
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Uitloggen"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "OVer FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS-URL:"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP-autorisatie:"
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"Log in op uw freshRSS-server. Veel plezier met het gebruik van FeedReader!"
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Geen voorbeeldweergave beschikbaar"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Geen Tekst beschikbaar bij dit artikel :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Log in op FeedHQ. Veel plezier met het gebruik van FeedReader!"
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Klaar"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Bezig met toevoegen van feeds"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-#, fuzzy
-msgid "feedreader"
-msgstr "FeedReader"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Er valt hier niks te lezen."
-#: data/feedreader-autostart.desktop.in:3
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "FeedReader Autostart"
-msgstr "FeedReader"
-
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "OwnCloud-URL:"
-#: data/feedreader.appdata.xml.in:7
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
#, fuzzy
-msgid "RSS client for various webservices"
-msgstr "Desktop Client voor verschillende RSS Services"
-
-#: data/feedreader.appdata.xml.in:10
msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Log in op uw ownCloud News-instantie. Veel plezier met het gebruik van "
+"FeedReader!"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
-
-#: data/feedreader.appdata.xml.in:17
-#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
-
-#: data/feedreader.appdata.xml.in:18
-#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
-
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#~ msgid "About"
-#~ msgstr "Over"
-
-#~ msgid "no Author"
-#~ msgstr "geen Auteur"
-
-#~ msgid "no Title"
-#~ msgstr "geen Titel"
-
-#~ msgid "no Preview"
-#~ msgstr "geen Voorbeeldweergave"
-
-#~ msgid "no content"
-#~ msgstr "Geen inhoud"
-
-#~ msgid "Not available"
-#~ msgstr "Niet beschikbaar"
-
-#~ msgid "No service selected."
-#~ msgstr "Geen dienst geselecteerd."
-
-#~ msgid ""
-#~ "You will be redirected to the feedly website where you can use your "
-#~ "Facebook-, Google-, Twitter-, Microsoft- or Evernote-Account to log in."
-#~ msgstr ""
-#~ "U zal worden doorverwezen naar de feedly website waar u uw Facebook-, "
-#~ "Google-, Twitter-, Microsoft- of Evernote-Acccount kunt gebruiken om in "
-#~ "te loggen"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr ""
-#~ msgid "Services"
-#~ msgstr "Diensten"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr ""
-#~ msgid "None"
-#~ msgstr "Geen"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#~ msgid "Built in grabber"
-#~ msgstr "Ingebouwde grabber"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS-URL:"
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Geen van de i% Artikelen uit de database voldoen aan de huidige filters."
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr ""
+"Log in op uw Tiny Tiny RSS-server. Veel plezier met het gebruik van "
+"FeedReader!"
-#~ msgid "Please"
-#~ msgstr "Alstublieft"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Log in op Old Reader. Veel plezier met het gebruik van FeedReader!"
-#~ msgid "to a service to share this article."
-#~ msgstr "naar een dienst om dit artikel te delen."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Log in op Feedbin. Veel plezier met het gebruik van FeedReader!"
-#~ msgid "not found"
-#~ msgstr "niet gevonden"
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Geselecteerd artikel markeren als (on)gemarkeerd"
diff --git a/po/nn.po b/po/nn.po
index 56ff8671..413f5512 100644
--- a/po/nn.po
+++ b/po/nn.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/pl.po b/po/pl.po
index 38943556..cde4a12e 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/dev-feedreader/feedreader/"
"language/pl/)\n"
@@ -18,597 +18,587 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nazwa użytkownika:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Hasło:"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
+"%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
+"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "O FeedReaderze"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Zaloguj"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "Adres OwnCloud:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autoryzacja HTTP"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Wyloguj"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nowe artykuły"
+
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "czekaj"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Wczorajsze"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Kategoria \"%s\" usunięta"
+
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Odznacz jako przeczytane"
+
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Zmień nazwę"
+
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Usuń"
+
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Usuń (z kanałami)"
+
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "zmień nazwę"
+
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "dodaj"
+
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Zakończ"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Nazwa użytkownika lub hasło są nieprawidłowe"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "Adres:"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Klient RSS"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Proszę wpisać prawidłowe hasło"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Proszę wprowadzić prawidłową nazwę użytkownika"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Przepraszamy, coś poszło nie tak."
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Gdzie są twoje kanały?"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nowe artykuły"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Proszę wybierz serwis RSS którego używasz i zaloguj się"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Odznacz artykuł jako (nie)przeczytany"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Nieskategoryzowane"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Odznacz artykuł jako (nie)przeczytany"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "Adres:"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Pokaż tylko nieprzeczytane artykuły"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Kategoria:"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Nowe artykuły"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Dodaj"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Pokaż tylko ulubione artykuły"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Pokaż tylko ulubione artykuły"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Pokaż tylko nieprzeczytane artykuły"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Zaimportuj"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Nieskategoryzowane"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Dodaj kanał"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Usuń \"%s\""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Zaimportuj OPML"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Tag \"%s\" usunięty"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "interfejs"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Kanał \"%s\" usunięty"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "wewnętrzne"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Kategoria \"%s\" usunięta"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Udostępnianie"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Wszystkie Artykuły"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Lista Serwisów:"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Tagi"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Pokazuj tylko kanały"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Kategorie"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Pokazuj tylko nieprzeczytane"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Lista Serwisów:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Nowy Tag"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Otrzymane"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Nowa Kategoria"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabetycznie"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Dodaj Tag:"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Motyw"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Tagi:"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "dodaj Tag"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Ciemny"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader czyści bazę danych\n"
-"To nie powinno potrwać długo"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Synchronizuje. Artykuły powinny się zaraz pojawić. "
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Lista artykułów"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "przewiń do góry"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Sortuj artykuły po"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Nowe artykuły"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-"Nie znaleziono nieprzeczytanych artykułów, pasujących do \"%s\" w kanale \"%s"
-"\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Nie znaleziono nieprzeczytanych artykułów w kanale \"%s\""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-"Nie znaleziono ulubionych artykułów, pasujących do \"%s\" w kanale \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Nie znaleziono ulubionych artykułów w kanale \"%s\""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Wygląd Artykułu"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr "Nie znaleziono artykułów, pasujących do \"%s\" w kanale \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Domyślny"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Nie znaleziono artykułów w kanale \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Wiosna"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Nie znaleziono nieprzeczytanych artykułów, pasujących do \"%s\" z tagiem \"%s"
-"\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Północ"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Nie znaleziono nieprzeczytanych artykułów z tagiem \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergamin"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-"Nie znaleziono ulubionych artykułów, pasujących do \"%s\" z tagiem \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Nie znaleziono ulubionych artykułów z tagiem \"%s\""
-
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr "Nie znaleziono artykułów, pasujących do \"%s\" z tagiem \"%s\""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synchronizuj:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Nie znaleziono artykułów z tagiem \"%s\""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Ilość artykułów"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-"Nie znaleziono nieprzeczytanych artykułów, pasujących do \"%s\" w kategorii "
-"\"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Nie znaleziono nieprzeczytanych artykułów w kategorii \"%s\""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Baza danych:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nie znaleziono ulubionych artykułów, pasujących do \"%s\" w kategorii \"%s\""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Usuń artykuły po "
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Nie znaleziono ulubionych artykułów w kategorii \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nigdy"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr "Nie znaleziono artykułów, pasujących do \"%s\" w kategorii \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 tydzień"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Nie znaleziono artykułów w kategorii \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Miesiąc"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr "Nie znaleziono nieprzeczytanych artykułów które pasują do \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Miesięcy"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Nie znaleziono nieprzeczytanych artykułów"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Dodatkowa funkcjonalność:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "Nie znaleziono ulubionych artykułów które pasują do \"%s\""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Pobieracz Danych"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Nie znaleziono ulubionych artykułów"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Nie znaleziono artykułów które pasują do \"%s\""
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Nie znaleziono żadnych artykułów"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Zaznacz/odznacz artykuł jako ulubiony"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Odznacz artykuł jako (nie)przeczytany"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Zmienić konto?"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Pełny ekran"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Właśnie chcesz zmienić konto którego używa FeedReader.\n"
+"To oznacza skasowanie lokalnych danych twojego starego konta"
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nowe konto"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Poczekaj na koniec synchronizacji"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Zmieniłem zdanie"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Wszystko"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Pokaż wszystkie artykuły"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Nieprzeczytane"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Pokaż tylko nieprzeczytane artykuły"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Ulubione"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Pokaż tylko ulubione artykuły"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Otaguj Artykuł"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Udostępnij Artykuł"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Przeszukaj Artykuły"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Udostępnij Artykuł"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Preferencje"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Załączniki"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Pełny ekran"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Aktualizuj"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Tag \"%s\" usunięty"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Przeszukaj Artykuły"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Preferencje"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Usuń tylko z %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Zmień nazwę"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Kanał \"%s\" usunięty"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Usuń"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Opuść tryb pełnoekranowy"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "zmień nazwę"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Wszystkie Artykuły"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "dodaj"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Tagi"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nowe konto"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Kategorie"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Zmienić konto?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr ""
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nowy Tag"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nowa Kategoria"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-"Właśnie chcesz zmienić konto którego używa FeedReader.\n"
-"To oznacza skasowanie lokalnych danych twojego starego konta"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nowe konto"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Poczekaj na koniec synchronizacji"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Zmieniłem zdanie"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Odznacz jako przeczytane"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Synchronizuje. Artykuły powinny się zaraz pojawić. "
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Usuń (z kanałami)"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "przewiń do góry"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nie wybrano artykułu."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Zapisz obraz jako"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Dodaj Tag:"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Tagi:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "dodaj Tag"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "ignoruj wszystkie błędy tls"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Proszę najpierw wybrać serwis"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Proszę wprowadzić prawidłową nazwę użytkownika"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Proszę wpisać prawidłowe hasło"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Proszę wpisać prawidłowy adres"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Proszę wpisać swoje dane logowania"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Przepraszamy, coś poszło nie tak."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Nazwa użytkownika lub hasło są nie poprawne"
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -616,454 +606,291 @@ msgstr ""
"Nie można połączyć z serwerem. Sprawdź swoje połączenie internetowe i adres "
"serwera!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "Dostęp do API wyłączony na serwerze. Proszę najpierw go włączyć!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Nie zautoryzowany do połączenia z adresem"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Nie dostępny poprawny certyfikat CA!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
"Proszę zainstalować \"api_feedreader\"-plugin na twojej instancji tt-rss"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nie wybrano artykułu."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Załączniki"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader czyści bazę danych\n"
+"To nie powinno potrwać długo"
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Zapisz obraz jako"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "interfejs"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "wewnętrzne"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Udostępnianie"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Lista Serwisów:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Pokazuj tylko kanały"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Pokazuj tylko nieprzeczytane"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Sortuj listę kanałów po"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Otrzymane"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabetycznie"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Motyw"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Ciemny"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Lista artykułów"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Sortuj artykuły po"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Najpierw najnowsze"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Wygląd Artykułu"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Domyślny"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Wiosna"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Północ"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergamin"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Rozmiar czcionki"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Mała"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normalna"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Duża"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Ogromna"
-
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synchronizuj:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Ilość artykułów"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Co każde (minut)"
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Baza danych:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Usuń artykuły po "
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nigdy"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 tydzień"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Miesiąc"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Miesięcy"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Dodatkowa funkcjonalność:"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Usuń \"%s\""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Pobieracz Danych"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Kanał \"%s\" usunięty"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Nowe konto"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Autostart programu"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Podgląd nie dostępny"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Opuść tryb pełnoekranowy"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Tekst nie dostępny dla tego artykułu :("
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Gdzie są twoje kanały?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "opublikowane przez: %s, "
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Proszę wybierz serwis RSS którego używasz i zaloguj się"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Kategoria:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Dodaj"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Plik OPML:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Wybierz plik OPML"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Zaimportuj"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Dodaj kanał"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Zaimportuj OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Usuń tylko z %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Zakończ"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Lista Serwisów:"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Lista artykułów"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Odznacz artykuł jako (nie)przeczytany"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Dzisiejsze"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Wczorajsze"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Wyloguj"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "O FeedReaderze"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Podgląd nie dostępny"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Tekst nie dostępny dla tego artykułu :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "opublikowane przez: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Klient RSS"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Czytaj artykuły z serwisów internetowych"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "Autostart programu"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Klient RSS dla różnych serwisów internetowych"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-"FeedReader to program służący do czytania artykułów z już istniejących "
-"internetowych kont czytników RSS"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Obecnie wspierane serwisy:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Łączy wszystkie zalety internetowych serwisów, takie jak synchronizacja na "
-"różnych urządzeniach, ze wszystkim czego możesz oczekiwać po aplikacji "
-"biorkowej: \n"
-"Powiadomienia, szybkie wyszukiwanie, filtry, tagowanie, udostępnianie na "
-"serwisach takich jak pocket i instapaper, podręczna klawiatura, skróty i "
-"baza danych która przechowuje twoje stare artykuły, tak długo jak zechcesz. "
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr "Żaden z %i Artykułów w bazie nie pasuje do obecnych filtrów."
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów, \n"
-#~ "pasujących do \"%s\" w kanale \"%s\""
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów w kanale \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów, pasujących do \"%s"
-#~ "\" z tagiem \"%s\""
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów o tagu \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów, pasujących do \"%s"
-#~ "\" w kagerogii \"%s\""
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów w kategorii \"%s\""
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "Nie znaleziono nieprzeczytanych i ulubionych artykułów pasujących do \"%s"
-#~ "\""
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Nie znaleziono nieprzeczytanych i ulubionych artykułów"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr ""
diff --git a/po/pt.po b/po/pt.po
index 018f3887..2b0c3264 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Portuguese (http://www.transifex.com/dev-feedreader/"
"feedreader/language/pt/)\n"
@@ -21,995 +21,877 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nome de Utilizador:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Palavra-passe:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Sobre FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Entrar"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorização HTTP"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Sair"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Novos Artigos"
+
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "à espera"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Ontem"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "A categoria \"%s\" foi removida"
+
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Marcar como Lido"
+
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Renomear"
+
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Remover"
+
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Remover (com os Feeds)"
+
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "renomear"
+
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "adicionar"
+
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Sair"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Nome de utilizador ou Palavra-passe incorretos"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Por favor, introduza uma palavra-passe válida"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Por favor, introduza um nome de utilizador válido"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Ocorreu um erro. Pedimos desculpa."
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Onde estão os seus feeds?"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Novos Artigos"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Por favor, selecione o serviço RSS que usa e faça login para continuar."
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Marcar/Desmarcar artigo como lido"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Sem categoria"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Marcar/Desmarcar artigo como lido"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Mostrar apenas artigos não lidos"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categoria:"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Novos Artigos"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Adicionar"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Mostrar apenas artigos com estrela"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Mostrar apenas artigos com estrela"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Mostrar apenas artigos não lidos"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importar"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Sem categoria"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Adicionar feed"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Remover \"%s\""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importar OPML"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "A etiqueta \"%s\" foi removida"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interface"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "O feed \"%s\" foi removido"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Interior"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "A categoria \"%s\" foi removida"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Partilhar"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Todos os Artigos"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Lista de Feeds:"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Etiquetas"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Mostrar apenas feeds"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Categorias"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Mostrar apenas não lidos"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Lista de Feeds:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Nova Etiqueta"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Recebido"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Nova Categoria"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabeticamente"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Adicionar etiqueta:"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Etiquetas:"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "adicionar etiqueta"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Escuro"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"O FeedReader está a limpar a base de dados.\n"
-"Isto não deve demorar muito."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
-"Sincronização em curso. Os Artigos devem começar a aparecer a qualquer "
-"momento."
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Lista de Artigos:"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "ir para cima"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Ordenar artigos por"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Novos Artigos"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Vista de Artigos:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Por defeito"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Primavera"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Meia-noite"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergaminho"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sincronização:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Número de artigos"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Base de Dados:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Remover artigos depois de"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nunca"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 Semana"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Mês"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Meses"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funcionalidades Adicionais:"
+
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Agregador de Conteúdos"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Mudar de conta?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Está prestes a mudar a conta que é usada pelo FeedReader.\n"
+"Isto irá remover todos os dados locais da conta antiga."
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Adicionar/Remover estrela ao artigo"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nova conta"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Marcar/Desmarcar artigo como lido"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "À espera que a sincronização em curso termine"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Mudei de ideias"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Tudo"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Mostrar todos os artigos"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Não Lidos"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Mostrar apenas artigos não lidos"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Com Estrela"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Mostrar apenas artigos com estrela"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Adicionar Etiqueta"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Partilhar Artigo"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Procurar Artigos"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Partilhar Artigo"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Configurações"
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Pergaminho"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Atualizar Feeds"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "A etiqueta \"%s\" foi removida"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Procurar Artigos"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Configurações"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Remover apenas de %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Renomear"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "O feed \"%s\" foi removido"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Remover"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "renomear"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Todos os Artigos"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "adicionar"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Etiquetas"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nova conta"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categorias"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Mudar de conta?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr ""
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Nova Etiqueta"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nova Categoria"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-"Está prestes a mudar a conta que é usada pelo FeedReader.\n"
-"Isto irá remover todos os dados locais da conta antiga."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nova conta"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "À espera que a sincronização em curso termine"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Mudei de ideias"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Marcar como Lido"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr ""
+"Sincronização em curso. Os Artigos devem começar a aparecer a qualquer "
+"momento."
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Remover (com os Feeds)"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "ir para cima"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nenhum artigo selecionado."
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr ""
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Adicionar etiqueta:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Etiquetas:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "adicionar etiqueta"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Ignorar todos os erros de tls a partir de agora"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Insira um serviço primeiro"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Por favor, introduza um nome de utilizador válido"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Por favor, introduza uma palavra-passe válida"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Por favor, introduza um URL válido"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Introduza os seus detalhes de Login"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Ocorreu um erro. Pedimos desculpa."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "O nome de utilizador ou a palavra-passe estão incorretos."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
"Sem ligação ao servidor. Verifique a ligação à Internet e o URL do servidor!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
"O acesso à API está desativado no servidor. Por favor ative-o primeiro!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Sem autorização para aceder ao URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Nenhum certificado CA válido!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nenhum artigo selecionado."
-
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Partilhar Artigo"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interface"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Interior"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Partilhar"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Lista de Feeds:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Mostrar apenas feeds"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Mostrar apenas não lidos"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Ordenar a lista de Feeds por"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Recebido"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabeticamente"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Escuro"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Lista de Artigos:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Ordenar artigos por"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"O FeedReader está a limpar a base de dados.\n"
+"Isto não deve demorar muito."
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Vista de Artigos:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Por defeito"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Primavera"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Meia-noite"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergaminho"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Tamanho do Tipo de Letra"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Pequeno"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Grande"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Enorme"
-
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sincronização:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Número de artigos"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Todos os (Minutos)"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Base de Dados:"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Remover artigos depois de"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nunca"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Remover \"%s\""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Semana"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "O feed \"%s\" foi removido"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Mês"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Meses"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Pré-visualização Indisponível"
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funcionalidades Adicionais:"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Nenhum texto disponível para este artigo :("
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Agregador de Conteúdos"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "publicado por: %s,"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Nova conta"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Onde estão os seus feeds?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-"Por favor, selecione o serviço RSS que usa e faça login para continuar."
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Categoria:"
-
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Adicionar"
-
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Ficheiro OPML:"
-
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Selecionar ficheiro OPML"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importar"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Adicionar feed"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importar OPML"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Remover apenas de %s"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Sair"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Lista de Feeds:"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Lista de Artigos:"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Marcar/Desmarcar artigo como lido"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Hoje"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
+msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Ontem"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Sair"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Sobre FeedReader"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Pré-visualização Indisponível"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Nenhum texto disponível para este artigo :("
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "publicado por: %s,"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Nenhum dos %i Artigos na base de dados corresponde com os filtros atuais."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr ""
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 57405acf..511ef169 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -3,1014 +3,922 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# Davi Böger <dsboger@gmail.com>, 2016
+# Davi Böger <dsboger@gmail.com>, 2016-2017
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015
# Lucas Capalbo Lavezzo <lucas.capalbo@gmail.com>, 2016
+# Lucas Capalbo Lavezzo <lucas.capalbo@gmail.com>, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/dev-feedreader/"
-"feedreader/language/pt_BR/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-12-04 09:32+0000\n"
+"Last-Translator: Iacchus Mercurius <kassivs@gmail.com>\n"
+"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
+"feedreader/translations/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Nome de usuário:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Senha:"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 2.18-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Sobre o FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Entrar"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "URL do OwnCloud:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Sair"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorização HTTP"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Obtendo feeds e categorias"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Obtendo artigos"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Obtendo artigos com estrela"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Obtendo artigos com marcadores"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Obtendo artigos não lidos"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Novos artigos"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Há 1 artigo novo (%u não lidos)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Há %u artigos novos (%u não lidos)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "esperando"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Ontem"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Categoria \"%s\" removida"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Marcar como lido"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Renomear"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Remover"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Remover (junto com feeds)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "renomear"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "adicionar"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Adicionar contas"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Nome de usuário ou senha incorretos"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Geral"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Actualizar"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Pesquisa"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Sair"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Lista de feeds"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Selecione artigo próximo"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Selecione artigo anterior"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Recolher/Expandir categorias"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Por favor, digite uma senha válida"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Marcar atualmente selecionado como lido"
+
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Lista de artigos"
+
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Selecione artigo anterior/próximo"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Por favor, digite um nome de usuário válido"
+msgid "Toggle reading status of selected article"
+msgstr "Alternar o artigo selecionado lido/não lido"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Something went wrong."
-msgstr "Desculpe, algo saiu errado."
+msgid "Toggle marking of selected article"
+msgstr "Alternar o artigo selecionado lido/não lido"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Novos artigos"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Abrir o URL do artigo selecionado"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Marcar artigo como lido (ou não lido)"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Rolar para cima/baixo"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Marcar artigo como lido (ou não lido)"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Centralizar o artigo atualmente selecionado"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Mostrar somente artigos não lidos"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Visualização de artigos"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Novos artigos"
-
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Mostrar somente artigos com estrela"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Rolar para cima/baixo"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Mostrar somente artigos com estrela"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Onde estão seus feeds?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Mostrar somente artigos não lidos"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Por favor, selecione o serviço de RSS que você utiliza e faça o login para "
+"iniciar."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Não categorizado"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Remover \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Marcador \"%s\" removido"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categoria:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Feed \"%s\" removido"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Adicionar"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Categoria \"%s\" removida"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "Arquivo OPML:"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Todos os artigos"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "Escolha o Arquivo OPML"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Marcadores"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importar"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Categorias"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Adicionar feed"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importar OPML"
+
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interface"
+
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Interno"
+
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Compartilhamento"
+
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr "Lista de feeds:"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Novo marcador"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Mostrar somente feeds"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Nova categoria"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Mostrar somente não lidos"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Adicionar marcador:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Ordenar Lista de Feeds por"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Marcadores:"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Ordem de chegada"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "adicionar marcador"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Ordem alfabética"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader está limpando a base de dados.\n"
-"Isso não deve demorar muito."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Sincronização em andamento. Artigos devem aparecer a qualquer momento."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "rolar para cima"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Escuro"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Novos artigos"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Lista de artigos:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Ordenar artigos por"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Mais velhos primeiro"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Só afeta a coluna \"Não lidos\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Marcar lidos ao rolar"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Visualização de artigos:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Padrão"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Primavera"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Meia noite"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergaminho"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Fonte"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sincronização:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Número de artigos"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Intervalo em Minutos (0 = DESLIGADO)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Base de dados:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Excluir artigos após"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Nunca"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 semana"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 mês"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 meses"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funcionalidades adicionais:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Baixador de conteúdo"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Fazer Download das Imagens"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Marcar artigo com (sem) estrela"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Player de mídia interno"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Marcar artigo como lido (ou não lido)"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Contas do sistema"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "Contas do FeedReader"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Alterar conta?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Você está prestes a alterar a conta que você deseja utilizar com o "
+"FeedReader.\n"
+"Isso vai apagar todos os dados locais da conta anterior."
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nova conta"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Aguardando sincronização atual terminar"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Mudei de ideia"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Todos"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Mostrar todos os artigos"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Não lidos"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Mostrar somente artigos não lidos"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Com estrela"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Mostrar somente artigos com estrela"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Marcar artigo"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Atualizar feeds"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Compartilhar artigo"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Pesquisar artigos"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Compartilhar artigo"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Preferências"
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Pergaminho"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Ler o artigo em tela cheia"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Atualizar feeds"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Marcador \"%s\" removido"
+
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Remover feed"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Buscar artigos"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Remover somente de %s"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Preferências"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Feed \"%s\" removido"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Renomear"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Sair do modo de tela cheia"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Remover"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Todos os artigos"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "renomear"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Marcadores"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "adicionar"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categorias"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nova conta"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Feeds"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Alterar conta?"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Novo marcador"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
-msgstr ""
-"Você está prestes a alterar a conta que você deseja utilizar com o "
-"FeedReader.\n"
-"Isso significa deletar todos os dados locais da conta anterior."
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Nova categoria"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nova conta"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Nenhum artigo"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Aguardando sincronização atual terminar"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Nenhum artigo não lido"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Mudei de ideia"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Nenhum artigo com estrela"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Marcar como lido"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Nenhum artigo"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Remover (junto com feeds)"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Sincronização em andamento. Artigos devem aparecer a qualquer momento."
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "rolar para cima"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nenhum artigo selecionado."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit falhou"
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Salvar imagem como"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Adicionar marcador:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Marcadores:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "adicionar marcador"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr "Ignorar todos os erros TLS a partir de agora"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Por favor, selecione um serviço primeiro"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Por favor, digite um nome de usuário válido"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Por favor, digite uma senha válida"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Por favor, digite um URL válido"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Por favor, preencha suas credenciais de login"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Desculpe, algo saiu errado."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "O servidor reportou um erro de API."
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Ou seu nome de usuário ou senha estão incorretos."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
-"Sem conexão com o servidor. Verifique sua conexão com a internet é o URL do "
+"Sem conexão com o servidor. Verifique sua conexão com a internet e o URL do "
"servidor!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
"O acesso à API está desabilitado no servidor. Por favor, habilite-o primeiro!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Não autorizado a acessar a URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Nenhum certificado de CA válido disponível!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
+"Por favor, instale o plugin \"api_feedreader\" em sua instância tt-rss!"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nenhum artigo selecionado."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Anexos"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader está limpando a base de dados.\n"
+"Isso não deve demorar muito."
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Compartilhar artigo"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interface"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Interno"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Compartilhamento"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Lista de feeds:"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Marcar artigo"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Mostrar somente feeds"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Imprimir artigo"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Mostrar somente não lidos"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Compartilhar artigo"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Ordenar lista de feeds por"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Remover \"%s\""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Recebidos"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Feed \"%s\" removido"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Ordem alfabética"
+#: src/DataBaseReadOnly.vala:223
+#, fuzzy
+msgid "Unknown tag"
+msgstr "Feed desconhecido"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Nenhuma visualização disponível"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Nenhum texto disponível para este artigo :("
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Escuro"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "postado por: %s,"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Salvar"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Abra no navegador"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Nome de usuário:"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Lista de artigos:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Senha:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Ordenar artigos por"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Nome de usuário ou senha incorretos"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "aguardando"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Olá,\n"
+"\n"
+"Dá uma olhada neste artigo interessante que acabei de ler: $URL"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Visualização de artigos:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Padrão"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Primavera"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Meia noite"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergaminho"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Tamanho da fonte"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Pequena"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Grande"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Enorme"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Limite:"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sincronização:"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Twittar"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Número de artigos"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Twittar para seguidores"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "A cada (minutos)"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "ID do cliente:"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Base de dados:"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Segredo do cliente:"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Excluir artigos após"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Por favor, preencha o URL."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Nunca"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "URL não parece válido."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 semana"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Por favor, preencha o ID do cliente."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 mês"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Por favor, preencha o segredo do cliente."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 meses"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Por favor, preencha a senha."
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funcionalidades adicionais:"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Por favor, preencha o nome de usuário."
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Baixador de conteúdo"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Algo deu errado."
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Olá,\n"
+"\n"
+"Dá uma olhada neste artigo interessante que acabei de ler: $URL\n"
+"\n"
+"- enviado via FeedReader"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Nova conta"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Para:"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Enviar"
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Onde estão seus feeds?"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Escrever e-mail"
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-"Por favor, selecione o serviço de RSS que você utiliza e faça o login para "
-"iniciar."
+"Olá, dá uma olhada neste artigo interessante que acabei de ler - enviado via "
+"FeedReader"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Categoria:"
-
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Adicionar"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Enviar Telegram"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Arquivo OPML:"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr "Informação: Telegram precisa ser instalado para que este plugin funçõe"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Selecione arquivo OPML"
-
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importar"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Adicionar feed"
-
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importar OPML"
-
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Remover somente de %s"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "URL do freshRSS:"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "Autorização HTTP"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"Por favor, faça login no seu servidor freshRSS para aproveitar o FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Por favor, faça login no FeedHQ para desfrutar do FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Sair"
-
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Lista de feeds:"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Pronto"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Adicionando Feeds"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Nada para ler aqui."
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:50
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Article-List"
-msgstr "Lista de artigos:"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "URL do ownCloud:"
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Marcar artigo como lido (ou não lido)"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
-
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Hoje"
-
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Ontem"
-
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Sair"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Sobre o FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
-
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
-msgstr ""
-
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Nenhuma visualização disponível"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Nenhum texto disponível para este artigo :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "postado por: %s,"
-
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
-
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Por favor, faça login na sua instância do ownCloud News para aproveitar o "
+"FeedReader"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
-
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr ""
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL do Tiny Tiny RSS:"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
+"Por favor, faça login no seu servidor Tiny Tiny RSS para aproveitar o "
+"FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Por favor, faça login no The Old Reader para aproveitar o FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Por favor, faça login no Feedbin para aproveitar o FeedReader"
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Nenhum dos %i artigos da base de dados corresponde aos filtros atuais."
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Alternar o artigo selecionado com/sem estrela"
diff --git a/po/ro.po b/po/ro.po
index a7f8ec46..540caead 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Romanian (http://www.transifex.com/dev-feedreader/feedreader/"
"language/ro/)\n"
@@ -21,1060 +21,875 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Numele utilizatorului:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Parola:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Despre FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Autentificare"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorizare HTTP"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Ieșire din cont"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Articole noi"
+
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "în așteptare"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Ieri"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Categoria \"%s\" a fost ștearsă"
+
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Marchează ca citit"
+
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Redenumește"
+
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Șterge"
+
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Șterge (cu Feed-uri)"
+
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "redenumește"
+
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "adaugă"
+
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Ieși"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Numele utilizatorului sau parolă incorectă"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Client RSS"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Te rog introdu o parolă valid"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Te rog introdu un nume de utilizator valid"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Scuze, ceva a mers prost."
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Unde se află feed-urile tale?"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Articole noi"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Te rog selectează serviciul de RSS pe care îl folosești si autentifică-te "
+"pentru a continua"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Marchează articolul citit sau necitit"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Necategorizat"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Marchează articolul citit sau necitit"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Arată doar articolele necitite"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categorie:"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Articole noi"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Adaugă"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Arată doar articolele marcate cu stea"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Arată doar articolele marcate cu stea"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Arată doar articolele necitite"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importă"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Necategorizat"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Adaugă feed"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Șterge \"%s\""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importă OPML"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Tagul \"%s\" a fost șters"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interfață"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Feed-ul \"%s\" a fost șters"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Interne"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Categoria \"%s\" a fost ștearsă"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Distribuie"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Toate articolele"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Lista cu feed-uri:"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Taguri"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Arată doar feed-uri"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Categori"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Arată doar necitit"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Lista cu feed-uri:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Tag nou"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Primit"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Categorie nouă"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabetic"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Adaugă Tag:"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Temă"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Taguri:"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "adaugă Tag"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Întuneric"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader efectuează o curățare a bazei de date. Nu ar trebuii să dureze "
-"prea mult. "
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "Elementar"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
-"Sincronizare în desfășurare. Articolul trebuie să apară in orice secundă"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Lista articolelor "
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "Derulați in sus"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Sortează articolele in funcție de"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Articole noi"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-"Nu a fost găsit nici un articol care să se potrivească cu \"%s\" din feed-ul "
-"\"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol necitit in feed-ul \"%s"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-"Nu a putut fi găsit nici un articol marcat care să se potriveasca cu \"%s\" "
-"în feed-ul \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol marcat \"%s\""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Perspectiva articolului:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Nu a putut fi găsit nici un articol care să se potriveasca cu \"%s\" in feed-"
-"ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Mod implicit"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol în feed-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Primăvară"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Nu a putut fi găsit nici un articol necitit care să se potrivească cu \"%s\" "
-"din tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Miezul nopții"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol necitit în tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergament"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-"Nu a putut fi găsit nici un articol marcat care să se potrivească cu \"%s\" "
-"în tag-ul \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol în tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sincronizare:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Numărul de articole"
+
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-"Nu a putut fi găsit nici un articol care să se potrivească cu \"%s\" în tag-"
-"ul \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Nu au putut fi găsite articole în tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Bază de date:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nu au putut fi găsite articole necitite care să se potrivească cu \"%s\" în "
-"categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Șterge articolul după"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Nu au putut fi găsite articole necitite în categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Niciodată"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nu au putut fi găsite articole marcate care să se potrivească cu \"%s\" în "
-"categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 săptămână"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Nu au putut fi găsite articole marcate în categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 lună"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nu au putut fi găsite articole care să se potrivească cu \"%s\" în categoria "
-"\"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 luni"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Nu au fost găsite articole in categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funcționalitate adițională:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr "Nu au fost găsite articole necitite care să se potrivească cu \"%s\""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Acaparator pentru conținut"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Nu a fost găsit nici un articol necitit"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "Nu au fost găsite articole marcate care să se potrivească cu \"%s\""
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Nu a fost găsit nici un articol marcat"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Nu au fost găsite articole care să se potrivească cu \"%s\""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Nu au fost găsite articole"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Schimbă contul?"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Marchează articolul cu sau fără stea"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Ești pe cale să schimbi contul pe care dorești ca FeedReader să-l "
+"folosească. Asta înseamnă ștergere tuturor datelor ale contului vechi"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Marchează articolul citit sau necitit"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Cont nou"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Citește articolul pe tot ecranul"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Se așteaptă terminarea sincronizării curente"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "M-am răzgândit"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Totul"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Arată toate articolele"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Necitit"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Arată doar articolele necitite"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Marcat cu stea"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Arată doar articolele marcate cu stea"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Tăguiește articolul"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Dă share articolului"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Caută articole"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Dă share articolului"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Setări"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Atașări"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Citește articolul pe tot ecranul"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Actualizați Feed-urile"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Tagul \"%s\" a fost șters"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Caută articole"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Setări"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Șterge doar din %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Redenumește"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Feed-ul \"%s\" a fost șters"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Șterge"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Părăsește modul de vizualizare pe tot ecranul"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "redenumește"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Toate articolele"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "adaugă"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Taguri"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Cont nou"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categori"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Schimbă contul?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr ""
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Tag nou"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Categorie nouă"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-"Ești pe cale să schimbi contul pe care dorești ca FeedReader să-l "
-"folosească. Asta înseamnă ștergere tuturor datelor ale contului vechi"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Cont nou"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Se așteaptă terminarea sincronizării curente"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "M-am răzgândit"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Marchează ca citit"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr ""
+"Sincronizare în desfășurare. Articolul trebuie să apară in orice secundă"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Șterge (cu Feed-uri)"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "Derulați in sus"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nu a fost selectat nici un articol"
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Salvează imaginea ca"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Adaugă Tag:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Taguri:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "adaugă Tag"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Ignoră toate erorile tls incepând de acum"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Te rog selectează mai întăi un serviciu"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Te rog introdu un nume de utilizator valid"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Te rog introdu o parolă valid"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Te rog introdu un URL valid"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Te rog introdu datele pentru login"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Scuze, ceva a mers prost."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Nume de utilizator sau parolă incorectă"
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr "Nici o conexiune la server. Verifică conexiunea la internet și URL-ul!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "Accesul API este dezactivat pe acest server. Te rog activeazăl!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Neautorizat pentru accesul la URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Nu este nici un certificat CA valabil!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr "Te rog instalează plugin-ul \"api_feedreader\" în instanța tt-rss"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nu a fost selectat nici un articol"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Atașări"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader efectuează o curățare a bazei de date. Nu ar trebuii să dureze "
+"prea mult. "
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Salvează imaginea ca"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interfață"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Interne"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Distribuie"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Lista cu feed-uri:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Arată doar feed-uri"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Arată doar necitit"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Sortează lista de feed-uri in funcție de"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Primit"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabetic"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Temă"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Întuneric"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "Elementar"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Lista articolelor "
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Sortează articolele in funcție de"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Cel mai nou primul"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Perspectiva articolului:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Mod implicit"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Primăvară"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Miezul nopții"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergament"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Dimensiunea fontului"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Mic"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Mare"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Uriaș"
-
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sincronizare:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Numărul de articole"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Fiecare (minut)"
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Bază de date:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Șterge articolul după"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Niciodată"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 săptămână"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 lună"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 luni"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funcționalitate adițională:"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Șterge \"%s\""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Acaparator pentru conținut"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Feed-ul \"%s\" a fost șters"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Cont nou"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Autostart pentru FeedReader"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Nici o previzualizare disponibilă"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Părăsește modul de vizualizare pe tot ecranul"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Nici un text disponibil pentru acest articol :("
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Unde se află feed-urile tale?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "postat de către: %s, "
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-"Te rog selectează serviciul de RSS pe care îl folosești si autentifică-te "
-"pentru a continua"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Categorie:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Adaugă"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Fișier OPML:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Selectează fișierul OPML"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importă"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Adaugă feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importă OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Șterge doar din %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Ieși"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Lista cu feed-uri:"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Lista articolelor "
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Marchează articolul citit sau necitit"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Astăzi"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Ieri"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Ieșire din cont"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Despre FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Nici o previzualizare disponibilă"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Nici un text disponibil pentru acest articol :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "postat de către: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Client RSS"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Citește feed-uri din servicii web"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "FeedReader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "Autostart pentru FeedReader"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categorii=Rețea;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Client RSS pentru diferite servicii web"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-"FeedReader este un program creat pentru a completa un cont RSS web-based "
-"deja existent."
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Servicii curente suportate:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Combină toate avantajele unui serviciu web-based cum ar fi sincronizarea pe "
-"toate dispozitivele cu tot ce aștepți de la o aplicație desktop modernă: "
-"notificări pentru Desktop, căutare rapidă si filtre, tagging, sharing pentru "
-"servicii de tip ,,read-it-later\" precum pocket sau instapaper, comenzi "
-"rapide la îndemână și o bază de date în care poți păstra articolele vechi "
-"atât timp cât dorești."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Nici unul dintre articolele %i din baza de date nu se potrivește cu "
-#~ "filtrul curent"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit sau marcat care să se "
-#~ "potrivească cu \"%s în feed-ul \"%s\""
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit sau marcat în feed-ul \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit și marcat care să se "
-#~ "potrivească cu \"%s\" în tag-u \"%s\""
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit si marcat in tag-ul \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Nu au putut fi găsite articole necitite sau marcate care să se "
-#~ "potrivească cu \"%s\" în categoria \"%s\""
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu au putut fi găsite articole necitite sau marcate în categoria \"%s\""
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu au putut fi găsite articole necitite sau marcate care să se "
-#~ "potrivească cu \"%s\""
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Nu a fost găsit nici un articol necitit sau marcat"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr ""
diff --git a/po/ro_RO.po b/po/ro_RO.po
index 50f736fd..137b7a65 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-05-15 08:53+0000\n"
"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/dev-feedreader/"
"feedreader/language/ro_RO/)\n"
@@ -20,1060 +20,875 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Numele utilizatorului:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Parola:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Despre FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Autentificare"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Autorizare HTTP"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Ieșire din cont"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Articole noi"
+
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "în așteptare"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Ieri"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Categoria \"%s\" a fost eliminată"
+
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Marchează ca citit"
+
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Redenumește"
+
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Elimină"
+
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Elimină (cu Feed-uri)"
+
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "redenumește"
+
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "adaugă"
+
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Ieși"
+
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Numele utilizatorului sau parolă incorectă"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Client RSS"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Te rog introdu o parolă valid"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Te rog introdu un nume de utilizator valid"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Scuze, ceva a mers prost."
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Unde se află feed-urile tale?"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Articole noi"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Te rog selectează serviciul de RSS pe care îl folosești si autentifică-te "
+"pentru a continua"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Marchează articolul citit sau necitit"
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Necategorizat"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Marchează articolul citit sau necitit"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Arată doar articolele necitite"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Categorie:"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Articole noi"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Adaugă"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Arată doar articolele marcate cu stea"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Arată doar articolele marcate cu stea"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Arată doar articolele necitite"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importă"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr "Necategorizat"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Adaugă feed"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Elimină \"%s\""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importă OPML"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Tagul \"%s\" a fost eliminat"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Interfață"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Feed-ul \"%s\" a fost eliminat"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Interne"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Categoria \"%s\" a fost eliminată"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Distribuie"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Toate articolele"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Lista cu feed-uri:"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Taguri"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Arată doar feed-uri"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Categori"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Arată doar necitit"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Lista cu feed-uri:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Tag nou"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Primit"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Categorie nouă"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabetic"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Adaugă Tag:"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Temă"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Taguri:"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "adaugă Tag"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Întuneric"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader efectuează o curățare a bazei de date. Nu ar trebuii să dureze "
-"prea mult. "
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "Elementar"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
-"Sincronizare în desfășurare. Articolul trebuie să apară in orice secundă"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Lista articolelor "
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "Derulați in sus"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Sortează articolele in funcție de"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Articole noi"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Data"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-"Nu a fost găsit nici un articol care să se potrivească cu \"%s\" din feed-ul "
-"\"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol necitit in feed-ul \"%s"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-"Nu a putut fi găsit nici un articol marcat care să se potriveasca cu \"%s\" "
-"în feed-ul \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol marcat \"%s\""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Perspectiva articolului:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Nu a putut fi găsit nici un articol care să se potriveasca cu \"%s\" in feed-"
-"ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Mod implicit"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol în feed-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Primăvară"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
-"Nu a putut fi găsit nici un articol necitit care să se potrivească cu \"%s\" "
-"din tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Miezul nopții"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol necitit în tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergament"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-"Nu a putut fi găsit nici un articol marcat care să se potrivească cu \"%s\" "
-"în tag-ul \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Nu a putut fi găsit nici un articol în tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sincronizare:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Numărul de articole"
+
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-"Nu a putut fi găsit nici un articol care să se potrivească cu \"%s\" în tag-"
-"ul \"%s\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Nu au putut fi găsite articole în tag-ul \"%s\""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Bază de date:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nu au putut fi găsite articole necitite care să se potrivească cu \"%s\" în "
-"categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Șterge articolul după"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Nu au putut fi găsite articole necitite în categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Niciodată"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nu au putut fi găsite articole marcate care să se potrivească cu \"%s\" în "
-"categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 săptămână"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Nu au putut fi găsite articole marcate în categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 lună"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
-"Nu au putut fi găsite articole care să se potrivească cu \"%s\" în categoria "
-"\"%s\""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 luni"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Nu au fost găsite articole in categoria \"%s\""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funcționalitate adițională:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr "Nu au fost găsite articole necitite care să se potrivească cu \"%s\""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Acaparator pentru conținut"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Nu a fost găsit nici un articol necitit"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "Nu au fost găsite articole marcate care să se potrivească cu \"%s\""
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Nu a fost găsit nici un articol marcat"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Nu au fost găsite articole care să se potrivească cu \"%s\""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Nu au fost găsite articole"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Schimbă contul?"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Marchează articolul cu sau fără stea"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Ești pe cale să schimbi contul pe care dorești ca FeedReader să-l "
+"folosească. Asta înseamnă ștergere tuturor datelor ale contului vechi"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Marchează articolul citit sau necitit"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Cont nou"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Citește articolul pe tot ecranul"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Se așteaptă terminarea sincronizării curente"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "M-am răzgândit"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Totul"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Arată toate articolele"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Necitit"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Arată doar articolele necitite"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Marcat cu stea"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Arată doar articolele marcate cu stea"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Tăguiește articolul"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Dă share articolului"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Caută articole"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Dă share articolului"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Setări"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Atașări"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Citește articolul pe tot ecranul"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Actualizați Feed-urile"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Tagul \"%s\" a fost eliminat"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Caută articole"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Setări"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Elimină doar din %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Redenumește"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Feed-ul \"%s\" a fost eliminat"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Elimină"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Părăsește modul de vizualizare pe tot ecranul"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "redenumește"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Toate articolele"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "adaugă"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Taguri"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Cont nou"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Categori"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Schimbă contul?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr ""
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Tag nou"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Categorie nouă"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-"Ești pe cale să schimbi contul pe care dorești ca FeedReader să-l "
-"folosească. Asta înseamnă ștergere tuturor datelor ale contului vechi"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Cont nou"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Se așteaptă terminarea sincronizării curente"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "M-am răzgândit"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Marchează ca citit"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr ""
+"Sincronizare în desfășurare. Articolul trebuie să apară in orice secundă"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Elimină (cu Feed-uri)"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "Derulați in sus"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Nu a fost selectat nici un articol"
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Salvează imaginea ca"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Adaugă Tag:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Taguri:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "adaugă Tag"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Ignoră toate erorile tls incepând de acum"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Te rog selectează mai întăi un serviciu"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Te rog introdu un nume de utilizator valid"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Te rog introdu o parolă valid"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Te rog introdu un URL valid"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Te rog introdu datele pentru login"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Scuze, ceva a mers prost."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Nume de utilizator sau parolă incorectă"
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr "Nici o conexiune la server. Verifică conexiunea la internet și URL-ul!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "Accesul API este dezactivat pe acest server. Te rog activeazăl!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Neautorizat pentru accesul la URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Nu este nici un certificat CA valabil!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr "Te rog instalează plugin-ul \"api_feedreader\" în instanța tt-rss"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Nu a fost selectat nici un articol"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Atașări"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader efectuează o curățare a bazei de date. Nu ar trebuii să dureze "
+"prea mult. "
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Salvează imaginea ca"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Interfață"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Interne"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Distribuie"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Lista cu feed-uri:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Arată doar feed-uri"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Arată doar necitit"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Sortează lista de feed-uri in funcție de"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Primit"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabetic"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Temă"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Întuneric"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "Elementar"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Lista articolelor "
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Sortează articolele in funcție de"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Data"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Cel mai nou primul"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Perspectiva articolului:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Mod implicit"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Primăvară"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Miezul nopții"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergament"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Dimensiunea fontului"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Mic"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Mare"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Uriaș"
-
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sincronizare:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Numărul de articole"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Fiecare (minut)"
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Bază de date:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Șterge articolul după"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Niciodată"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 săptămână"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 lună"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 luni"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funcționalitate adițională:"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Elimină \"%s\""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Acaparator pentru conținut"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Feed-ul \"%s\" a fost eliminat"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Cont nou"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Autostart pentru FeedReader"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Nici o previzualizare disponibilă"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Părăsește modul de vizualizare pe tot ecranul"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Nici un text disponibil pentru acest articol :("
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Unde se află feed-urile tale?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "postat de către: %s, "
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-"Te rog selectează serviciul de RSS pe care îl folosești si autentifică-te "
-"pentru a continua"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Categorie:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Adaugă"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Fișier OPML:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Selectează fișierul OPML"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importă"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Adaugă feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importă OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Elimină doar din %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Ieși"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Lista cu feed-uri:"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Lista articolelor "
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Marchează articolul citit sau necitit"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Astăzi"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Ieri"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Ieșire din cont"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Despre FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Nici o previzualizare disponibilă"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Nici un text disponibil pentru acest articol :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "postat de către: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Client RSS"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Citește feed-uri din servicii web"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "FeedReader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "Autostart pentru FeedReader"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categorii=Rețea;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Client RSS pentru diferite servicii web"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-"FeedReader este un program creat pentru a completa un cont RSS web-based "
-"deja existent."
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Servicii curente suportate:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Combină toate avantajele unui serviciu web-based cum ar fi sincronizarea pe "
-"toate dispozitivele cu tot ce aștepți de la o aplicație desktop modernă: "
-"notificări pentru Desktop, căutare rapidă si filtre, tagging, sharing pentru "
-"servicii de tip ,,read-it-later\" precum pocket sau instapaper, comenzi "
-"rapide la îndemână și o bază de date în care poți păstra articolele vechi "
-"atât timp cât dorești."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr ""
-#~ "Nici unul dintre articolele %i din baza de date nu se potrivește cu "
-#~ "filtrul curent"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit sau marcat care să se "
-#~ "potrivească cu \"%s în feed-ul \"%s\""
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit sau marcat în feed-ul \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit și marcat care să se "
-#~ "potrivească cu \"%s\" în tag-u \"%s\""
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu a putut fi găsit nici un articol necitit si marcat in tag-ul \"%s\""
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Nu au putut fi găsite articole necitite sau marcate care să se "
-#~ "potrivească cu \"%s\" în categoria \"%s\""
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu au putut fi găsite articole necitite sau marcate în categoria \"%s\""
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "Nu au putut fi găsite articole necitite sau marcate care să se "
-#~ "potrivească cu \"%s\""
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Nu a fost găsit nici un articol necitit sau marcat"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
index 9518c3d1..9471731a 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -3,1051 +3,908 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Exalm <exalm7659@gmail.com>, 2017
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015
-# Grigorii Horos <horosgrisa@gmail.com>, 2016
+# Grigorii Horos <horosgrisa@gmail.com>, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: Russian (http://www.transifex.com/dev-feedreader/feedreader/"
-"language/ru/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-02-26 06:39+0000\n"
+"Last-Translator: Andrey <andrey@mailbox.org>\n"
+"Language-Team: Russian "
+"<https://hosted.weblate.org/projects/feedreader/translations/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
-"%100>=11 && n%100<=14)? 2 : 3);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Имя пользователя:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Пароль:"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
+"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.20-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "О FeedReader"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr "Войти"
+msgstr "Вход"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Выход"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "HTTP авторизация"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Получение лент и категорий"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Получение статей"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Получение избранных статей"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Получение статей с тегами"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Получение непрочитанных статей"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Новые статьи"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "1 новая статья (%u непрочитанных)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "%u новых статей (%u непрочитанных)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "ожидание"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Вчера"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Категория \"%s\" удалена"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Отметить как прочитанное"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Переименовать"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Удалить"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Удалить (с лентами)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "переименовать"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "добавить"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Добавить учетные записи"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Неверное имя пользователя или пароль"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Основное"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Обновить"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "RSS клиент"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Поиск"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Выход"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Список лент"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Выбрать следующий элемент"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Выбрать предыдущий элемент"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Свернуть/Развернуть категории"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Введите допустимый пароль"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Отметить выбранное как прочитанное"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "Введите допустимое имя пользователя"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Список статей"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "Извините, что-то пошло не так."
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Выбрать следующую/предыдущую статью"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Новые статьи"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr "Переключить статус прочтения для выбранной статьи"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Пометить как (не)прочитанное"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
+msgstr "Переключить отметку для выбранной статьи"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Пометить как (не)прочитанное"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Открыть ссылку выделенной статьи"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Показать только непрочитанное"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Прокрутить вверх/вниз"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Новые статьи"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Центрировать выделенную статью"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Показать только отмеченные статьи"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Статья"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Показать только отмеченные статьи"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Прокрутить вверх/вниз"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Показать только непрочитанное"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Где ваши ленты?"
+
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Пожалуйста, укажите RSS-сервис, который вы используете, и войдите в него для "
+"продолжения."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Без категории"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Удалить «%s»"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "Ссылка:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Метка «%s» удалена"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Категория:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Лента «%s» удалена"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Добавить"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Категория «%s» удалена"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "Файл OPML:"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Все статьи"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "Выберите файл OPML"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Метки"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Импортировать"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Категории"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Добавить ленту"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Список лент"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Импортировать OPML"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Новая метка"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Внешний вид"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Новая категория"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Внутренние"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Добавить метку:"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Поделиться"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Метки:"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Список лент:"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "добавить метку"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Показать только ленту"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader очищает базу данных.\n"
-"Это не займёт много времени."
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Показать только непрочтенные"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Синхронизация. Статьи скоро будут загружены."
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Сортировать список лент по"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "Прокрутить вверх"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Принятым"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Новые статьи"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Алфавиту"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr "Нет непрочитанных статей с сочетанием «%s» в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Оформление"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Нет непрочитанных статей в ленте «%s»"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr "Нет отмеченных статей с сочетанием «%s» в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Тёмное"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Нет отмеченных статей в ленте: «%s»"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "Elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr "Нет статей с сочетанием «%s» в ленте «%s»"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Список статей:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Нет статей в ленте «%s»"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Сортировать статьи по"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr "Нет непрочитанных статей с сочетанием «%s» с меткой «%s»"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Дате"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Нет непрочитанных статей с меткой «%s»"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Сначала старые"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr "Нет отмеченных статей с сочетанием «%s» с меткой «%s»"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Нет отмеченных статей с меткой «%s»"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr "Нет статей с сочетанием «%s» с меткой «%s»"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Просмотр статьи:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Нет статей с меткой «%s»"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Стандарт"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr "Нет непрочитанных статей с сочетанием «%s» в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Весна"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Нет непрочитанных статей в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Полночь"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr "Нет отмеченных статей с сочетанием «%s» в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Пергамент"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Нет отмеченных статей в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr "Нет статей с сочетанием «%s» в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Синхронизировать:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Нет статей в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Количество статей"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr "Нет непрочитанных статей в категории «%s»"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Нет непрочитанных статей"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "База данных:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "Нет отмеченных статей с сочетанием: «%s»"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Удалять статьи через"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Нет отмеченных статей"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Никогда"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Нет статей с сочетанием «%s»"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 недели"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Статьи не найдены"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 месяца"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Пометить статью"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 месяцев"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Пометить как (не)прочитанное"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Дополнительные возможности:"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Читать статью в полноэкранном режиме"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Граббер контента"
+
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr ""
+
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Встроенный медиаплеер"
+
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Учетные записи системы"
+
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "Учётные записи FeedReader"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Изменить учётную запись?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Вы запросили замену учётной записи в FeedReader.\n"
+"Это действие удалит все локальные данные предыдущей учётной записи."
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Новая учётная запись"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Ожидание завершения синхронизации"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Я передумал"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Все"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Показать все статьи"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Свежие"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Показать только непрочитанное"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
-msgstr "С метками"
+msgstr "Избранные"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
-msgstr "Показать только отмеченные статьи"
+msgstr "Показать только избранные статьи"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Метка статьи"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Обновить ленты"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Поделиться статьёй"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Поиск статей"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Поделиться статьёй"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Параметры"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Вложения"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Читать статью в полноэкранном режиме"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Обновить ленты"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Метка «%s» удалена"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Удалить ленту"
+
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Поиск статей"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Удалить только из %s"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Параметры"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr "Удалена лента: %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Переименовать"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Выйти из полноэкранного режима"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Удалить"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Все статьи"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "Переименовать"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Метки"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "добавить"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Категории"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Новая учётная запись"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Ленты"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Изменить учётную запись?"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Новая метка"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Новая категория"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Нет статей"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Нет непрочитанных статей"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Нет избранных статей"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Нет статей"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Идёт синхронизация. Статьи скоро появятся."
+
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "Прокрутить вверх"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Статья не выбрана."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-"Вы запросили замену учётной записи в FeedReader.\n"
-" Это действие удалит все локальные данные предыдущей учётной записи."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Новая учётная запись"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Сохранить изображение как"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Ожидание завершения синхронизации"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Отменить"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Я передумал"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Добавить метку:"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Пометить как прочтенное"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Метки:"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Удалить (с лентами)"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "добавить метку"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Игнориривать все ошибки TLS"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Сперва выберите сервис"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Введите допустимое имя пользователя"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Введите допустимый пароль"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
-msgstr "Введите корректный URL"
+msgstr "Введите допустимую ссылку"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Введите ваш логин"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Извините, что-то пошло не так."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Введенный логин или пароль не правильный."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
"Нет подключения к серверу. Проверьте соединение с интернетом и адрес сервера!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "API сервера не доступно. Сперва нужно его включить!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
-msgstr "Нет доступа к URL"
+msgstr "Не авторизованы для доступа к ссылке"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
-msgstr "Нет доступных CA сертификатов!"
+msgstr "Нет доступного CA сертификата!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr "Пожалуйста установите плагин «api_feedreader» на вашем TT-RSS!"
+msgstr "Пожалуйста, установите плагин «api_feedreader» на вашем Tiny Tiny RSS!"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Статья не выбрана."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Вложения"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader очищает базу данных.\n"
+"Это не займёт много времени."
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Сохранить картинку как…"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Внешний вид"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Внутренние"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Поделится"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Список лент"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Показать только ленту"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Показать только не прочтенные"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Отсортировать по"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Принятым"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Алфавиту"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Оформление"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Dark"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "Elementary"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Список статей:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Сортировать статьи по:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Дате"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Сперва новые"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Просмотр статьи:"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Добавить метку"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Стандарт"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Распечатать статью"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Весна"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Поделиться статьёй"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Полночь"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Удалить «%s»"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Пергамент"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Лента «%s» удалена"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Размер шрифта"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Маленький"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Предпросмотр недоступен"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Средний"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Текст статьи недоступен :("
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Большой"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "опубликовано: %s, "
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Огромный"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Сохранить"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Открыть в браузере"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Имя пользователя:"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Синхронизировать:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Пароль:"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Количество статей"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Неверное имя пользователя или пароль"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Каждые (Минут)"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "ожидание"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "База данных:"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
+"Привет,\n"
+"\n"
+"Посмотри, какую интересную статью я только что прочитал: $URL"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Удалить статьи после"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Ограничение: "
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Никогда"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 недели"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 месяца"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 месяцев"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Дополнительные возможности:"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Граббер контента"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Новая учётная запись"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader автозапуск"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Выйти из полноэкранного режима"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Где ваши ленты?"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-"Пожалуйста укажите RSS сервис, который вы используете, и войдите в него для "
-"продолжения."
+"Привет,\n"
+"\n"
+"Посмотри, какую интересную статью я только что прочитал: $URL\n"
+"\n"
+"— отправлено из FeedReader"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Категория"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Кому:"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Добавить"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Отправить"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Файл OPML:"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Написать Email"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Выбрать файл OPML"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
+msgstr ""
+"Привет, посмотри, какую интересную статью я только что прочитал — Отправлено "
+"из FeedReader"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Импортировать"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Добавить ленту"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr "Информация: Для работы этого плагина должен быть установлен Telegram."
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Импортировать OPML"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Удалить только из %s"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "Адрес freshRSS:"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Выход"
-
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Список лент"
-
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Готово"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Список статей:"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr "URL-адрес Nextcloud:"
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Пометить как (не)прочитанное"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Cегодня"
-
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Вчера"
-
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Выйти"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "О программе"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Предпросмотр не доступен"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Текст статьи не доступен 😞"
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "Опубликовано: %s,"
-
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "RSS клиент"
-
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Читайте статьи с RSS-сервисов"
-
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "FeedReader"
-
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "FeedReader автозапуск"
-
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categories=Network;Feed;"
-
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Клиент для RSS сервисов"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Адрес Tiny Tiny RSS:"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-"FeerReader — это программа предназначенная для дополнения уже существующих "
-"онлайн RSS-сервисов"
-
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "На данный момент поддерживаются следующие сервисы:"
-
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
-
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "Feedly"
-
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "ownCloud"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "InoReader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-"Она сочетает в себе преимущества онлайн сервисов, такие как синхронизация "
-"между всеми вашими устройствами со всем, что вы ожидаете он настольного "
-"приложения: нотификации, быстрый поиск и фильтрование, метки, отправка в "
-"сервисы для отложеного чтения такие как Pocket или Instapaper, удобные "
-"комбинации клавиш и база данных, в которой хранятся ваши статьи столько, "
-"сколько вы хотите."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr "Не одна из %i статей не попадает в указанный фильтр."
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Нет непрочитанных и отмеченных статей с сочетанием «%s» в ленте «%s»"
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr "Нет непрочитанных и отмеченных статей в ленте «%s»"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Нет непрочитанных и отмеченных статей с сочетанием «%s» с меткой «%s»"
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr "Нет непрочитанных и отмеченных статей с меткой «%s»"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Нет непрочитанных и отмеченных статей с сочетанием «%s» в категории «%s»"
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr "Нет непрочитанных и отмеченных статей в категории «%s»"
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr "Нет непрочитанных и отмеченных статей с сочетанием «%s»"
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Нет непрочитанных и отмеченных статей"
+
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Переключить отметку на выбранной статье"
diff --git a/po/rue.po b/po/rue.po
index 56ff8671..413f5512 100644
--- a/po/rue.po
+++ b/po/rue.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/si.po b/po/si.po
index 56ff8671..413f5512 100644
--- a/po/si.po
+++ b/po/si.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/sk.po b/po/sk.po
index 56ff8671..413f5512 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/sl.po b/po/sl.po
index 56ff8671..413f5512 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/sma.po b/po/sma.po
index 56ff8671..413f5512 100644
--- a/po/sma.po
+++ b/po/sma.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/sq.po b/po/sq.po
index eca4ba96..4c9c4aa5 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: feedreader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"PO-Revision-Date: 2015-08-10 09:06+0000\n"
"Last-Translator: Indrit Bashkimi <indrit.bashkimi@gmail.com>\n"
"Language-Team: Albanian <sq@li.org>\n"
@@ -18,1005 +18,948 @@ msgstr ""
"X-Launchpad-Export-Date: 2016-01-13 05:53+0000\n"
"X-Generator: Launchpad (build 17886)\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-#, fuzzy
-msgid "Username:"
-msgstr "Emri i përdoruesit:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Fjalëkalimi:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "URL i OwnCloud:"
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
+#: src/Backend/FeedServer.vala:231
#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "URL i TinyTinyRSS:"
+msgid "Getting articles"
+msgstr "Artikuj të ri"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+#, fuzzy
+msgid "Getting starred articles"
+msgstr "Artikuj të ri"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+#, fuzzy
+msgid "Getting tagged articles"
+msgstr "Artikuj të ri"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+#, fuzzy
+msgid "Getting unread articles"
+msgstr "Artikuj të ri"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Artikuj të ri"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:27
+#, fuzzy, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Ka 1 artikull të ri"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
+#: src/Notification.vala:29
+#, fuzzy, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Ka %u artikuj të ri"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+#, fuzzy
+msgid "Rename"
+msgstr "Emri i përdoruesit:"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+#, fuzzy
+msgid "rename"
+msgstr "Emri i përdoruesit:"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Emri i përdoruesit ose fjalëkalimi i pasaktë"
+#: src/Widgets/SharePopover.vala:62
+#, fuzzy
+msgid "Add accounts"
+msgstr "Llogari e re"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:37
+#, fuzzy
+msgid "Feed List"
+msgstr "Feedly"
+
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Shkruani një fjalëkalim të vlefshëm"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:54
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Ju lutemi vendosni një emër përdoruesi të vlefshëm"
+msgid "Article List"
+msgstr "Artikuj të ri"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Artikuj të ri"
+#: src/Widgets/ShortcutsWindow.vala:64
+#, fuzzy
+msgid "Toggle reading status of selected article"
+msgstr "Ka 1 artikull të ri"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:65
+#, fuzzy
+msgid "Toggle marking of selected article"
msgstr "Ka 1 artikull të ri"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Ka %u artikuj të ri"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Artikuj të ri"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
+#: src/Widgets/ShortcutsWindow.vala:79
#, fuzzy
-msgid "Getting starred articles"
+msgid "Article View"
msgstr "Artikuj të ri"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Artikuj të ri"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Artikuj të ri"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-#, fuzzy
-msgid "All Articles"
-msgstr "Artikuj të ri"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr ""
+
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/FeedList.vala:486
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Ndërfaqja"
+
+#: src/Widgets/SettingsDialog.vala:49
#, fuzzy
-msgid "Feeds"
-msgstr "Feedly"
+msgid "Internals"
+msgstr "Ndërfaqja"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/SettingsDialog.vala:71
+#, fuzzy
+msgid "Feed List:"
+msgstr "Feedly"
+
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/SettingsDialog.vala:85
+#, fuzzy
+msgid "Sort Feed List by"
+msgstr "Feedly"
+
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
+
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-"FeedReader po pastron bazën e të dhënave.\n"
-"Kjo nuk duhet të zgjasë shumë."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+#: src/Widgets/SettingsDialog.vala:95
#, fuzzy
-msgid "No Articles"
+msgid "Article List:"
msgstr "Artikuj të ri"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+#, fuzzy
+msgid "Sort articles by"
+msgstr "Artikuj të ri"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+#, fuzzy
+msgid "Article View:"
+msgstr "Artikuj të ri"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Sinkronizo:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+#, fuzzy
+msgid "Number of articles"
+msgstr "Artikuj të ri"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Kurrë"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 Javë"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Muaj"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Muaj"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Funksionalitet shtesë:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+#, fuzzy
+msgid "System Accounts"
+msgstr "Ndrysho llogarinë"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
#, fuzzy
-msgid "Mark article (un)read"
-msgstr "Ka %u artikuj të ri"
+msgid "FeedReader Accounts"
+msgstr "FeedReader"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/ResetPage.vala:33
+#, fuzzy
+msgid "Change Account?"
+msgstr "Llogari e re"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Llogari e re"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Duke pritur përfundimin e sinkronizimit të tanishëm"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Ndryshova mendje"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
#, fuzzy
msgid "Show all articles"
msgstr "Artikuj të ri"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-#, fuzzy
-msgid "Tag Article"
-msgstr "Artikuj të ri"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr "Kërko artikuj"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-#, fuzzy
-msgid "Share Article"
-msgstr "Kërko artikuj"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Parametrat"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Kërko artikuj"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Parametrat"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr ""
+
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:242
#, fuzzy
-msgid "Rename"
-msgstr "Emri i përdoruesit:"
+msgid "All Articles"
+msgstr "Artikuj të ri"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr ""
+
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
+#: src/Widgets/FeedList.vala:487
#, fuzzy
-msgid "rename"
-msgstr "Emri i përdoruesit:"
+msgid "Feeds"
+msgstr "Feedly"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr ""
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
#, fuzzy
-msgid "Add accounts"
-msgstr "Llogari e re"
+msgid "No Articles"
+msgstr "Artikuj të ri"
-#: src/Widgets/ResetPage.vala:33
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
#, fuzzy
-msgid "Change Account?"
-msgstr "Llogari e re"
+msgid "No unread articles"
+msgstr "Artikuj të ri"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+#, fuzzy
+msgid "No starred articles"
+msgstr "Artikuj të ri"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+#, fuzzy
+msgid "No articles"
+msgstr "Artikuj të ri"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Llogari e re"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Duke pritur përfundimin e sinkronizimit të tanishëm"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Asnjë artikull i zgjedhur."
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Ndryshova mendje"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
+#: src/Widgets/ArticleView.vala:790
+#, fuzzy
+msgid "Save image as"
+msgstr "Kërko artikuj"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr ""
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Zgjidhni një shërbim së pari"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Ju lutemi vendosni një emër përdoruesi të vlefshëm"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Shkruani një fjalëkalim të vlefshëm"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
#, fuzzy
msgid "Please enter a valid URL"
msgstr "Ju lutemi vendosni një emër përdoruesi të vlefshëm"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
#, fuzzy
msgid "Please enter your Login details"
msgstr "Ju lutemi vendosni një emër përdoruesi të vlefshëm"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "O emri juaj i përdoruesit o fjalëkalimi juaj janë të pasaktë."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Asnjë artikull i zgjedhur."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader po pastron bazën e të dhënave.\n"
+"Kjo nuk duhet të zgjasë shumë."
-#: src/Widgets/ArticleView.vala:768
+#: src/Widgets/ArticleViewHeader.vala:68
#, fuzzy
-msgid "Save image as"
-msgstr "Kërko artikuj"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Ndërfaqja"
+msgid "Tag article"
+msgstr "Artikuj të ri"
-#: src/Widgets/SettingsDialog.vala:39
+#: src/Widgets/ArticleViewHeader.vala:82
#, fuzzy
-msgid "Internals"
-msgstr "Ndërfaqja"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+msgid "Print article"
+msgstr "Artikuj të ri"
-#: src/Widgets/SettingsDialog.vala:59
+#: src/Widgets/ArticleViewHeader.vala:93
#, fuzzy
-msgid "Feed List:"
-msgstr "Feedly"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr ""
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr ""
+msgid "Share article"
+msgstr "Kërko artikuj"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr ""
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "S'ka tekst për këtë artikull :("
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-#, fuzzy
-msgid "Article List:"
-msgstr "Artikuj të ri"
-
-#: src/Widgets/SettingsDialog.vala:85
-#, fuzzy
-msgid "Sort articles by"
-msgstr "Artikuj të ri"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
#, fuzzy
-msgid "Article View:"
-msgstr "Artikuj të ri"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr ""
+msgid "Username:"
+msgstr "Emri i përdoruesit:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Fjalëkalimi:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Emri i përdoruesit ose fjalëkalimi i pasaktë"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Sinkronizo:"
-
-#: src/Widgets/SettingsDialog.vala:130
-#, fuzzy
-msgid "Number of articles"
-msgstr "Artikuj të ri"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Kurrë"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 Javë"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 Muaj"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 Muaj"
-
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Funksionalitet shtesë:"
-
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
+#: plugins/share/Wallabag/WallabagSetup.vala:154
#, fuzzy
-msgid "System Accounts"
-msgstr "Ndrysho llogarinë"
+msgid "Please fill in the password."
+msgstr "Shkruani një fjalëkalim të vlefshëm"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
+#: plugins/share/Wallabag/WallabagSetup.vala:161
#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr ""
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
+msgid "Please fill in the username."
+msgstr "Ju lutemi vendosni një emër përdoruesi të vlefshëm"
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Feedly"
-
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Artikuj të ri"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Ka 1 artikull të ri"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "URL i OwnCloud:"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr ""
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "S'ka tekst për këtë artikull :("
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+#, fuzzy
+msgid "Tiny Tiny RSS URL:"
+msgstr "URL i TinyTinyRSS:"
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
#, fuzzy
-msgid "feedreader"
-msgstr "FeedReader"
+#~ msgid "Mark article (un)read"
+#~ msgstr "Ka %u artikuj të ri"
-#: data/feedreader-autostart.desktop.in:3
#, fuzzy
-msgid "FeedReader Autostart"
-msgstr "FeedReader"
+#~ msgid "Save Article as PDF"
+#~ msgstr "Kërko artikuj"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#, fuzzy
+#~ msgid "Feed-List"
+#~ msgstr "Feedly"
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr ""
+#, fuzzy
+#~ msgid "Article-List"
+#~ msgstr "Artikuj të ri"
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#, fuzzy
+#~ msgid "feedreader"
+#~ msgstr "FeedReader"
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#, fuzzy
+#~ msgid "FeedReader Autostart"
+#~ msgstr "FeedReader"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#~ msgid "Tiny Tiny RSS"
+#~ msgstr "Tiny Tiny RSS"
-#: data/feedreader.appdata.xml.in:17
#, fuzzy
-msgid "feedly"
-msgstr "Feedly"
+#~ msgid "feedly"
+#~ msgstr "Feedly"
-#: data/feedreader.appdata.xml.in:18
#, fuzzy
-msgid "ownCloud"
-msgstr "OwnCloud"
-
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
-
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "ownCloud"
+#~ msgstr "OwnCloud"
#~ msgid "no Author"
#~ msgstr "pa Autor"
diff --git a/po/sr.po b/po/sr.po
index 56ff8671..413f5512 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 7a773adb..6cd97516 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -4,602 +4,603 @@
#
# Translators:
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014
-# Mikael Nyberg, 2016
+# Mikael Nyberg, 2016-2017
# Mikael Nyberg, 2016
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: Swedish (http://www.transifex.com/dev-feedreader/feedreader/"
-"language/sv/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-01-24 12:31+0000\n"
+"Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
+"Language-Team: Swedish <https://hosted.weblate.org/projects/feedreader/"
+"translations/sv/>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Användarnamn:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Lösenord:"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.19-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Om FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Logga in"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Logga ut"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "HTTP-Autentisering"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Hämtar flöden och kategorier"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Hämtar artiklar"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Hämtar favoritartiklar"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Hämtar taggade artiklar"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Hämtar olästa artiklar"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Nya artiklar"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "Det finns 1 ny artikel (%u olästa)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "Det finns %u nya artikel (%u olästa)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "väntar"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Igår"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Kategorin \"%s\" borttagen"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Markera som läst"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Byt namn"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Ta bort"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Ta bort (med nyhetsflöden)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "byt namn"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "lägg till"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Lägg till konton"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Användarnamn eller lösenord är fel"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Allmänt"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Uppdatera"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Sök"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Avsluta"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Flödeslista"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Välj nästa objekt"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Välj föregående objekt"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Fäll ihop/expandera kategorier"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Ange ett giltigt lösenord"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Markera nuvarande val som läst"
+
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Artikellista"
+
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Välj nästa/föregående artikel"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Ange ett giltigt användarnamn"
+msgid "Toggle reading status of selected article"
+msgstr "Växla vald artikel som läst/oläst"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Something went wrong."
-msgstr "Tyvärr gick något fel."
+msgid "Toggle marking of selected article"
+msgstr "Växla vald artikel som läst/oläst"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Nya artiklar"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Öppna URL:en för den valda artikeln"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Markera artikeln som läst/oläst"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Rulla hela vägen upp/ned"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Markera artikeln som läst/oläst"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Centrera den valda artikeln"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Visa endast olästa artiklar"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Artikelvy"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Nya artiklar"
-
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Visa endast favoriserade artiklar"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "skrolla upp/ner"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Visa endast favoriserade artiklar"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Var är dina nyhetsflöden?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Visa endast olästa artiklar"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "Välj den RSS-tjänst du använder och logga in för att komma igång."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Okategoriserade"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Ta bort \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Taggen \"%s\" borttagen"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Kategori:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Nyhetsflödet \"%s\" borttaget"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Lägg till"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Kategorin \"%s\" borttagen"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "OPML-fil:"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Alla artiklar"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "Välj OPML-fil"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Taggar"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Importera"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Kategorier"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Lägg till flöde"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Importera OPML"
+
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Gränssnitt"
+
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Inställningar"
+
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Dela"
+
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr "Flödeslista:"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Ny tagg"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Visa endast nyhetsflöden"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Ny kategori"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Visa endast olästa"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Lägg till etikett:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Sorta feedlista efter"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Etiketter:"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Mottaget"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "lägg till etikett"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabetiskt"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader städar upp i databasen.\n"
-"Detta bör inte ta lång tid."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Tema"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Synkronisering pågår. Artiklar bör dyka upp när som helst."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "skrolla upp"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Mörk"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Nya artiklar"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "grundläggande"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Artikellista:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Sortera artiklar efter"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Datum"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Äldsta först"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Påverkar endast kolumnen ”Oläst”"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Markera som läst vid bläddring"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Artikelvy:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Standard"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Vår"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Midnatt"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Pergament"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Typsnittsfamilj"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Synkronisera:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Antal artiklar"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Intervall i minuter (0 = AV)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Databas:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Ta bort artiklar efter"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Aldrig"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 vecka"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 månad"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 månader"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Ytterligare funktionalitet:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Artikelhämtare"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Hämta bilder"
+
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Inbyggd mediaspelare"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Markera artikeln som favoriserad/icke favoriserad"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Systemkonton"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Markera artikeln som läst/oläst"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader-konton"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Ändra konto?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"Du håller på att ändra kontot som FeedReader ska använda.\n"
+" Detta innebär att all lokal data från ditt gamla konto kommer att tas bort."
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Nytt konto"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Väntar på att pågående synkronisering ska slutföras"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Jag ändrade mig"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Alla"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Visa alla artiklar"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Olästa"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Visa endast olästa artiklar"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "Favoriter"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "Visa endast favoriserade artiklar"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Etikettera artikel"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Uppdatera flöden"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Dela artikel"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Sök artiklar"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Dela artikel"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Inställningar"
-#: src/Widgets/ReaderHeaderbar.vala:157
-#, fuzzy
-msgid "Attachments"
-msgstr "Pergament"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Läs artikel i helskärmsläge"
+
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Taggen \"%s\" borttagen"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Uppdatera nyhetsflöden"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Ta bort flöde"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Sök artiklar"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Ta endast bort från %s"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Inställningar"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Nyhetsflödet \"%s\" borttaget"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Byt namn"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Lämna helskärmsläget"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Ta bort"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Alla artiklar"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "byt namn"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Taggar"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "lägg till"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Kategorier"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Nytt konto"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Flöden"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Ändra konto?"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Ny tagg"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
-msgstr ""
-"Du håller på att ändra kontot som FeedReader ska använda.\n"
-" Detta innebär att all lokal data från ditt gamla konto kommer att tas bort."
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Ny kategori"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Nytt konto"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Inga artiklar"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Väntar på att pågående synkronisering ska slutföras"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Inga olästa artiklar"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Jag ändrade mig"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Inga favoritartiklar"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Markera som läst"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Inga artiklar"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Ta bort (med nyhetsflöden)"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Synkronisering pågår. Artiklar bör dyka upp när som helst."
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "skrolla upp"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Ingen artikel vald."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit har kraschat"
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Spara bild som"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Lägg till etikett:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Etiketter:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "lägg till etikett"
+
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr "Ignorera alla TLS-fel från och med nu"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Välj en tjänst först"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Ange ett giltigt användarnamn"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Ange ett giltigt lösenord"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Ange en giltig URL"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Ange dina inloggningsuppgifter"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Tyvärr gick något fel."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "Servern rapporterade ett API-fel."
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Antingen är ditt användarnamn eller lösenord fel."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
@@ -607,405 +608,313 @@ msgstr ""
"Ingen anslutning till servern. Kontrollera din internetanslutning och "
"serverns URL!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "API-åtkomst är inaktiverat på servern. Vänligen aktivera det först!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Ingen behörighet att komma åt URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Inget giltigt CA-certifikat tillgängligt!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr ""
+msgstr "Installera insticksmodulen ”api_feedreader” i din tt-rss-instans!"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Ingen artikel vald."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Bilagor"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader städar upp i databasen.\n"
+"Detta bör inte ta lång tid."
-#: src/Widgets/ArticleView.vala:768
-#, fuzzy
-msgid "Save image as"
-msgstr "Dela artikel"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Gränssnitt"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Inställningar"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Dela"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Flödeslista:"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Etikettera artikel"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Visa endast nyhetsflöden"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Skriv ut artikel"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Visa endast olästa"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Dela artikel"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Sortera flödeslista efter"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Ta bort \"%s\""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "Mottaget"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Nyhetsflödet \"%s\" borttaget"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "Alfabetiskt"
+#: src/DataBaseReadOnly.vala:223
+#, fuzzy
+msgid "Unknown tag"
+msgstr "okänt flöde"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Tema"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Ingen förhandsvisning tillgänglig"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Ingen text tillgänglig för den här artikeln :("
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Mörk"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "av: %s, "
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Spara"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Öppna i webbläsare"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Användarnamn:"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Artikellista:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Lösenord:"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Sortera artiklar efter"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Användarnamn eller lösenord är fel"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "Datum"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "väntar"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Hej!\n"
+"\n"
+"Kolla på den här intressanta artikeln jag nyss läste: $URL"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Artikelvy:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Standard"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Vår"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Midnatt"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Pergament"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Teckenstorlek"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Gräns: "
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Liten"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tweeta"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Normal"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Tweeta till följare"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Stor"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "Klient-ID:"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Enorm"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "Klienthemlighet:"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Synkronisera:"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Fyll i URL:en."
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Antal artiklar"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "URL verkar inte vara giltig."
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Varje (minuter)"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Fyll i klient-ID."
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "Databas:"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Fyll i klienthemlighet."
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Ta bort artiklar efter"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Fyll i lösenordet."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Aldrig"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Fyll i användarnamnet."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 vecka"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Någonting gick fel."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 månad"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
+msgstr ""
+"Hej!\n"
+"\n"
+"Kolla på den här intressanta artikeln jag nyss läste: $URL\n"
+"\n"
+"- skickat av FeedReader"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 månader"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Till:"
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Ytterligare funktionalitet:"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Skicka"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Artikelhämtare"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "Skriv e-post"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
+"Kolla på den här intressanta artikeln som jag nyss läste - skickat av "
+"FeedReader"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Nytt konto"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Skicka Telegram"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
+"Info: Telegram måste vara installerat för att denna insticksmodule ska "
+"fungera."
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Var är dina nyhetsflöden?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "Välj den RSS-tjänst du använder och logga in för att komma igång."
-
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Kategori:"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Lägg till"
-
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "OPML-fil:"
-
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Välj OPML-fil"
-
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Importera"
-
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Lägg till flöde"
-
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Importera OPML"
-
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Ta endast bort från %s"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS-URL:"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP-autentisering"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"Logga in på din freshRSS-server och ha stort nöje av att använda FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "Logga in på FeedHQ och ha stort nöje av att använda FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Avsluta"
-
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Flödeslista:"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Klar"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Lägger till feeder"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Inget att läsa här."
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:50
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Article-List"
-msgstr "Artikellista:"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "OwnCloud-URL:"
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Markera artikeln som läst/oläst"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
-
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Idag"
-
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Igår"
-
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Logga ut"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Om FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
-
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
-msgstr ""
-
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Ingen förhandsvisning tillgänglig"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Ingen text tillgänglig för den här artikeln :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "av: %s,"
-
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
-
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"Logga in på din ownCloud News-instans och ha ett stort nöje av att använda "
+"FeedReader"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
-
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr ""
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS-URL:"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
+"Logga in på din Tiny Tiny RSS-server och ha stort nöje av att använda "
+"FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "Logga in på Old Reader och ha ett stort nöje av att använda FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "Logga in på Feedbin och ha ett stort nöje av att använda FeedReader"
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr "Ingen av de %i artiklarna i databasen matchar de aktuella filtren."
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Växla vald artikel som markerad/omarkerad"
diff --git a/po/sw.po b/po/sw.po
index 56ff8671..413f5512 100644
--- a/po/sw.po
+++ b/po/sw.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/ta.po b/po/ta.po
index 56ff8671..413f5512 100644
--- a/po/ta.po
+++ b/po/ta.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/te.po b/po/te.po
index 56ff8671..413f5512 100644
--- a/po/te.po
+++ b/po/te.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/th.po b/po/th.po
index 56ff8671..413f5512 100644
--- a/po/th.po
+++ b/po/th.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 56ff8671..632b067a 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -1,966 +1,909 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Emin Tufan <etcetin@gmail.com>, 2016-2017
msgid ""
msgstr ""
+"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-01-30 15:40+0000\n"
+"Last-Translator: E T <etcetin@gmail.com>\n"
+"Language-Team: Turkish "
+"<https://hosted.weblate.org/projects/feedreader/translations/tr/>\n"
+"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.19-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "FeedReader Hakkında"
+
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+msgstr "Giriş"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
-
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Çıkış"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Beslemeler ve ulamlar alınıyor"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Yazılar alınıyor"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Yıldızlı yazılar alınıyor"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "Etiketli yazılar alınıyor"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "Okunmamış yazılar alınıyor"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Yeni Yazılar"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "1 yeni yazı var (%u okunmamış)"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "%u yeni yazı var (%u okunmamış)"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Dün"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "\"%s\" ulamı kaldırıldı"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Okundu olarak imle"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Yeniden adlandır"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Kaldır"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Kaldır (Beslemelerle birlikte)"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "yeniden adlandır"
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "ekle"
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Hesap ekle"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Genel"
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Yenile"
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Ara"
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Çık"
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "Besleme Listesi"
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "Sonraki ögeyi seç"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "Önceki ögeyi seç"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Ulamları daralt/genişlet"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Seçileni okundu olarak imle"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "Yazı Listesi"
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Önceki/sonraki yazıyı seç"
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr "Seçilen yazının okunma durumunu değiştir"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
+msgstr "Seçilen yazının imini değiştir"
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Seçilen yazının adresini aç"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "En aşağıya/en yukarıya kaydır"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Seçilen yazıyı ortala"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "Yazı Görünümü"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "Aşağı/yukarı kaydır"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr ""
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Beslemeleriniz nerede?"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
+"Lütfen kullandığınız RSS hizmetini seçin ve devam etmek için giriş yapın."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr ""
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
+msgstr "Ulamlanmamış"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr ""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "Adres:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
-msgstr ""
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Ulam:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Ekle"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr "OPML Dosyası:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr "OPML Dosyası Seç"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "İçe Aktar"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Besleme ekle"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "OPML İçe Aktar"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Arayüz"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "İç"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Paylaş"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Besleme Dizelgesi:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Yalnızca beslemeleri göster"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Yalnızca okunmamışları göster"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Besleme Listesini Şuna Göre Sırala"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "Alındı"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "Alfabetik"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Gövde"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Karanlık"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Yazı Dizelgesi:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Yazıları şöyle sırala"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "Tarih"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "Önce eski olan"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "Yalnızca \"Okunmamış\" sütununu etkiler"
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "Geçmişe sürüklerken okundu olarak imle"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Yazı Görünümü:"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Varsayılan"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "İlkbahar"
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Gece yarısı"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Tirşe"
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "Yazı Tipi Ailesi"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Eşzamanlama:"
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Yazıların sayısı"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "Dakika Türünde Zaman Aralığı (0 = KAPALI)"
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "Veri tabanı:"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Yazıları şundan sonra sil"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Asla"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 Hafta"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 Ay"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 Ay"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Ek İşlevsellik:"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "İçerik Elde Edici"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "Resimleri İndir"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "İç Ortam Oynatıcı"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "Sistem Hesapları"
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader Hesapları"
#: src/Widgets/ResetPage.vala:33
msgid "Change Account?"
-msgstr ""
+msgstr "Hesabı Değiştir?"
#: src/Widgets/ResetPage.vala:37
msgid ""
"You are about to change the account you want FeedReader to use.\n"
" This means deleting all local data of your old account."
msgstr ""
+"FeedReader'i kullanmak istediğiniz hesabı değiştirmek üzeresiniz.\n"
+"Bu eski hesabınızın tüm yerel verilerini silmek anlamına gelir."
#: src/Widgets/ResetPage.vala:41
msgid "New account"
-msgstr ""
+msgstr "Yeni hesap"
#: src/Widgets/ResetPage.vala:44
msgid "Waiting for current sync to finish"
-msgstr ""
+msgstr "Şu anki eşzamanlamanın bitmesi için bekleniyor"
#: src/Widgets/ResetPage.vala:54
msgid "I changed my mind"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
+msgstr "Düşüncemi değiştirdim"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
+msgstr "Tüm"
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
+msgstr "Tüm yazıları göster"
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
+msgstr "Okunmamış"
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
+msgstr "Yalnızca okunmamış yazıları göster"
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
+msgstr "Yıldızlı"
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
+msgstr "Yalnızca yıldızlı yazıları göster"
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "Beslemeleri güncelle"
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Yazı Ara"
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Ayarlar"
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
-msgstr ""
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Yazıyı tam ekranda oku"
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
-msgstr ""
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "\"%s\" etiketi kaldırıldı"
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "Beslemeyi kaldır"
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr ""
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "URL'yi Kopyala"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr ""
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Yalnızca %s'den kaldır"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
-msgstr ""
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
+msgstr "Besleme kaldırıldı: %s"
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr ""
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Tam ekran kipinden çık"
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr ""
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Tüm Yazılar"
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr ""
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Etiketler"
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr ""
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Ulamlar"
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr ""
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Beslemeler"
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr ""
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Yeni Etiket"
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr ""
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Yeni Ulam"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "Yazı Yok"
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "Okunmamış yazı yok"
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "Yıldızlı yazı yok"
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "Yazı yok"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Eşzamanlama sürüyor. Yazılar her an görüntülenebilir."
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr ""
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "yukarı kaydır"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr ""
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Yazı seçilmedi."
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr ""
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit bozuldu"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr ""
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Resmi şöyle kaydet"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr ""
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "İptal"
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr ""
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Etiket Ekle:"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr ""
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Etiketler:"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr ""
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "Etiket ekle"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr ""
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
+msgstr "FeedReader"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr ""
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "Artık tüm TLS hatalarını görmezden gel"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr ""
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
+msgstr "Lütfen önce bir hizmet seçin"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr ""
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
+msgstr "Lütfen geçerli bir kullanıcı adı girin"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr ""
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
+msgstr "Lütfen geçerli bir parola girin"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr ""
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
+msgstr "Lütfen geçerli bir adres girin"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr ""
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
+msgstr "Lütfen Giriş bilgilerinizi girin"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr ""
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
+msgstr "Üzgünüz, bir şeyler yanlış gitti."
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
+msgstr "Sunucu bir API hatası bildirdi."
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr ""
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
+msgstr "Kullanıcı adı veya parolanızdan herhangi biri yanlış."
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
+"Sunucu bağlantısı yok. İnternet bağlantınızı ve sunucu adresini denetleyin!"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr ""
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
+msgstr "Bu sunucuda API erişimi devre dışı. Lütfen önce etkinleştirin!"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr ""
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
+msgstr "Adrese erişim için yetkilendirilmemiş"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr ""
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
+msgstr "Geçerli CA sertifikası yok!"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr ""
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+msgstr "Lütfen \"api_feedreader\" yan uygulamasını TT-RSS oluşumunuza kurun."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr ""
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Ekler"
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader veri tabanını temizliyor.\n"
+"Bu çok uzun sürmez."
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "Yazıyı etiketle"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "Yazıyı yazdır"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
-msgstr ""
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "Yazıyı paylaş"
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "\"%s\" kaldır"
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
-msgstr ""
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "\"%s\" beslemesi kaldırıldı"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr ""
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
+msgstr "Bilinmeyen etiket"
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr ""
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Ön İzleme Yok"
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr ""
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Bu yazı için metin yok :("
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr ""
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "gönderen: %s, "
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr ""
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Kaydet"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Tarayıcıda Aç"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "Parola:"
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr ""
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "Kullanıcı Adı ya da Parola yanlış"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr ""
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "bekliyor"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
+"Hey,\n"
+"\n"
+"Okuduğum şu ilgi çekici yazıya göz at: $URL"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "Sınır: "
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "Tweetle"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr ""
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "Takipçilere Tweetle"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "İstemci Kimliği:"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "İstemci Gizi:"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "Lütfen adresi doldur."
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "Adres geçerli görünmüyor."
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "Lütfen istemci kimliğini doldur."
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "Lütfen istemci gizini doldur."
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "Lütfen parolayı doldur."
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "Lütfen kullanıcı adını doldur."
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
-msgstr ""
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "Bir şeyler yanlış gitti."
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"Hey,\n"
+"\n"
+"Okuduğum şu ilgi çekici yazıya göz at: $URL\n"
+"\n"
+"- FeedReader ile gönderildi"
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "Kime:"
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "Gönder"
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "E-posta Yaz"
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
+msgstr "Hey, Okuduğum şu ilgi çekici yazıya göz at - FeedReader ile gönderildi"
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "Telegram'a Gönder"
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr ""
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr "Bilgi: Bu eklentinin çalışması için Telegram yüklenmiş olmalıdır."
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr ""
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS Adresi:"
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP Yetkilendirmesi"
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
+"FeedReader'in tadını çıkarmak için lütfen freshRSS sunucunuza giriş yapın"
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
-msgstr ""
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "FeedReader'in tadını çıkarmak için lütfen FeedHQ'ya giriş yap"
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Bitti"
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "Beslemeler Ekleniyor"
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr ""
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "Burada okunacak bir şey yok."
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr "Nextcloud URL'si:"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
+"FeedReader'in tadını çıkarmak için lütfen Nextcloud Haberler oluşumuna giriş "
+"yap"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr "Geçersiz URL"
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr "URL içeriği HTML'den oluşuyor, kullanılabilir besleme yok"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr "URL içeriği birden çok besleme içeren HTML'den oluşuyor."
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr "URL içeriği indirilemedi."
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr "İçerik geçersiz bir XML'den oluşuyor."
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr "TT-RSS'ye erişilirken hata"
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr ""
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "Tiny Tiny RSS Adresi:"
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
+"FeedReader'in tadını çıkarmak için lütfen Tiny Tiny RSS sunucunuza giriş "
+"yapın"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr ""
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "FeedReader'in tadını çıkarmak için lütfen Old Reader'a giriş yap"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "FeedReader'in tadını çıkarmak için lütfen Feedbin'e giriş yap"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Seçilen yazıyı imle/imini kaldır"
diff --git a/po/uk.po b/po/uk.po
index 66da8734..ea568f46 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -10,1056 +10,893 @@ msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: Ukrainian (http://www.transifex.com/dev-feedreader/feedreader/"
-"language/uk/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-04-12 21:42+0000\n"
+"Last-Translator: Максим Якимчук <xpinovo@gmail.com>\n"
+"Language-Team: Ukrainian <https://hosted.weblate.org/projects/feedreader/"
+"translations/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "Користувач:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "Пароль:"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
+"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 3.0-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "Про програму"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "Увійти"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "Посилання на OwnCloud:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "Вийти"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "Уповноваження HTTP"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "Отримання стрічок та категорій"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "Отримання статей"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "Отримання помічених статей"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "Нові статті"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "очікування"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "Учора"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "Категорію «%s» вилучено"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "Зазначити як прочитане"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "Перейменувати"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "Вилучити"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "Вилучити (через подачі)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "Вилучити"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "Додати"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "Додати обліковий запис"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "Користувач або пароль — неправильні"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "Загальне"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "Посилання:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "Оновити"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-#, fuzzy
-msgid "Client ID:"
-msgstr "Клієнт RSS"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "Пошук"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "Вийти"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "Приховати/розкрити категорії"
+
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "Зазначити вибране як прочитане"
+
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "Введіть дійсний пароль"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "Вибрати попередню/наступну статтю"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
+#: src/Widgets/ShortcutsWindow.vala:64
#, fuzzy
-msgid "Please fill in the username."
-msgstr "Введіть дійсного користувача"
+msgid "Toggle reading status of selected article"
+msgstr "Перемкнути вибрану статтю як прочитану/непрочитану"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
+#: src/Widgets/ShortcutsWindow.vala:65
#, fuzzy
-msgid "Something went wrong."
-msgstr "Вибачте, щось пішло не так."
-
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "Нові статті"
+msgid "Toggle marking of selected article"
+msgstr "Перемкнути вибрану статтю як прочитану/непрочитану"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "Змінити мітку прочитано до статті"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "Відкрити посилання вибраної статті"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "Змінити мітку прочитано до статті"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "Прокрутити до самого верху/низу"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "Показувати тільки непрочитані статті"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "Відцентрувати вибрану статтю"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "Нові статті"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr ""
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "Показувати тільки статті з зіркою"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr ""
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "Показувати тільки статті з зіркою"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "Де ваші подачі?"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "Показувати тільки непрочитані статті"
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr ""
+"Виберіть службу RSS, яку ви використовуєте і ввійдіть у неї, щоб продовжити."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "Некатегоризовано"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "Вилучити «%s»"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "Посилання:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "Мітку «%s» вилучено"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "Категорія:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "Подачу «%s» вилучено"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "Додати"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "Категорію «%s» вилучено"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "Всі статті"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "Мітки"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "Імпортувати"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "Категорії"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "Додати подачу"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
-msgstr "Перелік подач:"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "Імпортувати OPML"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "Створити мітку"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "Інтерфейс"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "Створити категорію"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "Внутрішній"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "Додати мітку:"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "Оприлюднення"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "Мітки:"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
+msgstr "Перелік подач:"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "Додати мітку"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "Показувати тільки подачі"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "Показувати тільки непрочитані"
+
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-"FeedReader очищує базу даних.\n"
-"Це не має зайняти багато часу."
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "Відбувається синхронізування. Статті мають з'явитись у будь-яку мить."
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "За одержанням"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "Піднятись уверх"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "За абеткою"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "Нові статті"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "Тема"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Неможливо знайти жодної непрочитаної статті, яка відповідає «%s» у подачі "
-"«%s»"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr "Неможливо знайти непрочитані статті у подачі «%s»"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "Dark"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
-"Неможливо знайти жодної позначеної статті, яка відповідає «%s» у подачі «%s»"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr "Неможливо знайти позначені статті у подачі «%s»"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "Перелік статей:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr "Неможливо знайти жодної статті, яка відповідає «%s» у подачі «%s»"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "Впорядкування статей"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr "Неможливо знайти статті у подачі «%s»"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "За датою"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-"Неможливо знайти жодної непрочитаної статті, яка відповідає «%s» з міткою "
-"«%s»"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr "Неможливо знайти непрочитані статті з міткою «%s»"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-"Неможливо знайти жодної позначеної статті, яка відповідає «%s» з міткою «%s»"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr "Неможливо знайти позначені статті з міткою «%s»"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "Огляд статей:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr "Неможливо знайти жодної статті, яка відповідає «%s» з міткою «%s»"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "Типовий"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr "Неможливо знайти статті з міткою «%s»"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "Весняний"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "Вечірній"
+
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "Пергаментний"
+
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-"Неможливо знайти жодної непрочитаної статті, яка відповідає «%s» в категорії "
-"«%s»"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr "Неможливо знайти непрочитані статті в категорії «%s»"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "Синхронізування:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "Кількість статей"
+
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-"Неможливо знайти жодної позначеної статті, яка відповідає «%s» в категорії "
-"«%s»"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr "Неможливо знайти позначені статті в категорії «%s»"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "База даних:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr "Неможливо знайти жодної статті, яка відповідає «%s» в категорії «%s»"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "Вилучати статті"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr "Неможливо знайти статті в категорії «%s»"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "Ніколи"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr "Неможливо знайти непрочитані статті, які відповідають «%s»"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "Що тижня"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr "Неможливо знайти непрочитані статті"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "Що місяця"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr "Неможливо знайти позначені статті, які відповідають «%s»"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "Що шість місяців"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr "Неможливо знайти позначені статті"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "Додаткові можливості:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr "Неможливо знайти статті, які відповідають «%s»"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "Здиральник вмісту"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
-msgstr "Неможливо знайти статті"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "Змінити мітку зірки до статті"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "Вбудованний програвач"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "Змінити мітку прочитано до статті"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "Читати статті повноекранно"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "Змінити обліковий запис?"
+
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
+msgstr ""
+"Ви збираєтесь змінити обліковий запис для FeedReader.\n"
+"Це означає, що всі локальні дані вашого старого облікового запису буде "
+"вилучено."
+
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "Створити обліковий запис"
+
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "Очікування на синхронізування"
+
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "Я передумав"
+
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "Усі"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "Показувати всі статті"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "Непрочитані"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "Показувати тільки непрочитані статті"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
-msgstr "Із зіркою"
+msgstr "Позначені"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
-msgstr "Показувати тільки статті з зіркою"
+msgstr "Показувати тільки позначені статті"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "Залишити мітку на статті"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "Оприлюднити статтю"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "Пошук статей"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "Оприлюднити статтю"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "Параметри"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "Долучення"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "Читати статті повноекранно"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "Оновити подачі"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "Мітку «%s» вилучено"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "Пошук статей"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "Параметри"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "Вилучити тільки з %s"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "Перейменувати"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "Подачу «%s» вилучено"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "Вилучити"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "Покинути повноекранний режим"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "Вилучити"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "Всі статті"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "Додати"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "Мітки"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "Створити обліковий запис"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "Категорії"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "Змінити обліковий запис?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "Подачі"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "Створити мітку"
+
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "Створити категорію"
+
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-"Ви збираєтесь змінити обліковий запис для FeedReader.\n"
-"Це означає, що всі локальні дані вашого старого облікового запису буде "
-"вилучено."
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "Створити обліковий запис"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "Очікування на синхронізування"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr ""
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "Я передумав"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "Зазначити як прочитане"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "Відбувається синхронізування. Статті мають з'явитись у будь-яку мить."
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "Вилучити (через подачі)"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "Прокрутити вгору"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "Не вибрано жодної статті."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr ""
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "Зберегти зображення як"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "Відміниті"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "Додати мітку:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "Мітки:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "Додати мітку"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "Відтепер нехтувати всіма помилками tls"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr ""
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "Вкажіть службу спочатку"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "Введіть дійсного користувача"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "Введіть дійсний пароль"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "Введіть дійсне посилання"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "Введіть подробиці вашого входу"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "Вибачте, щось пішло не так."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "Користувача або пароль введено неправильно."
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr ""
"Немає зв'язку з сервером. Перевірте ваш інтернет і посилання на сервер."
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "Доступ до API вимкнено з сервера. Спочатку ввімкніть його!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "Не увійшли, щоб доступитись до посилання"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "Немає доступного сертифікату СА!"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr "Вкажіть \"api_feedreader\"-plugin до запущеної програми!"
+msgstr "Будь ласка встановіть плаґін «api_feedreader» на вашому Tiny Tiny RSS!"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "Не вибрано жодної статті."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "Долучення"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader очищує базу даних.\n"
+"Це не має зайняти багато часу."
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "Зберегти зображення як"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "Інтерфейс"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "Рушій"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "Оприлюднення"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "Перелік подач:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "Показувати тільки подачі"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "Показувати тільки непрочитані"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "Впорядковувати подачі"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "За одержанням"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "За абеткою"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "Тема"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "Темна"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
-
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "Перелік статей:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "Впорядкування статей"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "За датою"
-
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "Найновіші спочатку"
-
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "Огляд статей:"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "Типовий"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "Весняний"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "Вечірній"
-
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "Пергаментний"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "Розмір шрифту"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "Малий"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "Звичайний"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "Великий"
-
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "Здоровезний"
-
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "Синхронізування:"
-
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "Кількість статей"
-
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "Кожні (хвилин)"
-
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "База даних:"
-
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "Вилучати статті"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "Ніколи"
-
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "Що тижня"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "Що місяця"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "Що шість місяців"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "Додаткові можливості:"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "Вилучити «%s»"
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "Здиральник вмісту"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "Подачу «%s» вилучено"
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "Створити обліковий запис"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "Автоматичний запуск FeedReader"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "Перегляд недоступний"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "Покинути повноекранний режим"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "Немає тексту в цій статті 😞"
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "Де ваші подачі?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "Оприлюднив: %s, "
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "Зберегти"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "Відкрити в браузері"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-"Виберіть службу RSS, яку ви використовуєте і ввійдіть у неї, щоб продовжити."
-
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "Категорія:"
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "Додати"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "Файл OPML:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "Виберіть файл OPML"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "Імпортувати"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "Додати подачу"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "Імпортувати OPML"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "Вилучити тільки з %s"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "Вийти"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "Перелік подач:"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-#, fuzzy
-msgid "Article-List"
-msgstr "Перелік статей:"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "Змінити мітку прочитано до статті"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "Сьогодні"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "Учора"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "Вийти"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "Про програму"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "Перегляд недоступний"
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "Виконано"
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "Немає тексту в цій статті :("
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "оприлюднив: %s, "
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr "Клієнт RSS"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
+msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr "Читати подачі з інтернету"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr "FeedReader"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr "Автоматичний запуск FeedReader"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
-msgstr "Клієнт RSS для різних служб"
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-"FeedReader — програма розроблена доповнити наявні інтернетні клієнти RSS."
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr "Наразі підтримуються такі служби:"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
+msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "Feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "OwnCloud"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "InoReader"
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
-"Комбінує всі переваги інтернетних служб, як-от синхронізування між різними "
-"пристроями з усім, що ви можете очікувати від сучасної стільничної програми: "
-"сповіщення, швидкий пошук і фільтри, мітки, оприлюднення до служб «прочитаю "
-"пізніше», як-от Pocket і Instapaper, зручні клавіатурні скорочення і база "
-"даних, яка зберігає старі статті настільки довго, наскільки вам це потрібно."
-
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr "Жодна з %i статей в базі даних не відповідає поточному фільтру."
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the feed \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Неможливо знайти жодної непрочитаної і позначеною статті, яка відповідає "
-#~ "«%s» у подачі «%s»."
-
-#~ msgid "No unread and marked articles in the feed \"%s\" could be found"
-#~ msgstr "Неможливо знайти непрочитані і позначені статті у подачі «%s»"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the tag \"%s\" could be "
-#~ "found"
-#~ msgstr ""
-#~ "Неможливо знайти жодної непрочитаної і позначеною статті, яка відповідає "
-#~ "«%s» з міткою «%s». "
-
-#~ msgid "No unread and marked articles in the tag \"%s\" could be found"
-#~ msgstr "Неможливо знайти непрочитані і позначені статті з міткою «%s»"
-
-#~ msgid ""
-#~ "No unread and marked articles that fit \"%s\" in the category \"%s\" "
-#~ "could be found"
-#~ msgstr ""
-#~ "Неможливо знайти жодної непрочитаної і позначеною статті, яка відповідає "
-#~ "«%s» в категорії «%s». "
-
-#~ msgid "No unread and marked articles in the category \"%s\" could be found"
-#~ msgstr "Неможливо знайти непрочитані і позначені статті в категорії «%s»"
-
-#~ msgid "No unread and marked articles that fit \"%s\" could be found"
-#~ msgstr ""
-#~ "Неможливо знайти непрочитані і позначені статті, які відповідають «%s»"
-
-#~ msgid "No unread and marked articles could be found"
-#~ msgstr "Неможливо знайти непрочитані і позначені статті"
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "Перемкнути вибрану статтю як позначену/непозначену"
diff --git a/po/vi.po b/po/vi.po
index 56ff8671..413f5512 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index f50833b8..5c50a886 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -4,1003 +4,905 @@
#
# Translators:
# nigelinux <nnigelinux@gmail.com>, 2016
+# Patrick J. Wu <wotingwu@live.com>, 2017
# S Shen, 2016
msgid ""
msgstr ""
"Project-Id-Version: FeedReader\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
-"PO-Revision-Date: 2016-09-29 19:33+0000\n"
-"Last-Translator: Bilal Elmoussaoui <bil.elmoussaoui@gmail.com>\n"
-"Language-Team: Chinese (China) (http://www.transifex.com/dev-feedreader/"
-"feedreader/language/zh_CN/)\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2018-05-06 14:35+0000\n"
+"Last-Translator: Handsome2734 <songbowen1229@gmail.com>\n"
+"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
+"feedreader/translations/zh_Hans/>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 3.0-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr "用户名:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr "密码:"
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
-msgstr ""
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
+msgstr "关于 FeedReader"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr "登录"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr "OwnCloud URL:"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
+msgstr "登出"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr "HTTP 验证"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
+msgstr "取得源和分类中"
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
+msgstr "取得文章中"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-#, fuzzy
-msgid "Tiny Tiny RSS URL:"
-msgstr "Tiny Tiny RSS"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
+msgstr "取得星标文章中"
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
+msgstr "取得标签文章中"
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
+msgstr "取得未读文章中"
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
+msgstr "新文章"
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
+msgstr "有1篇新文章(%u 篇未读)"
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
+msgstr "有%u篇新文章(%u 篇未读)"
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr "等待中"
+#: src/Model/Article.vala:188
+msgid "Yesterday"
+msgstr "昨天"
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
+msgstr "分类 \"%s\" 已被移除"
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
+msgstr "标记为已读"
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
+msgstr "重命名"
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
+msgstr "移除"
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
+msgstr "移除 (包括源)"
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
-msgstr ""
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
+msgstr "重命名"
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
-msgstr ""
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
+msgstr "添加"
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
-msgstr ""
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
+msgstr "添加帐号"
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
-msgstr "用户名或密码不正确"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
+msgstr "常规"
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
-msgstr "URL:"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
+msgstr "刷新"
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
+msgstr "搜索"
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
+msgstr "退出"
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
+msgstr "源列表"
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
+msgstr "选择下一项"
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
+msgstr "选择上一项"
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
-msgstr ""
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
+msgstr "关闭/打开分类"
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-#, fuzzy
-msgid "Please fill in the password."
-msgstr "请输入有效密码"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
+msgstr "标记当前选择项为已读"
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-#, fuzzy
-msgid "Please fill in the username."
-msgstr "请输入有效用户名"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
+msgstr "文章列表"
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-#, fuzzy
-msgid "Something went wrong."
-msgstr "抱歉, 出错了."
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
+msgstr "选择上/下一篇文章"
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
-msgstr "新文章"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
+msgstr "标记为已读/未读"
-#: src/Notification.vala:58
-#, fuzzy, c-format
-msgid "There is 1 new article (%u unread)"
-msgstr "标记文章为 (未)已读"
+#: src/Widgets/ShortcutsWindow.vala:65
+#, fuzzy
+msgid "Toggle marking of selected article"
+msgstr "设置选择项已/未读"
-#: src/Notification.vala:60
-#, fuzzy, c-format
-msgid "There are %u new articles (%u unread)"
-msgstr "标记文章为 (未)已读"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
+msgstr "打开选择项源网址"
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-#, fuzzy
-msgid "Getting feeds and categories"
-msgstr "仅显示未读文章"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
+msgstr "一直向上/下卷动"
-#: src/Backend/FeedServer.vala:167
-#, fuzzy
-msgid "Getting articles"
-msgstr "新文章"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
+msgstr "居中当前选择文章"
-#: src/Backend/FeedServer.vala:238
-#, fuzzy
-msgid "Getting starred articles"
-msgstr "仅显示星标文章"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
+msgstr "阅读视图"
-#: src/Backend/FeedServer.vala:242
-#, fuzzy
-msgid "Getting tagged articles"
-msgstr "仅显示星标文章"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
+msgstr "向上/下卷动"
-#: src/Backend/FeedServer.vala:255
-#, fuzzy
-msgid "Getting unread articles"
-msgstr "仅显示未读文章"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
+msgstr "您的源在哪里?"
+
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
+msgstr "请选择您使用的 RSS 服务并登录以继续."
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
msgid "Uncategorized"
msgstr "未分类"
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr "移除 \"%s\""
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
+msgstr "URL:"
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
-msgstr "标签 \"%s\" 已被移除"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
+msgstr "分类:"
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
-msgstr "内容源 \"%s\" 已被移除"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
+msgstr "添加:"
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
-msgstr "分类 \"%s\" 已被移除"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
+msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
-msgstr "所有文章"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
+msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
-msgstr "标签"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
+msgstr "导入"
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
-msgstr "分类"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
+msgstr "添加源"
-#: src/Widgets/FeedList.vala:486
-#, fuzzy
-msgid "Feeds"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
+msgstr "导入 OPML"
+
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
+msgstr "界面"
+
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
+msgstr "内部"
+
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
+msgstr "分享"
+
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr "内容源列表:"
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
-msgstr "新标签"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
+msgstr "仅显示内容源"
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
-msgstr "新分类"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
+msgstr "仅显示唯独"
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
-msgstr "添加标签:"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
+msgstr "Feed排序"
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
-msgstr "标签:"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
+msgstr "已接收"
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
-msgstr "添加标签"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
+msgstr "按字母顺序"
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
-msgstr ""
-"FeedReader 正在清理数据库.\n"
-"请稍候."
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
+msgstr "主题"
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
-msgstr "同步中. 即将显示新内容."
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
+msgstr "Gtk+"
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
-msgstr "向上卷动"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
+msgstr "暗色"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-#, fuzzy
-msgid "No Articles"
-msgstr "新文章"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
+msgstr "elementary"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
+msgstr "文章列表:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
+msgstr "文章排序"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
+msgstr "日期"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
+msgstr "最旧在前"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
+msgstr "只影响\"未读\""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
+msgstr "通过快速卷动标记阅读"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
+msgstr "阅读视图:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
+msgstr "默认"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
+msgstr "初春"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
+msgstr "暗夜"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
+msgstr "复古"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
+msgstr "字体"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
+msgstr "同步:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
+msgstr "文章数"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
+msgstr "自动更新周期(分钟,0代表不更新)"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
+msgstr "数据库:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
+msgstr "何时删除文章"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
+msgstr "从不"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
+msgstr "1 周后"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
+msgstr "1 个月后"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
+msgstr "6 个月后"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
+msgstr "其他功能:"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
-msgstr ""
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
+msgstr "内容抓取"
+
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
+msgstr "下载图片"
+
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
+msgstr "内置媒体播放器"
+
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
+msgstr "系统账号"
+
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
+msgstr "FeedReader账号"
+
+#: src/Widgets/ResetPage.vala:33
+msgid "Change Account?"
+msgstr "更换账户?"
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/ResetPage.vala:37
+msgid ""
+"You are about to change the account you want FeedReader to use.\n"
+" This means deleting all local data of your old account."
msgstr ""
+"您即将更换 FeedReader 中使用的账户.\n"
+"旧账户的所有本地数据将被删除."
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
-msgstr "为文章 (移除)添加星标"
+#: src/Widgets/ResetPage.vala:41
+msgid "New account"
+msgstr "新账户"
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
-msgstr "标记文章为 (未)已读"
+#: src/Widgets/ResetPage.vala:44
+msgid "Waiting for current sync to finish"
+msgstr "等待同步完成"
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
-msgstr "全屏阅读"
+#: src/Widgets/ResetPage.vala:54
+msgid "I changed my mind"
+msgstr "我改主意了"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "All"
msgstr "所有"
-#: src/Widgets/ReaderHeaderbar.vala:98
+#: src/Widgets/ColumnViewHeader.vala:37
msgid "Show all articles"
msgstr "显示所有文章"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Unread"
msgstr "未读"
-#: src/Widgets/ReaderHeaderbar.vala:99
+#: src/Widgets/ColumnViewHeader.vala:38
msgid "Show only unread articles"
msgstr "仅显示未读文章"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Starred"
msgstr "星标"
-#: src/Widgets/ReaderHeaderbar.vala:100
+#: src/Widgets/ColumnViewHeader.vala:39
msgid "Show only starred articles"
msgstr "仅显示星标文章"
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
-msgstr "标记文章"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
+msgstr "更新源"
-#: src/Widgets/ReaderHeaderbar.vala:117
-#, fuzzy
-msgid "Save Article as PDF"
-msgstr "分享文章"
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
+msgstr "搜索文章"
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
-msgstr "分享文章"
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
+msgstr "设置"
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
-msgstr "附件"
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
+msgstr "全屏阅读"
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
-msgstr "更新内容源"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
+msgstr "标签 \"%s\" 已被移除"
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
-msgstr ""
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
+msgstr "移除源"
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
-msgstr "搜索文章"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
+msgstr "复制URL"
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
-msgstr "设置"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
+msgstr "仅从 %s 中移除"
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
-msgstr "重命名"
+#: src/Widgets/FeedRow.vala:445
+#, fuzzy, c-format
+msgid "Feed removed: %s"
+msgstr "内容源 \"%s\" 已被移除"
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
-msgstr "移除"
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
+msgstr "退出全屏模式"
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
-msgstr "重命名"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
+msgstr "所有文章"
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
-msgstr "添加"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
+msgstr "标签"
-#: src/Widgets/SharePopover.vala:65
-#, fuzzy
-msgid "Add accounts"
-msgstr "新账户"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
+msgstr "分类"
-#: src/Widgets/ResetPage.vala:33
-msgid "Change Account?"
-msgstr "更换账户?"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
+msgstr "源"
-#: src/Widgets/ResetPage.vala:37
-msgid ""
-"You are about to change the account you want FeedReader to use.\n"
-" This means deleting all local data of your old account."
-msgstr ""
-"您即将更换 FeedReader 中使用的账户.\n"
-"旧账户的所有本地数据将被删除."
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
+msgstr "新标签"
-#: src/Widgets/ResetPage.vala:41
-msgid "New account"
-msgstr "新账户"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
+msgstr "新分类"
-#: src/Widgets/ResetPage.vala:44
-msgid "Waiting for current sync to finish"
-msgstr "等待同步完成"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
+msgstr "无文章"
-#: src/Widgets/ResetPage.vala:54
-msgid "I changed my mind"
-msgstr "我改主意了"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
+msgstr "无未读文章"
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr "标记为已读"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
+msgstr "无星标文章"
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr "移除 (带内容源)"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
+msgstr "无文章"
+
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
+msgstr "同步中. 即将显示新内容."
+
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
+msgstr "向上卷动"
+
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
+msgstr "未选择文章."
+
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
+msgstr "WebKit崩溃了"
+
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
+msgstr "保存图片为"
+
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
+msgstr "取消"
+
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
+msgstr "添加标签:"
+
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
+msgstr "标签:"
+
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
+msgstr "添加标签"
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
+#: src/Widgets/MainWindow.vala:44
msgid "FeedReader"
msgstr "FeedReader"
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
-msgstr "忽略之后所有的 tls 错误"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
+msgstr "忽略之后所有的TLS错误"
-#: src/Widgets/MainWindow.vala:545
+#: src/Widgets/MainWindow.vala:414
msgid "Please select a service first"
msgstr "请先选择一项服务"
-#: src/Widgets/MainWindow.vala:548
+#: src/Widgets/MainWindow.vala:417
msgid "Please enter a valid username"
msgstr "请输入有效用户名"
-#: src/Widgets/MainWindow.vala:551
+#: src/Widgets/MainWindow.vala:420
msgid "Please enter a valid password"
msgstr "请输入有效密码"
-#: src/Widgets/MainWindow.vala:555
+#: src/Widgets/MainWindow.vala:424
msgid "Please enter a valid URL"
msgstr "请输入有效 URL"
-#: src/Widgets/MainWindow.vala:558
+#: src/Widgets/MainWindow.vala:427
msgid "Please enter your Login details"
msgstr "请输入您的登录信息"
-#: src/Widgets/MainWindow.vala:561
+#: src/Widgets/MainWindow.vala:430
msgid "Sorry, something went wrong."
msgstr "抱歉, 出错了."
-#: src/Widgets/MainWindow.vala:564
+#: src/Widgets/MainWindow.vala:433
msgid "The server reported an API-error."
-msgstr ""
+msgstr "服务器报告了一个API错误."
-#: src/Widgets/MainWindow.vala:567
+#: src/Widgets/MainWindow.vala:436
msgid "Either your username or the password are not correct."
msgstr "您的用户名或密码不正确"
-#: src/Widgets/MainWindow.vala:570
+#: src/Widgets/MainWindow.vala:439
msgid ""
"No connection to the server. Check your internet connection and the server "
"URL!"
msgstr "无法连接至服务器. 请检查您的网络链接和服务器 URL!"
-#: src/Widgets/MainWindow.vala:573
+#: src/Widgets/MainWindow.vala:442
msgid "API access is disabled on the server. Please enable it first!"
msgstr "该服务器禁止 API 访问. 请先启用!"
-#: src/Widgets/MainWindow.vala:576
+#: src/Widgets/MainWindow.vala:445
msgid "Not authorized to access URL"
msgstr "未被授权访问 URL"
-#: src/Widgets/MainWindow.vala:580
+#: src/Widgets/MainWindow.vala:449
msgid "No valid CA certificate available!"
msgstr "无可用的有效 CA 证书"
-#: src/Widgets/MainWindow.vala:584
+#: src/Widgets/MainWindow.vala:453
msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
-msgstr ""
+msgstr "请为tt-rss安装\"api-feedreader\"插件!"
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
-msgstr "未选择文章."
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
+msgstr "附件"
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
+"FeedReader 正在清理数据库.\n"
+"请稍候."
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
-msgstr "保存图片为"
-
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
-msgstr "界面"
-
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
-msgstr "内部"
-
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
-msgstr "分享"
-
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
-msgstr "内容源列表:"
-
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
-msgstr "仅显示内容源"
-
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
-msgstr "仅显示唯独"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
-msgstr "内容源列表排序"
-
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
-msgstr "已接收"
-
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
-msgstr "按字母顺序"
-
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
-msgstr "主题"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
-msgstr "Gtk+"
-
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
-msgstr "暗色"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
+msgstr "标记文章"
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
-msgstr "elementary"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
+msgstr "打印文章"
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
-msgstr "文章列表:"
-
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
-msgstr "文章排序"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
+msgstr "分享文章"
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
-msgstr "日期"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
+msgstr "移除 \"%s\""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
-msgstr "最新在前"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
+msgstr "内容源 \"%s\" 已被移除"
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
-msgstr "阅读视图:"
+#: src/DataBaseReadOnly.vala:223
+#, fuzzy
+msgid "Unknown tag"
+msgstr "未知源"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
-msgstr "默认"
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "无可用预览"
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
-msgstr "初春"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
+msgstr "该文章中无可用文本 :("
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
-msgstr "暗夜"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
+msgstr "发布者: %s, "
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
-msgstr "复古"
+#: src/Utils.vala:815
+msgid "Save"
+msgstr "保存"
+
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
+msgstr "在浏览器内打开"
+
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
+msgstr "用户名:"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
-msgstr "字体大小"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
+msgstr "密码:"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
-msgstr "小"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
+msgstr "用户名或密码不正确"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
-msgstr "正常"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
+msgstr "等待中"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
-msgstr "大"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
+msgstr ""
+"嗨,\n"
+"\n"
+"快来看看我刚阅读的这篇有趣的文章: $URL"
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
-msgstr "最大"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
+msgstr "字数限制:"
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
-msgstr "同步:"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
+msgstr "发推"
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
-msgstr "文章数"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
+msgstr "发推至关注者"
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
-msgstr "每 (分钟)"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
+msgstr "客户端ID:"
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
-msgstr "数据库:"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
+msgstr "客户端密钥:"
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
-msgstr "何时删除文章"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
+msgstr "请输入URL."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
-msgstr "从不"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
+msgstr "URL似乎无效."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
-msgstr "1 周后"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
+msgstr "请填写客户端ID."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
-msgstr "1 个月后"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
+msgstr "请填写客户端密钥."
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
-msgstr "6 个月后"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
+msgstr "请填写密码."
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
-msgstr "其他功能:"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
+msgstr "请填写用户名."
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
-msgstr "内容抓取"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
+msgstr "抱歉, 出错了."
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
+"嗨,\n"
+"\n"
+"来看看我刚阅读的这篇有趣的文章: %URL\n"
+"\n"
+"- 由 FeedReader 发送"
-#: src/Widgets/SettingsDialog.vala:310
-#, fuzzy
-msgid "System Accounts"
-msgstr "新账户"
-
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-#, fuzzy
-msgid "FeedReader Accounts"
-msgstr "FeedReader"
-
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
-msgstr "退出全屏模式"
-
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
-msgstr "您的内容源在哪里?"
-
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
-msgstr "请选择您使用的 RSS 服务并登录以继续."
-
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
-msgstr "分类:"
-
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
-msgstr "添加:"
-
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
-msgstr "OPML-文件:"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
+msgstr "至:"
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
-msgstr "选择 OPML-文件"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
+msgstr "发送"
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
-msgstr "导入"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
+msgstr "写邮件"
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
-msgstr "添加内容源"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
+msgstr "嗨, 来看看我刚阅读的这篇有趣的文章 - 由 FeedReader 发送"
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
-msgstr "导入 OPML"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
+msgstr "发送到Telegram"
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
-msgstr "仅从 %s 中移除"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
+msgstr "注: 这个插件需要安装Telegram后才可用"
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
-msgstr ""
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
+msgstr "Telegram"
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
+msgstr "freshRSS网址:"
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
-msgstr ""
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
+msgstr "HTTP认证"
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
-msgstr "退出"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
+msgstr "请登入freshRSS来享受FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:37
-#, fuzzy
-msgid "Feed-List"
-msgstr "内容源列表:"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
+msgstr "请登入FeedHQ来享受FeedReader"
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
+msgstr "完成"
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
+msgstr "添加源中"
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
-msgstr ""
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
+msgstr "无可阅读项."
-#: src/Widgets/ShortcutsWindow.vala:50
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
#, fuzzy
-msgid "Article-List"
-msgstr "文章列表:"
-
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
-msgstr ""
+msgid "Nextcloud URL:"
+msgstr "OwnCloud 地址:"
-#: src/Widgets/ShortcutsWindow.vala:60
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
#, fuzzy
-msgid "Toggle the selected article un/read"
-msgstr "标记文章为 (未)已读"
-
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
-msgstr ""
-
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
-msgstr ""
-
-#: src/Model/Article.vala:165
-msgid "Today"
-msgstr "今天"
-
-#: src/Model/Article.vala:169
-msgid "Yesterday"
-msgstr "昨天"
-
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
-msgstr "登出"
-
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
-msgstr "关于 FeedReader"
-
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
-msgstr ""
-
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
-msgstr ""
-
-#: src/Utils.vala:20
-msgid "No Preview Available"
-msgstr "无可用预览"
-
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
-msgstr "该文章中无可用文本 :("
-
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
-msgstr "发布者: %s, "
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
+msgstr "请登入你的ownCloud News来享受FeedReader"
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
+msgstr "非法URL"
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
+msgstr "URL对应内容是HTML文本,不是RSS Feed"
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
+msgstr "URL对应内容包含多个Feed。"
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
+msgstr "不能下载内容。"
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
-msgstr ""
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
+msgstr "内容是无效XML。"
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
-msgstr ""
-
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
-msgstr ""
-
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
-msgstr "Tiny Tiny RSS"
-
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
-msgstr "Feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
+msgstr "TinyTinyRSS 地址:"
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
-msgstr "OwnCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
+msgstr "请登入TinyTinyRSS来享受FeedReader"
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
-msgstr "InoReader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
+msgstr "请登入Old Reader来享受FeedReader"
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
-msgstr ""
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
+msgstr "请登入Feedbin来享受FeedReader"
-#~ msgid "None of the %i Articles in the database fit the current filters."
-#~ msgstr "数据库中的 %i 篇文章均不匹配当前条件."
+#~ msgid "Toggle the selected article un/marked"
+#~ msgstr "设置选择项为标记/未标记"
diff --git a/po/zh_HK.po b/po/zh_HK.po
index 56ff8671..413f5512 100644
--- a/po/zh_HK.po
+++ b/po/zh_HK.po
@@ -1,497 +1,377 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +396,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
+#: src/Utils.vala:35
+msgid "No Preview Available"
msgstr ""
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 56ff8671..6d8b50d4 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -1,497 +1,385 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-02 05:43+0100\n"
+"POT-Creation-Date: 2018-01-27 14:04+0100\n"
+"PO-Revision-Date: 2017-11-16 02:55+0000\n"
+"Last-Translator: ezjerry liao <ezjerry@gmail.com>\n"
+"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
+"feedreader/translations/zh_Hant/>\n"
+"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 2.18-dev\n"
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:64
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:92
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:130
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:70
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:107
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:60
-#: plugins/backend/fresh/freshLoginWidget.vala:70
-#: plugins/backend/fresh/freshLoginWidget.vala:107
-#: plugins/share/Instapaper/InstapaperSetup.vala:71
-#: plugins/share/Wallabag/WallabagSetup.vala:92
-msgid "Username:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:65
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:93
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:131
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:71
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:108
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:61
-#: plugins/backend/fresh/freshLoginWidget.vala:71
-#: plugins/backend/fresh/freshLoginWidget.vala:108
-#: plugins/share/Instapaper/InstapaperSetup.vala:72
-#: plugins/share/Wallabag/WallabagSetup.vala:93
-msgid "Password:"
-msgstr ""
-
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:95
-msgid "Please log in to Feedbin to enjoy using FeedReader"
+#: src/FeedReader.vala:21
+msgid "About FeedReader"
msgstr ""
-#: plugins/backend/feedbin/feedbinLoginWidget.vala:100
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:171
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:150
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:96
-#: plugins/backend/fresh/freshLoginWidget.vala:150
-#: src/Share/ServiceSetup.vala:55
+#: src/Share/ServiceSetup.vala:56 plugins/backend/fresh/freshInterface.vala:151
+#: plugins/backend/feedhq/feedhqInterface.vala:101
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:172
+#: plugins/backend/ttrss/ttrssInterface.vala:151
+#: plugins/backend/oldreader/oldreaderInterface.vala:101
+#: plugins/backend/feedbin/feedbinInterface.vala:76
+#: plugins/backend/bazqux/bazquxInterface.vala:101
msgid "Login"
msgstr ""
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:91
-msgid "OwnCloud URL:"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:159
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:136
-#: plugins/backend/fresh/freshLoginWidget.vala:136
-msgid "HTTP Authorization"
-msgstr ""
-
-#: plugins/backend/owncloud/OwncloudNewsLoginWidget.vala:166
-msgid "Please log in to your ownCloud News instance and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:69
-msgid "Tiny Tiny RSS URL:"
-msgstr ""
-
-#: plugins/backend/ttrss/ttrssLoginWidget.vala:145
-msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/local/localLoginWidget.vala:60
-msgid "Done"
-msgstr ""
-
-#: plugins/backend/oldreader/oldreaderLoginWidget.vala:91
-msgid "Please log in to the Old Reader and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:69
-msgid "freshRSS URL:"
-msgstr ""
-
-#: plugins/backend/fresh/freshLoginWidget.vala:145
-msgid "Please log in to your freshRSS server and enjoy using FeedReader"
-msgstr ""
-
-#: plugins/share/Pocket/PocketSetup.vala:52
-#: plugins/share/Twitter/TwitterSetup.vala:51
-msgid "waiting"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:24
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL\n"
-"\n"
-"- sent by FeedReader"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:27
-msgid "To:"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:52
-msgid "Send"
-msgstr ""
-
-#: plugins/share/Email/EmailForm.vala:65
-msgid "Write Email"
+#: src/Share/ServiceSetup.vala:61
+msgid "Logout"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:29
-msgid ""
-"Hey,\n"
-"\n"
-"Check out this interesting article I just read: $URL"
+#: src/Backend/FeedServer.vala:179 src/Backend/FeedServer.vala:282
+msgid "Getting feeds and categories"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:47
-msgid "Limit: "
+#: src/Backend/FeedServer.vala:231
+msgid "Getting articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:63
-msgid "Tweet"
+#: src/Backend/FeedServer.vala:311
+msgid "Getting starred articles"
msgstr ""
-#: plugins/share/Twitter/TwitterForm.vala:80
-msgid "Tweet to Followers"
+#: src/Backend/FeedServer.vala:318
+msgid "Getting tagged articles"
msgstr ""
-#: plugins/share/Instapaper/InstapaperSetup.vala:46
-msgid "Username or Password incorrect"
+#: src/Backend/FeedServer.vala:336
+msgid "Getting unread articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:89 src/Widgets/AddPopover.vala:47
-msgid "URL:"
+#: src/Notification.vala:21 src/Widgets/ArticleList/ArticleList.vala:551
+msgid "New articles"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:90
-msgid "Client ID:"
+#: src/Notification.vala:27
+#, c-format
+msgid "There is 1 new article (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:91
-msgid "Client Secret:"
+#: src/Notification.vala:29
+#, c-format
+msgid "There are %u new articles (%u unread)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:141
-msgid "Please fill in the URL."
+#: src/Model/Article.vala:188
+msgid "Yesterday"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:148
-msgid "URL seems to not be valid."
+#: src/Widgets/CategorieRow.vala:393 src/Widgets/RemovePopover.vala:111
+#, c-format
+msgid "Category \"%s\" removed"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:159
-msgid "Please fill in the clientID."
+#: src/Widgets/CategorieRow.vala:445 src/Widgets/FeedRow.vala:233
+msgid "Mark as read"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:167
-msgid "Please fill in the clientSecret."
+#: src/Widgets/CategorieRow.vala:446 src/Widgets/TagRow.vala:194
+#: src/Widgets/FeedRow.vala:235
+msgid "Rename"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:175
-msgid "Please fill in the password."
+#: src/Widgets/CategorieRow.vala:447 src/Widgets/TagRow.vala:195
+#: src/Widgets/FeedRow.vala:241 plugins/share/Telegram/TelegramSetup.vala:31
+msgid "Remove"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:183
-msgid "Please fill in the username."
+#: src/Widgets/CategorieRow.vala:448
+msgid "Remove (with Feeds)"
msgstr ""
-#: plugins/share/Wallabag/WallabagSetup.vala:209
-msgid "Something went wrong."
+#: src/Widgets/CategorieRow.vala:501 src/Widgets/TagRow.vala:272
+#: src/Widgets/FeedRow.vala:270
+msgid "rename"
msgstr ""
-#: src/Notification.vala:46 src/Widgets/ArticleList/ArticleList.vala:453
-msgid "New Articles"
+#: src/Widgets/CategorieRow.vala:503 src/Widgets/TagRow.vala:274
+msgid "add"
msgstr ""
-#: src/Notification.vala:58
-#, c-format
-msgid "There is 1 new article (%u unread)"
+#: src/Widgets/SharePopover.vala:62
+msgid "Add accounts"
msgstr ""
-#: src/Notification.vala:60
-#, c-format
-msgid "There are %u new articles (%u unread)"
+#: src/Widgets/ShortcutsWindow.vala:22
+msgid "General"
msgstr ""
-#: src/Backend/FeedServer.vala:128 src/Backend/FeedServer.vala:222
-msgid "Getting feeds and categories"
+#: src/Widgets/ShortcutsWindow.vala:27
+msgid "Refresh"
msgstr ""
-#: src/Backend/FeedServer.vala:167
-msgid "Getting articles"
+#: src/Widgets/ShortcutsWindow.vala:28
+msgid "Search"
msgstr ""
-#: src/Backend/FeedServer.vala:238
-msgid "Getting starred articles"
+#: src/Widgets/ShortcutsWindow.vala:29
+msgid "Quit"
msgstr ""
-#: src/Backend/FeedServer.vala:242
-msgid "Getting tagged articles"
+#: src/Widgets/ShortcutsWindow.vala:37
+msgid "Feed List"
msgstr ""
-#: src/Backend/FeedServer.vala:255
-msgid "Getting unread articles"
+#: src/Widgets/ShortcutsWindow.vala:42
+msgid "Select next item"
msgstr ""
-#: src/dbBase.vala:503 src/Widgets/FeedList.vala:505
-#: src/Widgets/AddPopover.vala:38
-msgid "Uncategorized"
+#: src/Widgets/ShortcutsWindow.vala:43
+msgid "Select previous item"
msgstr ""
-#: src/Widgets/RemovePopover.vala:46
-#, c-format
-msgid "Remove \"%s\""
-msgstr ""
-
-#: src/Widgets/RemovePopover.vala:80 src/Widgets/TagRow.vala:184
-#, c-format
-msgid "Tag \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:44
+msgid "Collapse/Expand categories"
msgstr ""
-#: src/Widgets/RemovePopover.vala:102 src/Widgets/FeedRow.vala:203
-#, c-format
-msgid "Feed \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:45
+msgid "Mark the currently selected as read"
msgstr ""
-#: src/Widgets/RemovePopover.vala:125 src/Widgets/CategorieRow.vala:393
-#, c-format
-msgid "Category \"%s\" removed"
+#: src/Widgets/ShortcutsWindow.vala:54
+msgid "Article List"
msgstr ""
-#: src/Widgets/FeedList.vala:234
-msgid "All Articles"
+#: src/Widgets/ShortcutsWindow.vala:63
+msgid "Select next/previous article"
msgstr ""
-#: src/Widgets/FeedList.vala:433
-msgid "Tags"
+#: src/Widgets/ShortcutsWindow.vala:64
+msgid "Toggle reading status of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:481
-msgid "Categories"
+#: src/Widgets/ShortcutsWindow.vala:65
+msgid "Toggle marking of selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:486
-msgid "Feeds"
+#: src/Widgets/ShortcutsWindow.vala:66
+msgid "Open the URL of the selected article"
msgstr ""
-#: src/Widgets/FeedList.vala:996
-msgid "New Tag"
+#: src/Widgets/ShortcutsWindow.vala:67
+msgid "Scroll all the way up/down"
msgstr ""
-#: src/Widgets/FeedList.vala:1129
-msgid "New Category"
+#: src/Widgets/ShortcutsWindow.vala:68
+msgid "Center the currently selected article"
msgstr ""
-#: src/Widgets/TagPopover.vala:36
-msgid "Add Tag:"
+#: src/Widgets/ShortcutsWindow.vala:79
+msgid "Article View"
msgstr ""
-#: src/Widgets/TagPopover.vala:48
-msgid "Tags:"
+#: src/Widgets/ShortcutsWindow.vala:84
+msgid "Scroll up/down"
msgstr ""
-#: src/Widgets/TagPopover.vala:125
-msgid "add Tag"
+#: src/Widgets/LoginPage.vala:39
+msgid "Where are your feeds?"
msgstr ""
-#: src/Widgets/SpringCleanPage.vala:28
-msgid ""
-"FeedReader is cleaning the database.\n"
-"This shouldn't take too long."
+#: src/Widgets/LoginPage.vala:43
+msgid "Please select the RSS service you are using and log in to get going."
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:45
-msgid "Sync is in progress. Articles should appear any second."
+#: src/Widgets/AddPopover.vala:38 src/Widgets/FeedList.vala:506
+#: src/DataBaseReadOnly.vala:251
+msgid "Uncategorized"
msgstr ""
-#: src/Widgets/ArticleList/ArticleList.vala:455
-msgid "scroll up"
+#: src/Widgets/AddPopover.vala:47 plugins/share/Wallabag/WallabagSetup.vala:73
+msgid "URL:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
-msgid "No Articles"
+#: src/Widgets/AddPopover.vala:48
+msgid "Category:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:44
-#, c-format
-msgid "No unread articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:51 plugins/share/Telegram/TelegramSetup.vala:30
+msgid "Add"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:46
-#, c-format
-msgid "No unread articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:65
+msgid "OPML File:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:51
-#, c-format
-msgid "No marked articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:67
+msgid "Select OPML File"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:53
-#, c-format
-msgid "No marked articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:73
+msgid "Import"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:58
-#, c-format
-msgid "No articles that fit \"%s\" in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:92 src/Widgets/FeedListFooter.vala:113
+msgid "Add feed"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:60
-#, c-format
-msgid "No articles in the feed \"%s\" could be found"
+#: src/Widgets/AddPopover.vala:93
+msgid "Import OPML"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:68
-#, c-format
-msgid "No unread articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:48
+msgid "Interface"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:70
-#, c-format
-msgid "No unread articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:49
+msgid "Internals"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:75
-#, c-format
-msgid "No marked articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:50
+msgid "Share"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:77
-#, c-format
-msgid "No marked articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:71
+msgid "Feed List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:82
-#, c-format
-msgid "No articles that fit \"%s\" in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:73
+msgid "Only show feeds"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:84
-#, c-format
-msgid "No articles in the tag \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:80
+msgid "Only show unread"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:92
-#, c-format
-msgid ""
-"No unread articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Sort Feed List by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:94
-#, c-format
-msgid "No unread articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85 src/Widgets/SettingsDialog.vala:97
+msgid "Received"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:99
-#, c-format
-msgid ""
-"No marked articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:85
+msgid "Alphabetically"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:101
-#, c-format
-msgid "No marked articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90 src/Widgets/SettingsDialog.vala:111
+msgid "Theme"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:106
-#, c-format
-msgid "No articles that fit \"%s\" in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Gtk+"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:108
-#, c-format
-msgid "No articles in the category \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "Dark"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:118
-#, c-format
-msgid "No unread articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:90
+msgid "elementary"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:120
-msgid "No unread articles could be found"
+#: src/Widgets/SettingsDialog.vala:95
+msgid "Article List:"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:125
-#, c-format
-msgid "No marked articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Sort articles by"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:127
-msgid "No marked articles could be found"
+#: src/Widgets/SettingsDialog.vala:97
+msgid "Date"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:132
-#, c-format
-msgid "No articles that fit \"%s\" could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Oldest first"
msgstr ""
-#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:134
-msgid "No articles could be found"
+#: src/Widgets/SettingsDialog.vala:102
+msgid "Only affects \"Unread\" column"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:55 src/Widgets/FullscreenHeaderbar.vala:40
-msgid "Mark article (un)starred"
+#: src/Widgets/SettingsDialog.vala:107
+msgid "Mark read by scrolling past"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:61 src/Widgets/FullscreenHeaderbar.vala:45
-msgid "Mark article (un)read"
+#: src/Widgets/SettingsDialog.vala:109
+msgid "Article View:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:70
-msgid "Read article fullscreen"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Default"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "All"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Spring"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:98
-msgid "Show all articles"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Midnight"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Unread"
+#: src/Widgets/SettingsDialog.vala:111
+msgid "Parchment"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:99
-msgid "Show only unread articles"
+#: src/Widgets/SettingsDialog.vala:116
+msgid "Font Familly"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Starred"
+#: src/Widgets/SettingsDialog.vala:141
+msgid "Sync:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:100
-msgid "Show only starred articles"
+#: src/Widgets/SettingsDialog.vala:143
+msgid "Number of articles"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:107 src/Widgets/FullscreenHeaderbar.vala:54
-msgid "Tag Article"
+#: src/Widgets/SettingsDialog.vala:145
+msgid "Interval in Minutes (0 = OFF)"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:117
-msgid "Save Article as PDF"
+#: src/Widgets/SettingsDialog.vala:150
+msgid "Database:"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:128 src/Widgets/FullscreenHeaderbar.vala:69
-msgid "Share Article"
+#: src/Widgets/SettingsDialog.vala:152
+msgid "Delete articles after"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:157
-msgid "Attachments"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "Never"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:190
-msgid "Update Feeds"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Week"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:197
-msgid "Waiting for next update information"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "1 Month"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:205
-msgid "Search Articles"
+#: src/Widgets/SettingsDialog.vala:153
+msgid "6 Months"
msgstr ""
-#: src/Widgets/ReaderHeaderbar.vala:220 src/Widgets/SettingsDialog.vala:28
-msgid "Settings"
+#: src/Widgets/SettingsDialog.vala:155
+msgid "Additional Functionality:"
msgstr ""
-#: src/Widgets/TagRow.vala:207 src/Widgets/CategorieRow.vala:460
-#: src/Widgets/FeedRow.vala:245
-msgid "Rename"
+#: src/Widgets/SettingsDialog.vala:157
+msgid "Content Grabber"
msgstr ""
-#: src/Widgets/TagRow.vala:208 src/Widgets/CategorieRow.vala:461
-#: src/Widgets/FeedRow.vala:248
-msgid "Remove"
+#: src/Widgets/SettingsDialog.vala:159
+msgid "Download Images"
msgstr ""
-#: src/Widgets/TagRow.vala:310 src/Widgets/CategorieRow.vala:522
-#: src/Widgets/FeedRow.vala:285
-msgid "rename"
+#: src/Widgets/SettingsDialog.vala:161
+msgid "Internal Media Player"
msgstr ""
-#: src/Widgets/TagRow.vala:312 src/Widgets/CategorieRow.vala:524
-msgid "add"
+#: src/Widgets/SettingsDialog.vala:322
+msgid "System Accounts"
msgstr ""
-#: src/Widgets/SharePopover.vala:65
-msgid "Add accounts"
+#: src/Widgets/SettingsDialog.vala:349 src/Widgets/SettingsDialog.vala:363
+msgid "FeedReader Accounts"
msgstr ""
#: src/Widgets/ResetPage.vala:33
@@ -516,451 +404,477 @@ msgstr ""
msgid "I changed my mind"
msgstr ""
-#: src/Widgets/CategorieRow.vala:459 src/Widgets/FeedRow.vala:244
-msgid "Mark as read"
-msgstr ""
-
-#: src/Widgets/CategorieRow.vala:462
-msgid "Remove (with Feeds)"
-msgstr ""
-
-#: src/Widgets/MainWindow.vala:46 data/feedreader.desktop.in:3
-#: data/feedreader.appdata.xml.in:6
-msgid "FeedReader"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "All"
msgstr ""
-#: src/Widgets/MainWindow.vala:460
-msgid "Ignore all tls errors from now on"
+#: src/Widgets/ColumnViewHeader.vala:37
+msgid "Show all articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:545
-msgid "Please select a service first"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Unread"
msgstr ""
-#: src/Widgets/MainWindow.vala:548
-msgid "Please enter a valid username"
+#: src/Widgets/ColumnViewHeader.vala:38
+msgid "Show only unread articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:551
-msgid "Please enter a valid password"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Starred"
msgstr ""
-#: src/Widgets/MainWindow.vala:555
-msgid "Please enter a valid URL"
+#: src/Widgets/ColumnViewHeader.vala:39
+msgid "Show only starred articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:558
-msgid "Please enter your Login details"
+#: src/Widgets/ColumnViewHeader.vala:60
+msgid "Update feeds"
msgstr ""
-#: src/Widgets/MainWindow.vala:561
-msgid "Sorry, something went wrong."
+#: src/Widgets/ColumnViewHeader.vala:75
+msgid "Search Articles"
msgstr ""
-#: src/Widgets/MainWindow.vala:564
-msgid "The server reported an API-error."
+#: src/Widgets/ColumnViewHeader.vala:101
+msgid "Settings"
msgstr ""
-#: src/Widgets/MainWindow.vala:567
-msgid "Either your username or the password are not correct."
+#: src/Widgets/ColumnViewHeader.vala:114
+msgid "Read article fullscreen"
msgstr ""
-#: src/Widgets/MainWindow.vala:570
-msgid ""
-"No connection to the server. Check your internet connection and the server "
-"URL!"
+#: src/Widgets/TagRow.vala:172 src/Widgets/RemovePopover.vala:80
+#, c-format
+msgid "Tag \"%s\" removed"
msgstr ""
-#: src/Widgets/MainWindow.vala:573
-msgid "API access is disabled on the server. Please enable it first!"
+#: src/Widgets/FeedListFooter.vala:142
+msgid "Remove feed"
msgstr ""
-#: src/Widgets/MainWindow.vala:576
-msgid "Not authorized to access URL"
+#: src/Widgets/FeedRow.vala:234
+msgid "Copy URL"
msgstr ""
-#: src/Widgets/MainWindow.vala:580
-msgid "No valid CA certificate available!"
+#: src/Widgets/FeedRow.vala:239
+#, c-format
+msgid "Remove only from %s"
msgstr ""
-#: src/Widgets/MainWindow.vala:584
-msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
+#: src/Widgets/FeedRow.vala:445
+#, c-format
+msgid "Feed removed: %s"
msgstr ""
-#: src/Widgets/ArticleView.vala:64
-msgid "No Article selected."
+#: src/Widgets/FullscreenHeader.vala:26
+msgid "Leave fullscreen mode"
msgstr ""
-#: src/Widgets/ArticleView.vala:67
-msgid "WebKit has crashed"
+#: src/Widgets/FeedList.vala:242
+msgid "All Articles"
msgstr ""
-#: src/Widgets/ArticleView.vala:768
-msgid "Save image as"
+#: src/Widgets/FeedList.vala:441
+msgid "Tags"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:38
-msgid "Interface"
+#: src/Widgets/FeedList.vala:482
+msgid "Categories"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:39
-msgid "Internals"
+#: src/Widgets/FeedList.vala:487
+msgid "Feeds"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:40
-msgid "Share"
+#: src/Widgets/FeedList.vala:1012
+msgid "New Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:59
-msgid "Feed List:"
+#: src/Widgets/FeedList.vala:1139
+msgid "New Category"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:61
-msgid "Only show feeds"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:20
+msgid "No Articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:68
-msgid "Only show unread"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:122
+msgid "No unread articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Sort FeedList by"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:129
+msgid "No starred articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73 src/Widgets/SettingsDialog.vala:85
-msgid "Received"
+#: src/Widgets/ArticleList/ArticleListEmptyLabel.vala:136
+msgid "No articles"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:73
-msgid "Alphabetically"
+#: src/Widgets/ArticleList/ArticleList.vala:48
+msgid "Sync is in progress. Articles should appear any second."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78 src/Widgets/SettingsDialog.vala:97
-msgid "Theme"
+#: src/Widgets/ArticleList/ArticleList.vala:553
+msgid "scroll up"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Gtk+"
+#: src/Widgets/ArticleView.vala:62
+msgid "No Article selected."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "Dark"
+#: src/Widgets/ArticleView.vala:66
+msgid "WebKit has crashed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:78
-msgid "elementary"
+#: src/Widgets/ArticleView.vala:790
+msgid "Save image as"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:83
-msgid "Article List:"
+#: src/Widgets/UpdateButton.vala:80 src/Utils.vala:813
+msgid "Cancel"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Sort articles by"
+#: src/Widgets/TagPopover.vala:45
+msgid "Add Tag:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:85
-msgid "Date"
+#: src/Widgets/TagPopover.vala:57
+msgid "Tags:"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:90
-msgid "Newest first"
+#: src/Widgets/TagPopover.vala:134
+msgid "add Tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:95
-msgid "Article View:"
+#: src/Widgets/MainWindow.vala:44
+msgid "FeedReader"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Default"
+#: src/Widgets/MainWindow.vala:347
+msgid "Ignore all TLS errors from now on"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Spring"
+#: src/Widgets/MainWindow.vala:414
+msgid "Please select a service first"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Midnight"
+#: src/Widgets/MainWindow.vala:417
+msgid "Please enter a valid username"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:97
-msgid "Parchment"
+#: src/Widgets/MainWindow.vala:420
+msgid "Please enter a valid password"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Font Size"
+#: src/Widgets/MainWindow.vala:424
+msgid "Please enter a valid URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Small"
+#: src/Widgets/MainWindow.vala:427
+msgid "Please enter your Login details"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Normal"
+#: src/Widgets/MainWindow.vala:430
+msgid "Sorry, something went wrong."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Large"
+#: src/Widgets/MainWindow.vala:433
+msgid "The server reported an API-error."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:102
-msgid "Huge"
+#: src/Widgets/MainWindow.vala:436
+msgid "Either your username or the password are not correct."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:128
-msgid "Sync:"
+#: src/Widgets/MainWindow.vala:439
+msgid ""
+"No connection to the server. Check your internet connection and the server "
+"URL!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:130
-msgid "Number of articles"
+#: src/Widgets/MainWindow.vala:442
+msgid "API access is disabled on the server. Please enable it first!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:132
-msgid "Every (Minutes)"
+#: src/Widgets/MainWindow.vala:445
+msgid "Not authorized to access URL"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:144
-msgid "Database:"
+#: src/Widgets/MainWindow.vala:449
+msgid "No valid CA certificate available!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:146
-msgid "Delete articles after"
+#: src/Widgets/MainWindow.vala:453
+msgid "Please install the \"api_feedreader\"-plugin on your tt-rss instance!"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "Never"
+#: src/Widgets/MediaButton.vala:99
+msgid "Attachments"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Week"
+#: src/Widgets/SpringCleanPage.vala:28
+msgid ""
+"FeedReader is cleaning the database.\n"
+"This shouldn't take too long."
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "1 Month"
+#: src/Widgets/ArticleViewHeader.vala:68
+msgid "Tag article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:147
-msgid "6 Months"
+#: src/Widgets/ArticleViewHeader.vala:82
+msgid "Print article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:149
-msgid "Additional Functionality:"
+#: src/Widgets/ArticleViewHeader.vala:93
+msgid "Share article"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:151
-msgid "Content Grabber"
+#: src/Widgets/RemovePopover.vala:46
+#, c-format
+msgid "Remove \"%s\""
msgstr ""
-#: src/Widgets/SettingsDialog.vala:153
-msgid "Internal Media Player"
+#: src/Widgets/RemovePopover.vala:95
+#, c-format
+msgid "Feed \"%s\" removed"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:310
-msgid "System Accounts"
+#: src/DataBaseReadOnly.vala:223
+msgid "Unknown tag"
msgstr ""
-#: src/Widgets/SettingsDialog.vala:337 src/Widgets/SettingsDialog.vala:351
-msgid "FeedReader Accounts"
-msgstr ""
+#: src/Utils.vala:35
+msgid "No Preview Available"
+msgstr "無可用的預覽"
-#: src/Widgets/FullscreenHeaderbar.vala:84
-msgid "Leave fullscreen mode"
+#: src/Utils.vala:93
+msgid "No Text available for this article :("
msgstr ""
-#: src/Widgets/LoginPage.vala:55
-msgid "Where are your feeds?"
+#: src/Utils.vala:601
+#, c-format
+msgid "posted by: %s, "
msgstr ""
-#: src/Widgets/LoginPage.vala:59
-msgid "Please select the RSS service you are using and log in to get going."
+#: src/Utils.vala:815
+msgid "Save"
msgstr ""
-#: src/Widgets/AddPopover.vala:48
-msgid "Category:"
+#: plugins/share/Browser/Browser.vala:79
+msgid "Open in Browser"
msgstr ""
-#: src/Widgets/AddPopover.vala:51
-msgid "Add"
+#: plugins/share/Instapaper/InstapaperSetup.vala:55
+#: plugins/share/Wallabag/WallabagSetup.vala:76
+#: plugins/backend/fresh/freshInterface.vala:71
+#: plugins/backend/fresh/freshInterface.vala:108
+#: plugins/backend/feedhq/feedhqInterface.vala:65
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:93
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:131
+#: plugins/backend/ttrss/ttrssInterface.vala:71
+#: plugins/backend/ttrss/ttrssInterface.vala:108
+#: plugins/backend/oldreader/oldreaderInterface.vala:65
+#: plugins/backend/feedbin/feedbinInterface.vala:65
+#: plugins/backend/bazqux/bazquxInterface.vala:65
+msgid "Username:"
msgstr ""
-#: src/Widgets/AddPopover.vala:65
-msgid "OPML-File:"
+#: plugins/share/Instapaper/InstapaperSetup.vala:56
+#: plugins/share/Wallabag/WallabagSetup.vala:77
+#: plugins/backend/fresh/freshInterface.vala:72
+#: plugins/backend/fresh/freshInterface.vala:109
+#: plugins/backend/feedhq/feedhqInterface.vala:66
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:94
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:132
+#: plugins/backend/ttrss/ttrssInterface.vala:72
+#: plugins/backend/ttrss/ttrssInterface.vala:109
+#: plugins/backend/oldreader/oldreaderInterface.vala:66
+#: plugins/backend/feedbin/feedbinInterface.vala:66
+#: plugins/backend/bazqux/bazquxInterface.vala:66
+msgid "Password:"
msgstr ""
-#: src/Widgets/AddPopover.vala:67
-msgid "Select OPML-file"
+#: plugins/share/Instapaper/InstapaperSetup.vala:100
+msgid "Username or Password incorrect"
msgstr ""
-#: src/Widgets/AddPopover.vala:73
-msgid "Import"
+#: plugins/share/Twitter/TwitterSetup.vala:51
+#: plugins/share/Pocket/PocketSetup.vala:52
+msgid "waiting"
msgstr ""
-#: src/Widgets/AddPopover.vala:92
-msgid "Add feed"
+#: plugins/share/Twitter/TwitterForm.vala:29
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL"
msgstr ""
-#: src/Widgets/AddPopover.vala:93
-msgid "Import OPML"
+#: plugins/share/Twitter/TwitterForm.vala:47
+msgid "Limit: "
msgstr ""
-#: src/Widgets/FeedRow.vala:247
-#, c-format
-msgid "Remove only from %s"
+#: plugins/share/Twitter/TwitterForm.vala:63
+msgid "Tweet"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:22
-msgid "General"
+#: plugins/share/Twitter/TwitterForm.vala:80
+msgid "Tweet to Followers"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:27
-msgid "Refresh"
+#: plugins/share/Wallabag/WallabagSetup.vala:74
+msgid "Client ID:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:28
-msgid "Search"
+#: plugins/share/Wallabag/WallabagSetup.vala:75
+msgid "Client Secret:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:29
-msgid "Quit"
+#: plugins/share/Wallabag/WallabagSetup.vala:124
+msgid "Please fill in the URL."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:37
-msgid "Feed-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:130
+msgid "URL seems to not be valid."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:40
-msgid "Navigate the feed-list"
+#: plugins/share/Wallabag/WallabagSetup.vala:140
+msgid "Please fill in the clientID."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:41
-msgid "Collapse/Expand categories"
+#: plugins/share/Wallabag/WallabagSetup.vala:147
+msgid "Please fill in the clientSecret."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:42
-msgid "Mark the currently selected as read"
+#: plugins/share/Wallabag/WallabagSetup.vala:154
+msgid "Please fill in the password."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:50
-msgid "Article-List"
+#: plugins/share/Wallabag/WallabagSetup.vala:161
+msgid "Please fill in the username."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:59
-msgid "Select next/previous article"
+#: plugins/share/Wallabag/WallabagSetup.vala:186
+msgid "Something went wrong."
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:60
-msgid "Toggle the selected article un/read"
+#: plugins/share/Email/EmailForm.vala:24
+msgid ""
+"Hey,\n"
+"\n"
+"Check out this interesting article I just read: $URL\n"
+"\n"
+"- sent by FeedReader"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:61
-msgid "Toggle the selected article un/marked"
+#: plugins/share/Email/EmailForm.vala:27
+msgid "To:"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:62
-msgid "Open the URL of the selected article"
+#: plugins/share/Email/EmailForm.vala:52
+#: plugins/share/Telegram/TelegramForm.vala:42
+msgid "Send"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:63
-msgid "Scroll all the way up/down"
+#: plugins/share/Email/EmailForm.vala:65
+msgid "Write Email"
msgstr ""
-#: src/Widgets/ShortcutsWindow.vala:64
-msgid "Center the currently selected article"
+#: plugins/share/Telegram/TelegramForm.vala:23
+msgid ""
+"Hey, Check out this interesting article I just read - sent by FeedReader"
msgstr ""
-#: src/Model/Article.vala:165
-msgid "Today"
+#: plugins/share/Telegram/TelegramForm.vala:55
+msgid "Send Telegram"
msgstr ""
-#: src/Model/Article.vala:169
-msgid "Yesterday"
+#: plugins/share/Telegram/TelegramSetup.vala:38
+msgid "Info: Telegram would need to be installed for this plugin to work."
msgstr ""
-#: src/Share/ServiceSetup.vala:60
-msgid "Logout"
+#: plugins/share/Telegram/Telegram.vala:81
+msgid "Telegram"
msgstr ""
-#: src/FeedReader.vala:21 data/feedreader.desktop.in:19
-msgid "About FeedReader"
+#: plugins/backend/fresh/freshInterface.vala:70
+msgid "freshRSS URL:"
msgstr ""
-#: src/UtilsUI.vala:158 src/UtilsUI.vala:207
-msgid "Cancel"
+#: plugins/backend/fresh/freshInterface.vala:137
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:160
+#: plugins/backend/ttrss/ttrssInterface.vala:137
+msgid "HTTP Authorization"
msgstr ""
-#: src/UtilsUI.vala:160 src/UtilsUI.vala:209
-msgid "Save"
+#: plugins/backend/fresh/freshInterface.vala:146
+msgid "Please log in to your freshRSS server and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:20
-msgid "No Preview Available"
+#: plugins/backend/feedhq/feedhqInterface.vala:96
+#: plugins/backend/bazqux/bazquxInterface.vala:96
+msgid "Please log in to FeedHQ and enjoy using FeedReader"
msgstr ""
-#: src/Utils.vala:98
-msgid "No Text available for this article :("
+#: plugins/backend/local/localInterface.vala:66
+msgid "Done"
msgstr ""
-#: src/Utils.vala:208
-#, c-format
-msgid "posted by: %s, "
+#: plugins/backend/local/localInterface.vala:67
+msgid "Adding Feeds"
msgstr ""
-#: data/feedreader.desktop.in:4 data/feedreader-autostart.desktop.in:4
-msgid "RSS Client"
+#: plugins/backend/local/localInterface.vala:617
+msgid "Nothing to read here."
msgstr ""
-#: data/feedreader.desktop.in:5
-msgid "Read feeds from web services"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:92
+msgid "Nextcloud URL:"
msgstr ""
-#: data/feedreader.desktop.in:8 data/feedreader-autostart.desktop.in:8
-msgid "feedreader"
+#: plugins/backend/owncloud/OwncloudNewsInterface.vala:167
+msgid ""
+"Please log in to your Nextcloud News instance and enjoy using FeedReader"
msgstr ""
-#: data/feedreader-autostart.desktop.in:3
-msgid "FeedReader Autostart"
+#: plugins/backend/ttrss/ttrssAPI.vala:816
+msgid "Invalid URL"
msgstr ""
-#: data/feedreader-autostart.desktop.in:6
-msgid "Categories=Network;Feed;"
+#: plugins/backend/ttrss/ttrssAPI.vala:819
+msgid "URL content is HTML, no feeds available"
msgstr ""
-#: data/feedreader.appdata.xml.in:7
-msgid "RSS client for various webservices"
+#: plugins/backend/ttrss/ttrssAPI.vala:822
+msgid "URL content is HTML which contains multiple feeds."
msgstr ""
-#: data/feedreader.appdata.xml.in:10
-msgid ""
-"FeedReader is a program designed to complement an already existing web-based "
-"RSS reader account."
+#: plugins/backend/ttrss/ttrssAPI.vala:825
+msgid "Couldn't download the URL content."
msgstr ""
-#: data/feedreader.appdata.xml.in:14
-msgid "Currently supported services:"
+#: plugins/backend/ttrss/ttrssAPI.vala:828
+msgid "Content is an invalid XML."
msgstr ""
-#: data/feedreader.appdata.xml.in:16
-msgid "Tiny Tiny RSS"
+#: plugins/backend/ttrss/ttrssAPI.vala:841
+msgid "Error reaching tt-rss"
msgstr ""
-#: data/feedreader.appdata.xml.in:17
-msgid "feedly"
+#: plugins/backend/ttrss/ttrssInterface.vala:70
+msgid "Tiny Tiny RSS URL:"
msgstr ""
-#: data/feedreader.appdata.xml.in:18
-msgid "ownCloud"
+#: plugins/backend/ttrss/ttrssInterface.vala:146
+msgid "Please log in to your Tiny Tiny RSS server and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:19
-msgid "Inoreader"
+#: plugins/backend/oldreader/oldreaderInterface.vala:96
+msgid "Please log in to the Old Reader and enjoy using FeedReader"
msgstr ""
-#: data/feedreader.appdata.xml.in:21
-msgid ""
-"It combines all the advantages of web based services like synchronisation "
-"across all your devices with everything you expect from a modern desktop "
-"application: Desktop notifications, fast search and filters, tagging, "
-"sharing to \"read-it-later\" services like pocket and instapaper, handy "
-"keyboard shortcuts and a database that keeps all your old articles as long "
-"as you like."
+#: plugins/backend/feedbin/feedbinInterface.vala:101
+msgid "Please log in to Feedbin to enjoy using FeedReader"
msgstr ""
diff --git a/schemas/CMakeLists.txt b/schemas/CMakeLists.txt
deleted file mode 100644
index 1640634b..00000000
--- a/schemas/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-include (GSettings)
-add_schema ("org.gnome.feedreader.gschema.xml")
-add_schema ("org.gnome.feedreader.saved-state.gschema.xml")
-add_schema ("org.gnome.feedreader.share.gschema.xml")
-add_schema ("org.gnome.feedreader.tweaks.gschema.xml")
-add_schema ("org.gnome.feedreader.keybindings.gschema.xml")
diff --git a/schemas/meson.build b/schemas/meson.build
new file mode 100644
index 00000000..f3a1527e
--- /dev/null
+++ b/schemas/meson.build
@@ -0,0 +1,9 @@
+install_data([
+ 'org.gnome.feedreader.gschema.xml',
+ 'org.gnome.feedreader.keybindings.gschema.xml',
+ 'org.gnome.feedreader.saved-state.gschema.xml',
+ 'org.gnome.feedreader.share.gschema.xml',
+ 'org.gnome.feedreader.tweaks.gschema.xml'
+ ],
+ install_dir: join_paths(SHARE_DIR, 'glib-2.0/schemas')
+)
diff --git a/schemas/org.gnome.feedreader.gschema.xml b/schemas/org.gnome.feedreader.gschema.xml
index 458c7f0e..af069b51 100644
--- a/schemas/org.gnome.feedreader.gschema.xml
+++ b/schemas/org.gnome.feedreader.gschema.xml
@@ -1,12 +1,5 @@
<schemalist>
- <enum id="org.gnome.feedreader.loglevel">
- <value nick="OFF" value="0"/>
- <value nick="ERROR" value="1"/>
- <value nick="MORE" value="2"/>
- <value nick="DEBUG" value="3"/>
- </enum>
-
<enum id="org.gnome.feedreader.article-theme">
<value nick="DEFAULT" value="0"/>
<value nick="SPRING" value="1"/>
@@ -14,13 +7,6 @@
<value nick="PARCHMENT" value="3"/>
</enum>
- <enum id="org.gnome.feedreader.fontsize">
- <value nick="SMALL" value="0"/>
- <value nick="NORMAL" value="1"/>
- <value nick="LARGE" value="2"/>
- <value nick="HUGE" value="3"/>
- </enum>
-
<enum id="org.gnome.feedreader.drop-articles-duration">
<value nick="NEVER" value="0"/>
<value nick="1 Week" value="1"/>
@@ -37,13 +23,13 @@
<value nick="RECEIVED" value="0"/>
<value nick="DATE" value="1"/>
</enum>
-
+
<enum id="org.gnome.feedreader.feedlist-theme">
<value nick="GTK" value="0"/>
<value nick="DARK" value="1"/>
<value nick="ELEMENTARY" value="2"/>
</enum>
-
+
<enum id="org.gnome.feedreader.media-player">
<value nick="INTERNAL" value="0"/>
<value nick="SYSTEM" value="1"/>
@@ -64,30 +50,26 @@
<key name="max-articles" type="i">
<default>400</default>
- <summary>Maximum of new Articles</summary>
+ <summary>Max new articles</summary>
<description>
- The maximum of articles that are fetched from the server.
+ The maximum number of articles that are fetched from the server.
</description>
</key>
-
+
<key name='plugin' type="s">
<default>'none'</default>
</key>
- <key name='log-level' enum='org.gnome.feedreader.loglevel'>
- <default>'DEBUG'</default>
- </key>
-
<key name='article-theme' enum='org.gnome.feedreader.article-theme'>
<default>'DEFAULT'</default>
</key>
-
+
<key name='feedlist-theme' enum='org.gnome.feedreader.feedlist-theme'>
<default>'DARK'</default>
</key>
- <key name='fontsize' enum='org.gnome.feedreader.fontsize'>
- <default>'NORMAL'</default>
+ <key name='font' type="s">
+ <default>'Droid Sans 12'</default>
</key>
<key name='drop-articles-after' enum='org.gnome.feedreader.drop-articles-duration'>
@@ -95,7 +77,7 @@
</key>
<key name='content-grabber' type="b">
- <default>true</default>
+ <default>false</default>
<summary>grab full content of articles</summary>
<description>
Whether to use the content-grabber to download the full content of articles.
@@ -129,7 +111,7 @@
<key name='feedlist-sort-by' enum='org.gnome.feedreader.feedlist-sort'>
<default>'RECEIVED'</default>
</key>
-
+
<key name='mediaplayer' type="b">
<default>true</default>
</key>
@@ -142,6 +124,15 @@
</description>
</key>
+ <key name="download-images" type="b">
+ <default>false</default>
+ <summary>Download images of articles (offline mode)</summary>
+ <description>
+ Download of images of articles. If disabled this will speed up the snyc process,
+ but obviously the images will not be available when in offline-mode.
+ </description>
+ </key>
+
<key name='articlelist-oldest-first' type='b'>
<default>false</default>
<summary>oldest articles first</summary>
@@ -149,7 +140,7 @@
Sort articles in the ArticleList from old to new (either by article date or insert order).
</description>
</key>
-
+
<key name='articlelist-mark-scrolling' type='b'>
<default>false</default>
<summary>mark read by scrolling</summary>
diff --git a/schemas/org.gnome.feedreader.keybindings.gschema.xml b/schemas/org.gnome.feedreader.keybindings.gschema.xml
index 2d4f9955..521153b1 100644
--- a/schemas/org.gnome.feedreader.keybindings.gschema.xml
+++ b/schemas/org.gnome.feedreader.keybindings.gschema.xml
@@ -4,59 +4,59 @@
<key name="articlelist-prev" type="s">
<default>'j'</default>
</key>
-
+
<key name="articlelist-next" type="s">
<default>'k'</default>
</key>
-
+
<key name="articleview-up" type="s">
<default>'i'</default>
</key>
-
+
<key name="articleview-down" type="s">
<default>'u'</default>
</key>
-
+
<key name="articlelist-toggle-read" type="s">
<default>'r'</default>
</key>
-
+
<key name="articlelist-toggle-marked" type="s">
<default>'m'</default>
</key>
-
+
<key name="articlelist-open-url" type="s">
<default>'o'</default>
</key>
-
+
<key name="feedlist-mark-read" type="s">
<default>'&lt;Shift&gt;a'</default>
</key>
-
+
<key name="feedlist-prev" type="s">
<default>'&lt;Control&gt;j'</default>
</key>
-
+
<key name="feedlist-next" type="s">
<default>'&lt;Control&gt;k'</default>
</key>
-
+
<key name="global-sync" type="s">
<default>'F5'</default>
</key>
-
+
<key name="articlelist-center-selected" type="s">
<default>'s'</default>
</key>
-
+
<key name="global-quit" type="s">
<default>'&lt;Control&gt;q'</default>
</key>
-
+
<key name="global-search" type="s">
<default>'&lt;Control&gt;f'</default>
</key>
-
+
<key name="global-help" type="s">
<default>'&lt;Control&gt;F1'</default>
</key>
diff --git a/schemas/org.gnome.feedreader.saved-state.gschema.xml b/schemas/org.gnome.feedreader.saved-state.gschema.xml
index e0185171..a68dafbd 100644
--- a/schemas/org.gnome.feedreader.saved-state.gschema.xml
+++ b/schemas/org.gnome.feedreader.saved-state.gschema.xml
@@ -1,117 +1,97 @@
<schemalist>
- <enum id="org.gnome.feedreader.show-articles">
- <value nick="ALL" value="0"/>
- <value nick="UNREAD" value="1"/>
- <value nick="MARKED" value="2"/>
- </enum>
-
- <schema id="org.gnome.feedreader.saved-state" path="/org/gnome/feedreader/saved-state/" gettext-domain="feedreader">
- <key name="no-animations" type="b">
- <default>false</default>
- <summary>no animations on startup</summary>
- <description>
- Dont animate all inserted rows on startup so the list can instantly jump to the correct scroll-pos
- </description>
- </key>
-
- <key name="window-width" type="i">
- <default>1600</default>
- <summary>window width</summary>
- <description>
- saved with of the window
- </description>
- </key>
-
- <key name="window-height" type="i">
- <default>900</default>
- <summary>window height</summary>
- <description>
- saved height of the window
- </description>
- </key>
-
- <key name="window-maximized" type="b">
- <default>false</default>
- <summary>if window is maximized</summary>
- <description>
- Weather the window was maximized on close so it can be restored in the same way on startup.
- </description>
- </key>
-
- <key name="feed-row-width" type="i">
- <default>200</default>
- <summary>FeedRow width</summary>
- <description>
- Width of the first paned, the feed-row
- </description>
- </key>
-
- <key name="feed-row-scrollpos" type="d">
- <default>0</default>
- <summary>FeedList Scroll Position</summary>
- <description>
- The position of the FeedList the user scrolled to at the time the app closes
- </description>
- </key>
-
- <key name="feedlist-selected-row" type="s">
- <default>""</default>
- <summary>FeedList selected row</summary>
- <description>
- The feedrow selected when the app closes so it can be restored on open.
- </description>
- </key>
-
- <key name="feeds-and-articles-width" type="i">
- <default>400</default>
- <summary>Width of Feeds and Articles</summary>
- <description>
- Width of the two first panes, feed-row + article-row
- </description>
- </key>
-
- <key name="articlelist-scrollpos" type="d">
- <default>0</default>
- <summary>ArticleList Scroll Position</summary>
- <description>
- The position of the ArticleList the user scrolled to at the time the app closes
- </description>
- </key>
-
- <key name="articleview-scrollpos" type="i">
- <default>0</default>
- <summary>ArticleView Scroll Position</summary>
- <description>
- The position of the ArticleView the user scrolled to at the time the app closes
- </description>
- </key>
-
- <key name="articlelist-selected-row" type="s">
- <default>""</default>
- <summary>ArticleList selected row</summary>
- <description>
- The artcile selected when the app closes so it can be restored on open.
- </description>
- </key>
-
- <key name="articlelist-row-offset" type="i">
- <default>0</default>
- <summary>ArticleList number of rows</summary>
- <description>
- How much articles to load on startup
- </description>
- </key>
-
- <key name="articlelist-new-rows" type="i">
- <default>0</default>
- <summary>ArticleList number of new rows added during close</summary>
- <description>
- How much articles got added to the db while the app was closed
- </description>
- </key>
-
- <key name='show-articles' enum='org.gnome.feedreader.show-articles'>
+ <enum id="org.gnome.feedreader.show-articles">
+ <value nick="ALL" value="0"/>
+ <value nick="UNREAD" value="1"/>
+ <value nick="MARKED" value="2"/>
+ </enum>
+
+ <schema id="org.gnome.feedreader.saved-state" path="/org/gnome/feedreader/saved-state/" gettext-domain="feedreader">
+ <key name="window-width" type="i">
+ <default>1600</default>
+ <summary>saved with of the window</summary>
+ </key>
+
+ <key name="window-height" type="i">
+ <default>900</default>
+ <summary>saved height of the window</summary>
+ </key>
+
+ <key name="window-maximized" type="b">
+ <default>false</default>
+ <summary>if window is maximized</summary>
+ <description>
+ Weather the window was maximized on close so it can be restored in the same way on startup.
+ </description>
+ </key>
+
+ <key name="feed-row-width" type="i">
+ <default>200</default>
+ <summary>Width of the first paned, the feed-row</summary>
+ </key>
+
+ <key name="feed-row-scrollpos" type="d">
+ <default>0</default>
+ <summary>FeedList Scroll Position</summary>
+ <description>
+ The position of the FeedList the user scrolled to at the time the app closes
+ </description>
+ </key>
+
+ <key name="feedlist-selected-row" type="s">
+ <default>""</default>
+ <summary>FeedList selected row</summary>
+ <description>
+ The feedrow selected when the app closes so it can be restored on open.
+ </description>
+ </key>
+
+ <key name="feeds-and-articles-width" type="i">
+ <default>400</default>
+ <summary>Width of the two first panes, feed-row + article-row</summary>
+ </key>
+
+ <key name="articlelist-scrollpos" type="d">
+ <default>0</default>
+ <summary>ArticleList Scroll Position</summary>
+ <description>
+ The position of the ArticleList the user scrolled to at the time the app closes
+ </description>
+ </key>
+
+ <key name="articleview-scrollpos" type="i">
+ <default>0</default>
+ <summary>ArticleView Scroll Position</summary>
+ <description>
+ The position of the ArticleView the user scrolled to at the time the app closes
+ </description>
+ </key>
+
+ <key name="articlelist-selected-row" type="s">
+ <default>""</default>
+ <summary>ArticleList selected row</summary>
+ <description>
+ The artcile selected when the app closes so it can be restored on open.
+ </description>
+ </key>
+
+ <key name="articlelist-top-row" type="s">
+ <default>""</default>
+ <summary>ArticleList top row</summary>
+ <description>
+ The article sorted on top of the article-list.
+ </description>
+ </key>
+
+ <key name="articlelist-row-offset" type="i">
+ <default>0</default>
+ <summary>ArticleList number of rows</summary>
+ <description>
+ How much articles to load on startup
+ </description>
+ </key>
+
+ <key name='show-articles' enum='org.gnome.feedreader.show-articles'>
<default>'ALL'</default>
<summary>what articles to show</summary>
<description>
@@ -119,61 +99,61 @@
</description>
</key>
- <key name="expanded-categories" type="as">
- <default>['Categories', 'Labels']</default>
- <summary>expaneded categories</summary>
- <description>
- all the categories that are expanded, showing their feeds and subcategories
- </description>
- </key>
-
- <key name="currently-updating" type="b">
- <default>false</default>
- <summary>currently updating</summary>
- <description>
- If the FeedReader is currently updating.
- </description>
- </key>
-
- <key name="spring-cleaning" type="b">
- <default>false</default>
- <summary>Clean up the DB</summary>
- <description>
- Do a vacuum of the db. No other operation can access the db during this.
- </description>
- </key>
-
- <key name="last-spring-cleaning" type="i">
- <default>946684800</default>
- <summary>timestamp of the last spring cleaning</summary>
- <description>
- Timestamp of the last time the db got vacuumed.
- </description>
- </key>
-
- <key name="last-sync" type="i">
- <default>946684800</default>
- <summary>timestamp of the last sync</summary>
- <description>
- Timestamp of the last time the data got updated.
- </description>
- </key>
-
- <key name="search-term" type="s">
- <default>""</default>
- <summary>search term</summary>
- <description>
- String the user filtered the articles by.
- </description>
- </key>
-
- <key name="sync-status" type="s">
- <default>""</default>
- <summary>status of current sync</summary>
- <description>
- Last known status of the current sync the UI can pick up if just started
- </description>
- </key>
- </schema>
+ <key name="expanded-categories" type="as">
+ <default>['Categories', 'Labels']</default>
+ <summary>expaneded categories</summary>
+ <description>
+ all the categories that are expanded, showing their feeds and subcategories
+ </description>
+ </key>
+
+ <key name="currently-updating" type="b">
+ <default>false</default>
+ <summary>currently updating</summary>
+ <description>
+ If the FeedReader is currently updating.
+ </description>
+ </key>
+
+ <key name="spring-cleaning" type="b">
+ <default>false</default>
+ <summary>Clean up the DB</summary>
+ <description>
+ Do a vacuum of the db. No other operation can access the db during this.
+ </description>
+ </key>
+
+ <key name="last-spring-cleaning" type="i">
+ <default>946684800</default>
+ <summary>timestamp of the last spring cleaning</summary>
+ <description>
+ Timestamp of the last time the db got vacuumed.
+ </description>
+ </key>
+
+ <key name="last-sync" type="i">
+ <default>946684800</default>
+ <summary>timestamp of the last sync</summary>
+ <description>
+ Timestamp of the last time the data got updated.
+ </description>
+ </key>
+
+ <key name="search-term" type="s">
+ <default>""</default>
+ <summary>search term</summary>
+ <description>
+ String the user filtered the articles by.
+ </description>
+ </key>
+
+ <key name="sync-status" type="s">
+ <default>""</default>
+ <summary>status of current sync</summary>
+ <description>
+ Last known status of the current sync the UI can pick up if just started
+ </description>
+ </key>
+ </schema>
</schemalist>
diff --git a/schemas/org.gnome.feedreader.share.gschema.xml b/schemas/org.gnome.feedreader.share.gschema.xml
index 5f4eca5b..cfdfd561 100644
--- a/schemas/org.gnome.feedreader.share.gschema.xml
+++ b/schemas/org.gnome.feedreader.share.gschema.xml
@@ -1,52 +1,52 @@
<schemalist>
- <schema id="org.gnome.feedreader.share.account" gettext-domain="feedreader">
-
- <key name="oauth-access-token-secret" type="s">
- <default>""</default>
- <summary>Acces key to API</summary>
- <description>
- Acces key to reader-API
- </description>
- </key>
-
- <key name="oauth-access-token" type="s">
- <default>""</default>
- <summary>Acces key to reader-API</summary>
- <description>
- Acces key to reader-API
- </description>
- </key>
-
- <key name="access-token-expires" type="i">
+ <schema id="org.gnome.feedreader.share.account" gettext-domain="feedreader">
+
+ <key name="oauth-access-token-secret" type="s">
+ <default>""</default>
+ <summary>Acces key to API</summary>
+ <description>
+ Acces key to reader-API
+ </description>
+ </key>
+
+ <key name="oauth-access-token" type="s">
+ <default>""</default>
+ <summary>Acces key to reader-API</summary>
+ <description>
+ Acces key to reader-API
+ </description>
+ </key>
+
+ <key name="access-token-expires" type="i">
<default>0</default>
</key>
- <key name="username" type="s">
- <default>""</default>
- <summary></summary>
- <description>
- </description>
- </key>
+ <key name="username" type="s">
+ <default>""</default>
+ <summary></summary>
+ <description>
+ </description>
+ </key>
<key name="user-id" type="s">
- <default>""</default>
- <summary></summary>
- <description>
-
- </description>
- </key>
-
- <key name="url" type="s">
- <default>""</default>
- </key>
-
- <key name="client-id" type="s">
- <default>""</default>
- </key>
-
- <key name="client-secret" type="s">
- <default>""</default>
- </key>
-
- </schema>
+ <default>""</default>
+ <summary></summary>
+ <description>
+
+ </description>
+ </key>
+
+ <key name="url" type="s">
+ <default>""</default>
+ </key>
+
+ <key name="client-id" type="s">
+ <default>""</default>
+ </key>
+
+ <key name="client-secret" type="s">
+ <default>""</default>
+ </key>
+
+ </schema>
</schemalist>
diff --git a/schemas/org.gnome.feedreader.tweaks.gschema.xml b/schemas/org.gnome.feedreader.tweaks.gschema.xml
index 8b4bf508..0a8bc221 100644
--- a/schemas/org.gnome.feedreader.tweaks.gschema.xml
+++ b/schemas/org.gnome.feedreader.tweaks.gschema.xml
@@ -25,15 +25,6 @@
Ask server to not track FeedReader on making requests.
</description>
</key>
-
- <key name="dont-download-images" type="b">
- <default>false</default>
- <summary>Dont download images of articles (offline mode)</summary>
- <description>
- Disable download of images of articles. This speeds up the snycing process,
- but obviously the images will not be available when in offline-mode.
- </description>
- </key>
<key name="ignore-tls-errors" type="b">
<default>false</default>
@@ -50,15 +41,15 @@
On startup of the daemon copy the desktop file in the autostart folder
</description>
</key>
-
+
<key name="article-select-text" type="b">
- <default>false</default>
+ <default>true</default>
<summary>Select text of articles</summary>
<description>
Enable selecting text in the articleview, also copy text
</description>
</key>
-
+
<key name="smooth-scrolling" type="b">
<default>true</default>
<summary>Enable smooth scrolling in ArticleView</summary>
@@ -67,5 +58,13 @@
</description>
</key>
+ <key name="allow-javascript" type="b">
+ <default>true</default>
+ <summary>Allow javascript to be executed in the ArticleView</summary>
+ <description>
+ Allow javascript to be executed in the ArticleView. Disabling javascript will break some functionality!!!!
+ </description>
+ </key>
+
</schema>
</schemalist>
diff --git a/scripts/install_ubuntu.sh b/scripts/install_ubuntu.sh
new file mode 100644
index 00000000..1affee83
--- /dev/null
+++ b/scripts/install_ubuntu.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+sudo add-apt-repository ppa:vala-team
+sudo apt-get update
+sudo apt-get upgrade -y
+sudo apt-get install -y build-essential git meson ninja-build valac pkg-config libgirepository1.0-dev libgtk-3-dev libsoup2.4-dev libjson-glib-dev libwebkit2gtk-4.0-dev libsqlite3-dev libsecret-1-dev libnotify-dev libxml2-dev librest-dev libgee-0.8-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgoa-1.0-dev libcurl4-gnutls-dev libpeas-dev
+cd /tmp/
+git clone --recursive https://github.com/jangernert/FeedReader
+cd ./FeedReader
+meson build
+cd ./build
+ninja
+sudo ninja install
+sudo rm -r /tmp/FeedReader
diff --git a/src/ActionCache.vala b/src/ActionCache.vala
index 7b1eac78..5bc7c129 100644
--- a/src/ActionCache.vala
+++ b/src/ActionCache.vala
@@ -15,14 +15,14 @@
public class FeedReader.ActionCache : GLib.Object {
- // Similar to CachedActionManager this class collects all the actions done during a period of time
- // to use that information at a later point of time
- // however this class does not write the actions to the database
- // this class is used cache the actions during a sync so the synced data can be updated accordingly afterwards
- // this prevents articles that were marked as read after the sync began but before the data was written to the database
- // to suddenly become unread again after the sync (and similar issues)
+ // Similar to CachedActionManager this class collects all the actions done during a period of time
+ // to use that information at a later point of time
+ // however this class does not write the actions to the database
+ // this class is used cache the actions during a sync so the synced data can be updated accordingly afterwards
+ // this prevents articles that were marked as read after the sync began but before the data was written to the database
+ // to suddenly become unread again after the sync (and similar issues)
- private Gee.ArrayList<CachedAction> m_list;
+ private Gee.List<CachedAction> m_list;
private static ActionCache? m_cache = null;
@@ -34,12 +34,12 @@ public class FeedReader.ActionCache : GLib.Object {
return m_cache;
}
- private ActionCache()
- {
- m_list = new Gee.ArrayList<CachedAction>();
- }
+ private ActionCache()
+ {
+ m_list = new Gee.ArrayList<CachedAction>();
+ }
- public void markArticleRead(string id, ArticleStatus read)
+ public void markArticleRead(string id, ArticleStatus read)
{
var cachedAction = CachedActions.MARK_READ;
if(read == ArticleStatus.UNREAD)
@@ -77,157 +77,157 @@ public class FeedReader.ActionCache : GLib.Object {
addAction(action);
}
- private void addAction(CachedAction action)
- {
- switch(action.getType())
- {
- case CachedActions.MARK_READ:
- case CachedActions.MARK_UNREAD:
- case CachedActions.MARK_STARRED:
- case CachedActions.MARK_UNSTARRED:
- removeOpposite(action);
- break;
-
- case CachedActions.MARK_READ_FEED:
- removeForFeed(action.getID());
- break;
-
- case CachedActions.MARK_READ_CATEGORY:
- removeForCategory(action.getID());
- break;
-
- case CachedActions.MARK_READ_ALL:
- removeForALL();
- break;
- }
-
- m_list.add(action);
- }
-
- private void removeOpposite(CachedAction action)
- {
- foreach(CachedAction a in m_list)
- {
- if(a.getID() == action.getID()
- && a.getType() == action.opposite())
- {
- m_list.remove(a);
- break;
- }
- }
- }
-
- private void removeForFeed(string feedID)
- {
- foreach(CachedAction a in m_list)
- {
- if(a.getType() == CachedActions.MARK_READ
- || a.getType() == CachedActions.MARK_UNREAD)
- {
- if(feedID == dbDaemon.get_default().getFeedIDofArticle(a.getID()))
- {
- m_list.remove(a);
- }
- }
- }
- }
-
- private void removeForCategory(string catID)
- {
- var feedIDs = dbDaemon.get_default().getFeedIDofCategorie(catID);
- foreach(string feedID in feedIDs)
- {
- foreach(CachedAction a in m_list)
- {
- if(a.getType() == CachedActions.MARK_READ_FEED
- && a.getID() == feedID)
- {
- m_list.remove(a);
- }
- }
-
- removeForFeed(feedID);
- }
- }
-
- private void removeForALL()
- {
- foreach(CachedAction a in m_list)
- {
- switch(a.getType())
- {
- case CachedActions.MARK_READ:
- case CachedActions.MARK_UNREAD:
- case CachedActions.MARK_READ_FEED:
- case CachedActions.MARK_READ_CATEGORY:
- case CachedActions.MARK_READ_ALL:
- m_list.remove(a);
- break;
- }
- }
- }
-
- public ArticleStatus checkStarred(string articleID, ArticleStatus marked)
- {
- var type = CachedActions.NONE;
- if(marked == ArticleStatus.UNMARKED)
- type = CachedActions.MARK_STARRED;
- else if(marked == ArticleStatus.MARKED)
- type = CachedActions.MARK_UNSTARRED;
-
- foreach(CachedAction a in m_list)
- {
- if(a.getType() == type
- && a.getID() == articleID)
- {
- if(type == CachedActions.MARK_STARRED)
- return ArticleStatus.MARKED;
-
- if(type == CachedActions.MARK_UNSTARRED)
- return ArticleStatus.UNMARKED;
- }
- }
-
- return marked;
- }
-
- public ArticleStatus checkRead(article a)
- {
- if(a.getUnread() == ArticleStatus.READ)
- {
- foreach(CachedAction action in m_list)
- {
- if(action.getType() == CachedActions.MARK_UNREAD
- && action.getID() == a.getArticleID())
- return ArticleStatus.UNREAD;
- }
- }
- else if(a.getUnread() == ArticleStatus.UNREAD)
- {
- foreach(CachedAction action in m_list)
- {
- switch(action.getType())
- {
- case CachedActions.MARK_READ_ALL:
- return ArticleStatus.READ;
-
- case CachedActions.MARK_READ_FEED:
- if(action.getID() == a.getFeedID())
- return ArticleStatus.READ;
- break;
-
- case CachedActions.MARK_READ_CATEGORY:
- var feedIDs = dbDaemon.get_default().getFeedIDofCategorie(a.getArticleID());
- foreach(string feedID in feedIDs)
- {
- if(feedID == a.getFeedID())
- return ArticleStatus.READ;
- }
- break;
- }
- }
- }
-
- return a.getUnread();
- }
+ private void addAction(CachedAction action)
+ {
+ switch(action.getType())
+ {
+ case CachedActions.MARK_READ:
+ case CachedActions.MARK_UNREAD:
+ case CachedActions.MARK_STARRED:
+ case CachedActions.MARK_UNSTARRED:
+ removeOpposite(action);
+ break;
+
+ case CachedActions.MARK_READ_FEED:
+ removeForFeed(action.getID());
+ break;
+
+ case CachedActions.MARK_READ_CATEGORY:
+ removeForCategory(action.getID());
+ break;
+
+ case CachedActions.MARK_READ_ALL:
+ removeForALL();
+ break;
+ }
+
+ m_list.add(action);
+ }
+
+ private void removeOpposite(CachedAction action)
+ {
+ foreach(CachedAction a in m_list)
+ {
+ if(a.getID() == action.getID()
+ && a.getType() == action.opposite())
+ {
+ m_list.remove(a);
+ break;
+ }
+ }
+ }
+
+ private void removeForFeed(string feedID)
+ {
+ foreach(CachedAction a in m_list)
+ {
+ if(a.getType() == CachedActions.MARK_READ
+ || a.getType() == CachedActions.MARK_UNREAD)
+ {
+ if(feedID == DataBase.readOnly().getFeedIDofArticle(a.getID()))
+ {
+ m_list.remove(a);
+ }
+ }
+ }
+ }
+
+ private void removeForCategory(string catID)
+ {
+ var feedIDs = DataBase.readOnly().getFeedIDofCategorie(catID);
+ foreach(string feedID in feedIDs)
+ {
+ foreach(CachedAction a in m_list)
+ {
+ if(a.getType() == CachedActions.MARK_READ_FEED
+ && a.getID() == feedID)
+ {
+ m_list.remove(a);
+ }
+ }
+
+ removeForFeed(feedID);
+ }
+ }
+
+ private void removeForALL()
+ {
+ foreach(CachedAction a in m_list)
+ {
+ switch(a.getType())
+ {
+ case CachedActions.MARK_READ:
+ case CachedActions.MARK_UNREAD:
+ case CachedActions.MARK_READ_FEED:
+ case CachedActions.MARK_READ_CATEGORY:
+ case CachedActions.MARK_READ_ALL:
+ m_list.remove(a);
+ break;
+ }
+ }
+ }
+
+ public ArticleStatus checkStarred(string articleID, ArticleStatus marked)
+ {
+ var type = CachedActions.NONE;
+ if(marked == ArticleStatus.UNMARKED)
+ type = CachedActions.MARK_STARRED;
+ else if(marked == ArticleStatus.MARKED)
+ type = CachedActions.MARK_UNSTARRED;
+
+ foreach(CachedAction a in m_list)
+ {
+ if(a.getType() == type
+ && a.getID() == articleID)
+ {
+ if(type == CachedActions.MARK_STARRED)
+ return ArticleStatus.MARKED;
+
+ if(type == CachedActions.MARK_UNSTARRED)
+ return ArticleStatus.UNMARKED;
+ }
+ }
+
+ return marked;
+ }
+
+ public ArticleStatus checkRead(Article a)
+ {
+ if(a.getUnread() == ArticleStatus.READ)
+ {
+ foreach(CachedAction action in m_list)
+ {
+ if(action.getType() == CachedActions.MARK_UNREAD
+ && action.getID() == a.getArticleID())
+ return ArticleStatus.UNREAD;
+ }
+ }
+ else if(a.getUnread() == ArticleStatus.UNREAD)
+ {
+ foreach(CachedAction action in m_list)
+ {
+ switch(action.getType())
+ {
+ case CachedActions.MARK_READ_ALL:
+ return ArticleStatus.READ;
+
+ case CachedActions.MARK_READ_FEED:
+ if(action.getID() == a.getFeedID())
+ return ArticleStatus.READ;
+ break;
+
+ case CachedActions.MARK_READ_CATEGORY:
+ var feedIDs = DataBase.readOnly().getFeedIDofCategorie(a.getArticleID());
+ foreach(string feedID in feedIDs)
+ {
+ if(feedID == a.getFeedID())
+ return ArticleStatus.READ;
+ }
+ break;
+ }
+ }
+ }
+
+ return a.getUnread();
+ }
}
diff --git a/src/Backend/Backend.vala b/src/Backend/Backend.vala
new file mode 100644
index 00000000..e86e7b05
--- /dev/null
+++ b/src/Backend/Backend.vala
@@ -0,0 +1,787 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+namespace FeedReader {
+
+ public class FeedReaderBackend : GLib.Object {
+
+#if LIBUNITY
+ private Unity.LauncherEntry m_launcher;
+#endif
+ private LoginResponse m_loggedin;
+ private GLib.Cancellable m_cancellable;
+ private bool m_offline = true;
+ private bool m_cacheSync = false;
+ private uint m_timeout_source_id = 0;
+ private delegate void asyncPayload();
+
+ public signal void syncStarted();
+ public signal void syncFinished();
+ public signal void springCleanStarted();
+ public signal void springCleanFinished();
+ public signal void newFeedList();
+ public signal void refreshFeedListCounter();
+ public signal void updateArticleList();
+ public signal void showArticleListOverlay();
+ public signal void setOffline();
+ public signal void setOnline();
+ public signal void feedAdded(bool error, string errmsg);
+ public signal void opmlImported();
+ public signal void updateSyncProgress(string progress);
+ public signal void tryLogin();
+
+ private static FeedReaderBackend? m_backend;
+
+ public static FeedReaderBackend get_default()
+ {
+ if(m_backend == null)
+ m_backend = new FeedReaderBackend();
+
+ return m_backend;
+ }
+
+ private FeedReaderBackend()
+ {
+ Logger.debug("backend: constructor");
+ var plugID = Settings.general().get_string("plugin");
+
+ if(plugID == "none")
+ m_loggedin = LoginResponse.NO_BACKEND;
+ else
+ login(plugID);
+
+#if LIBUNITY
+ m_launcher = Unity.LauncherEntry.get_for_desktop_id("org.gnome.FeedReader.desktop");
+ updateBadge();
+#endif
+ m_cancellable = new GLib.Cancellable();
+ scheduleSync(Settings.general().get_int("sync"));
+
+ GLib.NetworkMonitor.get_default().network_changed.connect((available) => {
+ if(available)
+ {
+ checkOnline();
+ }
+ else
+ {
+ setOffline();
+ }
+ });
+
+ this.setOffline.connect(() => {
+ m_offline = true;
+ });
+ this.setOnline.connect(() => {
+ m_offline = false;
+ CachedActionManager.get_default().executeActions();
+ });
+ }
+
+ public void startSync(bool initSync = false)
+ {
+ m_cancellable.reset();
+ asyncPayload pl = () => { sync(initSync, m_cancellable); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ });
+ }
+
+ public void cancelSync()
+ {
+ Logger.warning("backend: Cancel current sync");
+ m_cancellable.cancel();
+ }
+
+ public string getVersion()
+ {
+ return AboutInfo.version;
+ }
+
+
+ public bool supportTags()
+ {
+ return FeedServer.get_default().supportTags();
+ }
+
+ public bool supportCategories()
+ {
+ return FeedServer.get_default().supportCategories();
+ }
+
+ public bool supportFeedManipulation()
+ {
+ return FeedServer.get_default().supportFeedManipulation();
+ }
+
+ public bool supportMultiLevelCategories()
+ {
+ return FeedServer.get_default().supportMultiLevelCategories();
+ }
+
+ public string symbolicIcon()
+ {
+ Logger.debug("backend: symbolicIcon");
+ return FeedServer.get_default().symbolicIcon();
+ }
+
+ public string accountName()
+ {
+ return FeedServer.get_default().accountName();
+ }
+
+ public string getServerURL()
+ {
+ return FeedServer.get_default().getServerURL();
+ }
+
+ public string uncategorizedID()
+ {
+ return FeedServer.get_default().uncategorizedID();
+ }
+
+ public bool hideCategoryWhenEmpty(string catID)
+ {
+ return FeedServer.get_default().hideCategoryWhenEmpty(catID);
+ }
+
+ public bool useMaxArticles()
+ {
+ return FeedServer.get_default().useMaxArticles();
+ }
+
+ public void scheduleSync(int time)
+ {
+ if (m_timeout_source_id > 0)
+ {
+ GLib.Source.remove(m_timeout_source_id);
+ m_timeout_source_id = 0;
+ }
+
+ if(time == 0)
+ return;
+
+ m_timeout_source_id = GLib.Timeout.add_seconds_full(GLib.Priority.DEFAULT, time*60, () => {
+ if(!Settings.state().get_boolean("currently-updating")
+ && FeedServer.get_default().pluginLoaded())
+ {
+ Logger.debug("backend: Timeout!");
+ startSync(false);
+ }
+ return true;
+ });
+ }
+
+ private void sync(bool initSync = false, GLib.Cancellable? cancellable = null)
+ {
+ if(Settings.state().get_boolean("currently-updating")
+ || Settings.state().get_boolean("spring-cleaning"))
+ {
+ Logger.debug("Cant sync because login failed or sync/clean already ongoing");
+ return;
+ }
+
+ if(Utils.springCleaningNecessary())
+ {
+ Logger.info("backend: spring cleaning");
+ Settings.state().set_boolean("spring-cleaning", true);
+ springCleanStarted();
+ DataBase.writeAccess().springCleaning();
+ Settings.state().set_boolean("spring-cleaning", false);
+ springCleanFinished();
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ Logger.info("backend: sync started");
+ syncStarted();
+ Settings.state().set_boolean("currently-updating", true);
+
+ if(!checkOnline())
+ {
+ Logger.info("Cancelling sync because we're not online");
+ finishSync();
+ return;
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ finishSync();
+ return;
+ }
+
+ m_cacheSync = true;
+
+ if(initSync && FeedServer.get_default().doInitSync())
+ FeedServer.get_default().InitSyncContent(cancellable);
+ else
+ FeedServer.get_default().syncContent(cancellable);
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ finishSync();
+ return;
+ }
+
+ updateBadge();
+ m_cacheSync = false;
+ FeedServer.get_default().grabContent.begin(cancellable, (obj, res) => {
+ FeedServer.get_default().grabContent.end(res);
+ finishSync();
+ });
+ }
+
+ private void finishSync()
+ {
+ Settings.state().set_boolean("currently-updating", false);
+ Settings.state().set_string("sync-status", "");
+ Logger.info("backend: sync finished/cancelled");
+ syncFinished();
+ }
+
+ public bool checkOnline()
+ {
+ Logger.debug("backend: checkOnline");
+
+ if(GLib.NetworkMonitor.get_default().get_connectivity() != GLib.NetworkConnectivity.FULL)
+ {
+ Logger.error("backend: no network available");
+ }
+
+ if(!FeedServer.get_default().serverAvailable())
+ {
+ m_loggedin = LoginResponse.UNKNOWN_ERROR;
+ setOffline();
+ return false;
+ }
+
+ if(m_loggedin != LoginResponse.SUCCESS)
+ {
+ FeedServer.get_default().logout();
+ login(Settings.general().get_string("plugin"));
+ if(m_loggedin != LoginResponse.SUCCESS)
+ {
+ setOffline();
+ return false;
+ }
+ }
+
+ setOnline();
+ return true;
+ }
+
+
+ public async bool checkOnlineAsync()
+ {
+ if(!FeedServer.get_default().pluginLoaded())
+ return false;
+
+ Logger.debug("backend: checkOnlineAsync");
+ bool online = false;
+ SourceFunc callback = checkOnlineAsync.callback;
+ ThreadFunc<void*> run = () => {
+ Idle.add((owned) callback);
+ online = checkOnline();
+ return null;
+ };
+
+ new GLib.Thread<void*>("checkOnlineAsync", run);
+ yield;
+ return online;
+ }
+
+ public LoginResponse login(string plugName)
+ {
+ Logger.debug("backend: new FeedServer and login");
+
+ FeedServer.get_default().setActivePlugin(plugName);
+
+ if(!FeedServer.get_default().pluginLoaded())
+ {
+ Logger.error(@"backend: no active plugin");
+ m_loggedin = LoginResponse.NO_BACKEND;
+ return m_loggedin;
+ }
+
+ m_loggedin = FeedServer.get_default().login();
+
+ if(m_loggedin == LoginResponse.SUCCESS)
+ {
+ Settings.general().set_string("plugin", plugName);
+ setOnline();
+ }
+ else if(m_loggedin == LoginResponse.NO_BACKEND)
+ {
+ // do nothing
+ }
+ else
+ {
+ setOffline();
+ }
+
+
+ Logger.debug("backend: login status = " + m_loggedin.to_string());
+ return m_loggedin;
+ }
+
+ public LoginResponse isLoggedIn()
+ {
+ return m_loggedin;
+ }
+
+ public bool isOnline()
+ {
+ if(m_loggedin != LoginResponse.SUCCESS)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public void updateArticleRead(Article article)
+ {
+ if(m_offline)
+ CachedActionManager.get_default().markArticleRead(article.getArticleID(), article.getUnread());
+ else
+ {
+ if(m_cacheSync)
+ ActionCache.get_default().markArticleRead(article.getArticleID(), article.getUnread());
+
+ asyncPayload pl = () => { FeedServer.get_default().setArticleIsRead(article.getArticleID(), article.getUnread()); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+ }
+
+ asyncPayload pl = () => { DataBase.writeAccess().update_article(article); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ refreshFeedListCounter();
+ updateBadge();
+ });
+ }
+
+ public void updateArticleMarked(Article article)
+ {
+ if(m_offline)
+ CachedActionManager.get_default().markArticleStarred(article.getArticleID(), article.getMarked());
+ else
+ {
+ if(m_cacheSync)
+ ActionCache.get_default().markArticleStarred(article.getArticleID(), article.getMarked());
+ asyncPayload pl = () => { FeedServer.get_default().setArticleIsMarked(article.getArticleID(), article.getMarked()); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+ }
+
+
+ asyncPayload pl = () => { DataBase.writeAccess().update_article(article); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ refreshFeedListCounter();
+ });
+ }
+
+
+ public Tag? createTag(string caption)
+ {
+ if(m_offline)
+ return null;
+
+ string tagID = FeedServer.get_default().createTag(caption);
+ var tag = new Tag(tagID, caption, 0);
+ DataBase.writeAccess().write_tag(tag);
+ newFeedList();
+
+ return tag;
+ }
+
+ public void tagArticle(Article article, Tag tag, bool add)
+ {
+ if(m_offline)
+ return;
+
+ if(add)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().tagArticle(article, tag); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ article.addTag(tag.getTagID());
+
+ }
+ else
+ {
+ Logger.debug("backend: remove tag: " + tag.getTagID() + " from article: " + article.getArticleID());
+
+ asyncPayload pl = () => { FeedServer.get_default().removeArticleTag(article, tag); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ article.removeTag(tag.getTagID());
+ }
+
+ DataBase.writeAccess().update_article(article);
+
+ if(!add && !DataBase.readOnly().tag_still_used(tag))
+ {
+ Logger.debug("backend: remove tag completely");
+ asyncPayload pl2 = () => { FeedServer.get_default().deleteTag(tag.getTagID()); };
+ callAsync.begin((owned)pl2, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl3 = () => { DataBase.writeAccess().dropTag(tag); };
+ callAsync.begin((owned)pl3, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+ }
+
+ public Tag renameTag(Tag tag, string newName)
+ {
+ if(m_offline)
+ return tag;
+
+ tag.setTitle(newName);
+
+ asyncPayload pl = () => { FeedServer.get_default().renameTag(tag.getTagID(), newName); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().update_tag(tag); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+
+ return tag;
+ }
+
+ public void deleteTag(Tag tag)
+ {
+ if(m_offline)
+ return;
+
+ asyncPayload pl = () => { FeedServer.get_default().deleteTag(tag.getTagID()); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().dropTag(tag); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public void updateTagColor(Tag tag)
+ {
+ DataBase.writeAccess().update_tag(tag);
+ }
+
+ public void resetDB()
+ {
+ DataBase.writeAccess().resetDB();
+ DataBase.writeAccess().init();
+ }
+
+ public void resetAccount()
+ {
+ FeedServer.get_default().resetAccount();
+ }
+
+ public void markFeedAsRead(string feedID, bool isCat)
+ {
+ if(isCat)
+ {
+ if(m_offline)
+ {
+ CachedActionManager.get_default().markCategoryRead(feedID);
+ }
+ else
+ {
+ if(m_cacheSync)
+ ActionCache.get_default().markCategoryRead(feedID);
+ asyncPayload pl = () => { FeedServer.get_default().setCategoryRead(feedID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+ }
+
+ asyncPayload pl = () => { DataBase.writeAccess().markCategorieRead(feedID); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ updateBadge();
+ newFeedList();
+ updateArticleList();
+ });
+ }
+ else
+ {
+ if(m_offline)
+ {
+ CachedActionManager.get_default().markFeedRead(feedID);
+ }
+ else
+ {
+ if(m_cacheSync)
+ ActionCache.get_default().markFeedRead(feedID);
+ asyncPayload pl = () => { FeedServer.get_default().setFeedRead(feedID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+ }
+
+ asyncPayload pl = () => { DataBase.writeAccess().markFeedRead(feedID); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ updateBadge();
+ newFeedList();
+ updateArticleList();
+ });
+ }
+ }
+
+ public void markAllItemsRead()
+ {
+ if(m_offline)
+ {
+ CachedActionManager.get_default().markAllRead();
+ }
+ else
+ {
+ if(m_cacheSync)
+ ActionCache.get_default().markAllRead();
+ asyncPayload pl = () => { FeedServer.get_default().markAllItemsRead(); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+ }
+
+ asyncPayload pl = () => { DataBase.writeAccess().markAllRead(); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ updateBadge();
+ newFeedList();
+ updateArticleList();
+ });
+ }
+
+ public void removeCategory(string catID)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().deleteCategory(catID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().delete_category(catID); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public void moveCategory(string catID, string newParentID)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().moveCategory(catID, newParentID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().move_category(catID, newParentID); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public string addCategory(string title, string? parentID = null, bool createLocally = false)
+ {
+ Logger.debug("backend: addCategory " + title);
+ string catID = FeedServer.get_default().createCategory(title, parentID);
+
+ if(createLocally)
+ {
+ string? parent = parentID;
+ int level = 1;
+ if(parentID == null || parentID == "")
+ {
+ parent = CategoryID.MASTER.to_string();
+ }
+ else
+ {
+ var parentCat = DataBase.readOnly().read_category(parentID);
+ level = parentCat.getLevel()+1;
+ }
+
+ var cat = new Category(catID, title, 0, 99, parent, level);
+ var list = new Gee.LinkedList<Category>();
+ list.add(cat);
+ DataBase.writeAccess().write_categories(list);
+ }
+
+ return catID;
+ }
+
+ public void removeCategoryWithChildren(string catID)
+ {
+ var feeds = DataBase.readOnly().read_feeds();
+ deleteFeedsInCategory(catID, feeds);
+
+ var cats = DataBase.readOnly().read_categories(feeds);
+ foreach(var cat in cats)
+ {
+ if(cat.getParent() == catID)
+ {
+ removeCategoryWithChildren(catID);
+ }
+ }
+
+ removeCategory(catID);
+ }
+
+ private void deleteFeedsInCategory(string catID, Gee.List<Feed> feeds)
+ {
+ foreach(Feed feed in feeds)
+ {
+ if(feed.hasCat(catID))
+ {
+ removeFeed(feed.getFeedID());
+ }
+ }
+ }
+
+ public void renameCategory(string catID, string newName)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().renameCategory(catID, newName); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().rename_category(catID, newName); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public void renameFeed(string feedID, string newName)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().renameFeed(feedID, newName); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().rename_feed(feedID, newName); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public void moveFeed(string feedID, string currentCatID, string? newCatID = null)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().moveFeed(feedID, newCatID, currentCatID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().move_feed(feedID, currentCatID, newCatID); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public void addFeed(string feedURL, string cat, bool isID, bool asynchron)
+ {
+ string? catID = null;
+ string? newCatName = null;
+ string? feedID = null;
+ bool success = false;
+ string errmsg = "";
+
+ if(cat != "")
+ {
+ if(isID)
+ catID = cat;
+ else
+ newCatName = cat;
+ }
+
+ if(asynchron)
+ {
+ new GLib.Thread<void*>(null, () => {
+ success = FeedServer.get_default().addFeed(feedURL, catID, newCatName, out feedID, out errmsg);
+ errmsg = (success) ? "" : errmsg; // just to be sure :P
+ feedAdded(!success, errmsg);
+
+ if(success)
+ {
+ startSync();
+ }
+
+ return null;
+ });
+ }
+ else
+ {
+ success = FeedServer.get_default().addFeed(feedURL, catID, newCatName, out feedID, out errmsg);
+ errmsg = (success) ? "" : errmsg;
+ feedAdded(!success, errmsg);
+ }
+ }
+
+ public void removeFeed(string feedID)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().removeFeed(feedID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().delete_feed(feedID); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ updateArticleList();
+ });
+ }
+
+ public void removeFeedOnlyFromCat(string feedID, string catID)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().removeCatFromFeed(feedID, catID); };
+ callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
+
+ asyncPayload pl2 = () => { DataBase.writeAccess().removeCatFromFeed(feedID, catID); };
+ callAsync.begin((owned)pl2, (obj, res) => {
+ callAsync.end(res);
+ newFeedList();
+ });
+ }
+
+ public void importOPML(string opml)
+ {
+ asyncPayload pl = () => { FeedServer.get_default().importOPML(opml); };
+ callAsync.begin((owned)pl, (obj, res) => {
+ callAsync.end(res);
+ opmlImported();
+ });
+ }
+
+ public void updateBadge()
+ {
+#if LIBUNITY
+ if(!Settings.state().get_boolean("spring-cleaning")
+ && Settings.tweaks().get_boolean("show-badge"))
+ {
+ var count = DataBase.readOnly().get_unread_total();
+ Logger.debug("backend: update badge count %u".printf(count));
+ m_launcher.count = count;
+ if(count > 0)
+ m_launcher.count_visible = true;
+ else
+ m_launcher.count_visible = false;
+ }
+#endif
+ }
+
+ private async void callAsync(owned asyncPayload func)
+ {
+ SourceFunc callback = callAsync.callback;
+ new GLib.Thread<void*>(null, () => {
+ func();
+ Idle.add((owned) callback);
+ return null;
+ });
+ yield;
+ }
+
+ }
+}
diff --git a/src/Backend/FeedServer.vala b/src/Backend/FeedServer.vala
index 48f1a87f..abfd6487 100644
--- a/src/Backend/FeedServer.vala
+++ b/src/Backend/FeedServer.vala
@@ -16,19 +16,16 @@
public class FeedReader.FeedServer : GLib.Object {
private bool m_pluginLoaded = false;
- private string? m_plugName = null;
private Peas.ExtensionSet m_extensions;
+ private string? m_activeExtension = null;
private FeedServerInterface? m_plugin;
private Peas.Engine m_engine;
- public signal void newFeedList();
- public signal void updateFeedList();
- public signal void updateArticleList();
- public signal void writeInterfaceState();
- public signal void showArticleListOverlay();
- public signal void updateSyncProgress(string progress);
+
+ public signal void PluginsChanedEvent();
private static FeedServer? m_server;
+
public static FeedServer get_default()
{
if(m_server == null)
@@ -39,26 +36,45 @@ public class FeedReader.FeedServer : GLib.Object {
private FeedServer()
{
+ string pluginPath = Constants.INSTALL_LIBDIR + "/plugins/";
+ Logger.debug(@"FeedServer: search path for plugins is $pluginPath");
+
m_engine = Peas.Engine.get_default();
- m_engine.add_search_path(Constants.INSTALL_PREFIX + "/" + Constants.INSTALL_LIBDIR + "/plugins/", null);
+ m_engine.add_search_path(pluginPath, null);
m_engine.enable_loader("python3");
m_extensions = new Peas.ExtensionSet(m_engine, typeof(FeedServerInterface));
m_extensions.extension_added.connect((info, extension) => {
Logger.debug("feedserver: plugin loaded %s".printf(info.get_name()));
- m_plugin = (extension as FeedServerInterface);
- m_plugin.init();
- m_plugin.newFeedList.connect(() => { newFeedList(); });
- m_plugin.updateFeedList.connect(() => { updateFeedList(); });
- m_plugin.updateArticleList.connect(() => { updateArticleList(); });
- m_plugin.writeInterfaceState.connect(() => { writeInterfaceState(); });
- m_plugin.showArticleListOverlay.connect(() => { showArticleListOverlay(); });
- m_plugin.writeArticles.connect((articles) => { writeArticles(articles); });
+ try
+ {
+ var secret_service = Secret.Service.get_sync(Secret.ServiceFlags.OPEN_SESSION);
+ // Supposedly create_sync should return an existing alias, but in practice it locks up,
+ // so lookup the alias before trying to create it.
+ var secrets = Secret.Collection.for_alias_sync(secret_service, Secret.COLLECTION_DEFAULT, Secret.CollectionFlags.NONE);
+ if(secrets == null)
+ secrets = Secret.Collection.create_sync(secret_service, "Login", Secret.COLLECTION_DEFAULT, Secret.CollectionCreateFlags.COLLECTION_CREATE_NONE);
+
+ // Intentionally creating a new database handle here so we don't
+ // have to deal with threading issues. *Do not use the static
+ // getter for this!*
+ var db = new DataBaseReadOnly();
+ var db_write = new DataBase();
+ var settings_backend = null; // FIXME: Why does SettingsBackend.get_default() crash on Arch Linux?
+ (extension as FeedServerInterface).init(settings_backend, secrets, db, db_write);
+ PluginsChanedEvent();
+ }
+ catch(Error e)
+ {
+ // FIXME: This error is fatal but this log message doesn't treat it that way
+ Logger.error("FeedServer: " + e.message);
+ }
});
m_extensions.extension_removed.connect((info, extension) => {
Logger.debug("feedserver: plugin removed %s".printf(info.get_name()));
+ PluginsChanedEvent();
});
m_engine.load_plugin.connect((info) => {
@@ -68,197 +84,275 @@ public class FeedReader.FeedServer : GLib.Object {
m_engine.unload_plugin.connect((info) => {
Logger.debug("feedserver: engine unload %s".printf(info.get_name()));
});
+
+ if(Settings.general().get_string("plugin") == "none")
+ {
+ LoadAllPlugins();
+ }
+ else
+ {
+ LoadPlugin(Settings.general().get_string("plugin"));
+ }
}
- public bool unloadPlugin()
+ public void LoadAllPlugins()
{
- if(m_plugName == null)
+ Logger.debug("FeedServer: load all available plugins");
+ foreach(var plugin in m_engine.get_plugin_list())
{
- Logger.warning("feedserver.unloadPlugin: no plugin loaded");
- return false;
+ m_engine.try_load_plugin(plugin);
}
+ // have to readd this path, otherwise new icons won't show up
+ Gtk.IconTheme.get_default().add_resource_path("/org/gnome/FeedReader/icons");
+ }
- Logger.debug("feedserver: unload plugin %s".printf(m_plugName));
- if(m_pluginLoaded)
+ private void LoadPlugin(string pluginID)
+ {
+ Logger.debug(@"FeedServer: load plugin $pluginID");
+ var plugin = m_engine.get_plugin_info(pluginID);
+ if(!m_engine.try_load_plugin(plugin))
{
- var plugin = m_engine.get_plugin_info(m_plugName);
- return m_engine.try_unload_plugin(plugin);
+ Logger.error(@"FeedServer: loading plugin $pluginID failed");
+ LoadAllPlugins();
}
- return false;
}
- public bool loadPlugin(string plugName)
+ public bool pluginLoaded()
{
- Logger.debug("feedserver: load plugin \"%s\"".printf(plugName));
- m_plugName = plugName;
- var plugin = m_engine.get_plugin_info(plugName);
+ return m_pluginLoaded;
+ }
- if(plugin != null)
- m_pluginLoaded = m_engine.try_load_plugin(plugin);
- else
- m_pluginLoaded = false;
+ public Peas.ExtensionSet getPlugins()
+ {
+ return m_extensions;
+ }
- if(!m_pluginLoaded)
- Logger.error("feedserver: couldn't load plugin %s".printf(m_plugName));
+ public bool setActivePlugin(string pluginID)
+ {
+ m_pluginLoaded = false;
+ m_plugin = null;
+ var plugin = m_engine.get_plugin_info(pluginID);
+
+ if(plugin == null)
+ {
+ Logger.error(@"feedserver: failed to load info for \"$pluginID\"");
+ return m_pluginLoaded;
+ }
+
+ Logger.info("Plugin Name: " + plugin.get_name());
+ Logger.info("Plugin Version: " + plugin.get_version());
+ Logger.info("Plugin Website: " + plugin.get_website());
+ Logger.info("Plugin Dir: " + plugin.get_module_dir());
+
+
+ m_activeExtension = pluginID;
+ m_extensions.foreach((extSet, info, ext) => {
+ var plug = ext as FeedServerInterface;
+ if(plug != null && plug.getID() == pluginID)
+ {
+ plug.tryLogin.connect(() => { FeedReaderBackend.get_default().tryLogin(); });
+ plug.newFeedList.connect(() => { FeedReaderBackend.get_default().newFeedList(); });
+ plug.refreshFeedListCounter.connect(() => { FeedReaderBackend.get_default().refreshFeedListCounter(); });
+ plug.updateArticleList.connect(() => { FeedReaderBackend.get_default().updateArticleList(); });
+ plug.showArticleListOverlay.connect(() => { FeedReaderBackend.get_default().showArticleListOverlay(); });
+ plug.writeArticles.connect((articles) => { writeArticles(articles); });
+
+ m_plugin = plug;
+ m_pluginLoaded = true;
+ }
+ });
return m_pluginLoaded;
}
- public bool pluginLoaded()
+ public FeedServerInterface? getActivePlugin()
{
- return m_pluginLoaded;
+ return m_plugin;
}
- public void syncContent()
+ public void syncContent(GLib.Cancellable? cancellable = null)
{
if(!serverAvailable())
{
- Logger.debug("FeedServer: can't snyc - not logged in or unreachable");
+ Logger.debug("FeedServer: can't sync - not logged in or unreachable");
return;
}
- int before = dbDaemon.get_default().getHighestRowID();
+ if(syncFeedsAndCategories())
+ {
+ var categories = new Gee.LinkedList<Category>();
+ var feeds = new Gee.LinkedList<Feed>();
+ var tags = new Gee.LinkedList<Tag>();
- var categories = new Gee.LinkedList<category>();
- var feeds = new Gee.LinkedList<feed>();
- var tags = new Gee.LinkedList<tag>();
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
- syncProgress(_("Getting feeds and categories"));
+ syncProgress(_("Getting feeds and categories"));
- if(!getFeedsAndCats(feeds, categories, tags))
- {
- Logger.error("FeedServer: something went wrong getting categories and feeds");
- return;
- }
+ if(!getFeedsAndCats(feeds, categories, tags, cancellable))
+ {
+ Logger.error("FeedServer: something went wrong getting categories and feeds");
+ return;
+ }
- // write categories
- if(categories.size != 0)
- {
- dbDaemon.get_default().reset_exists_flag();
- dbDaemon.get_default().write_categories(categories);
- dbDaemon.get_default().delete_nonexisting_categories();
- }
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
- // write feeds
- if(feeds.size != 0)
- {
- dbDaemon.get_default().reset_subscribed_flag();
- dbDaemon.get_default().write_feeds(feeds);
- dbDaemon.get_default().delete_articles_without_feed();
- dbDaemon.get_default().delete_unsubscribed_feeds();
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ // write categories
+ DataBase.writeAccess().reset_exists_flag();
+ DataBase.writeAccess().write_categories(categories);
+ DataBase.writeAccess().delete_nonexisting_categories();
+
+ // write feeds
+ DataBase.writeAccess().reset_subscribed_flag();
+ DataBase.writeAccess().write_feeds(feeds);
+ DataBase.writeAccess().delete_articles_without_feed();
+ DataBase.writeAccess().delete_unsubscribed_feeds();
+
+ // write tags
+ DataBase.writeAccess().reset_exists_tag();
+ DataBase.writeAccess().write_tags(tags);
+ DataBase.writeAccess().update_tags(tags);
+ DataBase.writeAccess().delete_nonexisting_tags();
+
+ FeedReaderBackend.get_default().newFeedList();
}
- // write tags
- if(tags.size != 0)
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ var drop_articles = (DropArticles)Settings.general().get_enum("drop-articles-after");
+ DateTime? since = drop_articles.to_start_date();
+ if(!DataBase.readOnly().isTableEmpty("articles"))
{
- dbDaemon.get_default().reset_exists_tag();
- dbDaemon.get_default().write_tags(tags);
- dbDaemon.get_default().update_tags(tags);
- dbDaemon.get_default().delete_nonexisting_tags();
+ var last_sync = new DateTime.from_unix_utc(Settings.state().get_int("last-sync"));
+ if(since == null || last_sync.to_unix() > since.to_unix())
+ {
+ since = last_sync;
+ }
}
- newFeedList();
-
int unread = getUnreadCount();
int max = ArticleSyncCount();
+
syncProgress(_("Getting articles"));
+ string row_id = DataBase.readOnly().getMaxID("articles", "rowid");
+ int before = row_id != null ? int.parse(row_id) : 0;
if(unread > max && useMaxArticles())
{
- getArticles(20, ArticleStatus.MARKED);
- getArticles(unread, ArticleStatus.UNREAD);
+ getArticles(20, ArticleStatus.MARKED, since, null, false, cancellable);
+ getArticles(unread, ArticleStatus.UNREAD, since, null, false, cancellable);
}
else
{
- getArticles(max);
+ getArticles(max, ArticleStatus.ALL, since, null, false, cancellable);
}
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
//update fulltext table
- dbDaemon.get_default().updateFTS();
+ DataBase.writeAccess().updateFTS();
- int after = dbDaemon.get_default().getHighestRowID();
+ int new_and_unread = DataBase.readOnly().get_new_unread_count(row_id != null ? int.parse(row_id) : 0);
+ row_id = DataBase.readOnly().getMaxID("articles", "rowid");
+ int after = row_id != null ? int.parse(row_id) : 0;
int newArticles = after-before;
if(newArticles > 0)
{
- Notification.send(newArticles);
- setNewRows(newArticles);
+ Notification.send(newArticles, new_and_unread);
}
- switch(Settings.general().get_enum("drop-articles-after"))
- {
- case DropArticles.NEVER:
- break;
-
- case DropArticles.ONE_WEEK:
- dbDaemon.get_default().dropOldArtilces(1);
- break;
-
- case DropArticles.ONE_MONTH:
- dbDaemon.get_default().dropOldArtilces(4);
- break;
-
- case DropArticles.SIX_MONTHS:
- dbDaemon.get_default().dropOldArtilces(24);
- break;
- }
+ var drop_weeks = drop_articles.to_weeks();
+ if(drop_weeks != null)
+ DataBase.writeAccess().dropOldArtilces(-(int)drop_weeks);
var now = new DateTime.now_local();
Settings.state().set_int("last-sync", (int)now.to_unix());
- dbDaemon.get_default().checkpoint();
-
+ DataBase.writeAccess().checkpoint();
+ FeedReaderBackend.get_default().newFeedList();
return;
}
- public void InitSyncContent()
+ public void InitSyncContent(GLib.Cancellable? cancellable = null)
{
Logger.debug("FeedServer: initial sync");
- var categories = new Gee.LinkedList<category>();
- var feeds = new Gee.LinkedList<feed>();
- var tags = new Gee.LinkedList<tag>();
+ if(syncFeedsAndCategories())
+ {
+ var categories = new Gee.LinkedList<Category>();
+ var feeds = new Gee.LinkedList<Feed>();
+ var tags = new Gee.LinkedList<Tag>();
- syncProgress(_("Getting feeds and categories"));
+ syncProgress(_("Getting feeds and categories"));
- getFeedsAndCats(feeds, categories, tags);
+ getFeedsAndCats(feeds, categories, tags, cancellable);
- // write categories
- dbDaemon.get_default().write_categories(categories);
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
- // write feeds
- dbDaemon.get_default().write_feeds(feeds);
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
- // write tags
- dbDaemon.get_default().write_tags(tags);
+ // write categories
+ DataBase.writeAccess().write_categories(categories);
- newFeedList();
+ // write feeds
+ DataBase.writeAccess().write_feeds(feeds);
+
+ // write tags
+ DataBase.writeAccess().write_tags(tags);
+
+ FeedReaderBackend.get_default().newFeedList();
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ var drop_articles = (DropArticles)Settings.general().get_enum("drop-articles-after");
+ DateTime? since = drop_articles.to_start_date();
// get marked articles
syncProgress(_("Getting starred articles"));
- getArticles(Settings.general().get_int("max-articles"), ArticleStatus.MARKED);
+ getArticles(Settings.general().get_int("max-articles"), ArticleStatus.MARKED, since, null, false, cancellable);
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
// get articles for each tag
syncProgress(_("Getting tagged articles"));
- foreach(var tag_item in tags)
+ foreach(var tag_item in DataBase.readOnly().read_tags())
{
- getArticles((Settings.general().get_int("max-articles")/8), ArticleStatus.ALL, tag_item.getTagID(), true);
+ getArticles((Settings.general().get_int("max-articles")/8), ArticleStatus.ALL, since, tag_item.getTagID(), true, cancellable);
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
}
if(useMaxArticles())
{
//get max-articls amunt like normal sync
- getArticles(Settings.general().get_int("max-articles"));
+ getArticles(Settings.general().get_int("max-articles"), ArticleStatus.ALL, since, null, false, cancellable);
}
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
// get unread articles
syncProgress(_("Getting unread articles"));
- getArticles(getUnreadCount(), ArticleStatus.UNREAD);
+ getArticles(getUnreadCount(), ArticleStatus.UNREAD, since, null, false, cancellable);
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
//update fulltext table
- dbDaemon.get_default().updateFTS();
+ DataBase.writeAccess().updateFTS();
Settings.general().reset("content-grabber");
@@ -268,120 +362,145 @@ public class FeedReader.FeedServer : GLib.Object {
return;
}
- private void writeArticles(Gee.LinkedList<article> articles)
+ private void writeArticles(Gee.List<Article> articles)
{
if(articles.size > 0)
{
- dbDaemon.get_default().update_articles(articles);
- var new_articles = new Gee.LinkedList<article>();
+ DataBase.writeAccess().update_articles(articles);
- var it = articles.bidir_list_iterator();
- for (var has_next = it.last(); has_next; has_next = it.previous())
- new_articles.add(it.get());
+ // Reverse the list
+ var new_articles = new Gee.ArrayList<Article>();
+ foreach(var article in articles)
+ {
+ new_articles.insert(0, article);
+ }
- dbDaemon.get_default().write_articles(new_articles);
- updateFeedList();
- updateArticleList();
+ DataBase.writeAccess().write_articles(new_articles);
+ FeedReaderBackend.get_default().refreshFeedListCounter();
+ FeedReaderBackend.get_default().updateArticleList();
}
}
- private void setNewRows(int newArticles)
+ public async void grabContent(GLib.Cancellable? cancellable = null)
{
- Logger.debug("FeedServer: new articles: %i".printf(newArticles));
- writeInterfaceState();
-
- if(Settings.state().get_boolean("no-animations") && Settings.state().get_enum("show-articles") == ArticleListState.ALL)
- {
- int newCount = Settings.state().get_int("articlelist-new-rows") + (int)UtilsDaemon.getRelevantArticles(newArticles);
- Logger.debug(@"UI NOT running: setting \"articlelist-new-rows\" to $newCount");
- Settings.state().set_int("articlelist-new-rows", newCount);
- }
- }
+ if(!Settings.general().get_boolean("download-images")
+ && !Settings.general().get_boolean("content-grabber"))
+ return;
- public void grabContent()
- {
Logger.debug("FeedServer: grabContent");
- var articles = dbDaemon.get_default().readUnfetchedArticles();
+ var articles = DataBase.readOnly().readUnfetchedArticles();
int size = articles.size;
int i = 0;
if(size > 0)
{
- foreach(var Article in articles)
+ var session = new Soup.Session();
+ session.user_agent = Constants.USER_AGENT;
+ session.timeout = 5;
+ session.ssl_strict = false;
+
+ try
{
- ++i;
- syncProgress(_(@"Grabbing full content: $i / $size"));
- if(Settings.general().get_boolean("content-grabber"))
- {
- var grabber = new Grabber(Article.getURL(), Article.getArticleID(), Article.getFeedID());
- if(grabber.process())
- {
- grabber.print();
- if(Article.getAuthor() != "" && grabber.getAuthor() != null)
+ var threads = new ThreadPool<Article>.with_owned_data((article) => {
+ if(cancellable != null && cancellable.is_cancelled())
+ return;
+
+ if(Settings.general().get_boolean("content-grabber"))
{
- Article.setAuthor(grabber.getAuthor());
+ var grabber = new Grabber(session, article);
+ if(grabber.process(cancellable))
+ {
+ grabber.print();
+ if(article.getAuthor() == "" && grabber.getAuthor() != null)
+ {
+ article.setAuthor(grabber.getAuthor());
+ }
+ if(article.getTitle() == "" && grabber.getTitle() != null)
+ {
+ article.setTitle(grabber.getTitle());
+ }
+ string html = grabber.getArticle();
+ string xml = "<?xml";
+
+ while(html.has_prefix(xml))
+ {
+ int end = html.index_of_char('>');
+ html = html.slice(end+1, html.length).chug();
+ }
+
+ article.setHTML(html);
+ }
+ else
+ {
+ downloadImages(session, article, cancellable);
+ }
}
- if(Article.getTitle() != "" && grabber.getTitle() != null)
+ else
{
- Article.setTitle(grabber.getTitle());
+ downloadImages(session, article, cancellable);
}
- string html = grabber.getArticle();
- string xml = "<?xml";
- while(html.has_prefix(xml))
- {
- int end = html.index_of_char('>');
- html = html.slice(end+1, html.length).chug();
- }
+ if(cancellable == null || !cancellable.is_cancelled())
+ DataBase.writeAccess().writeContent(article);
- Article.setHTML(html);
- }
- else
- {
- downloadImages(Article);
- }
- }
- else
+ ++i;
+ syncProgress(_(@"Grabbing full content: $i / $size"));
+ }, (int)GLib.get_num_processors(), true);
+
+ foreach(var Article in articles)
{
- downloadImages(Article);
+ threads.add(Article);
}
- dbDaemon.get_default().writeContent(Article);
+ bool immediate = false; // allow to queue up additional tasks
+ bool wait = true; // function will block until all tasks are done
+ ThreadPool.free((owned)threads, immediate, wait);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("FeedServer.grabContent: " + e.message);
}
//update fulltext table
- dbDaemon.get_default().updateFTS();
+ DataBase.writeAccess().updateFTS();
}
}
- private void downloadImages(article Article)
+ private void downloadImages(Soup.Session session, Article article, GLib.Cancellable? cancellable = null)
{
- if(Settings.tweaks().get_boolean("dont-download-images"))
+ if(!Settings.general().get_boolean("download-images"))
return;
var html_cntx = new Html.ParserCtxt();
- html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
- Html.Doc* doc = html_cntx.read_doc(Article.getHTML(), "");
- if (doc == null)
- {
- Logger.debug("Grabber: parsing failed");
- return;
- }
+ html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
+ Html.Doc* doc = html_cntx.read_doc(article.getHTML(), "");
+ if(doc == null)
+ {
+ Logger.debug("Grabber: parsing failed");
+ return;
+ }
grabberUtils.fixIframeSize(doc, "youtube.com");
- grabberUtils.repairURL("//img", "src", doc, Article.getURL());
- grabberUtils.repairURL("//iframe", "src", doc, Article.getURL());
+ grabberUtils.repairURL("//img", "src", doc, article.getURL());
+ grabberUtils.repairURL("//iframe", "src", doc, article.getURL());
grabberUtils.stripNode(doc, "//a[not(node())]");
grabberUtils.removeAttributes(doc, null, "style");
- grabberUtils.removeAttributes(doc, "a", "onclick");
- grabberUtils.removeAttributes(doc, "img", "srcset");
- grabberUtils.removeAttributes(doc, "img", "sizes");
+ grabberUtils.removeAttributes(doc, "a", "onclick");
+ grabberUtils.removeAttributes(doc, "img", "srcset");
+ grabberUtils.removeAttributes(doc, "img", "sizes");
grabberUtils.addAttributes(doc, "a", "target", "_blank");
- grabberUtils.saveImages(doc, Article.getArticleID(), Article.getFeedID());
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return;
+ }
+
+ grabberUtils.saveImages(session, doc, article, cancellable);
string html = "";
doc->dump_memory_enc(out html);
- html = grabberUtils.postProcessing(ref html);
- Article.setHTML(html);
+ html = grabberUtils.postProcessing(ref html);
+ article.setHTML(html);
delete doc;
}
@@ -396,7 +515,23 @@ public class FeedReader.FeedServer : GLib.Object {
// Only used with command-line
public static void grabArticle(string url)
{
- var grabber = new Grabber(url, null, null);
+ var session = new Soup.Session();
+ session.user_agent = Constants.USER_AGENT;
+ session.timeout = 5;
+ session.ssl_strict = false;
+
+ var a = new Article ("",
+ "",
+ url,
+ "",
+ ArticleStatus.UNREAD,
+ ArticleStatus.UNMARKED,
+ "",
+ "",
+ null,
+ new GLib.DateTime.now_local());
+
+ var grabber = new Grabber(session, a);
if(grabber.process())
{
grabber.print();
@@ -411,7 +546,7 @@ public class FeedReader.FeedServer : GLib.Object {
html = html.slice(end+1, html.length).chug();
}
- string path = GLib.Environment.get_user_data_dir() + "/debug-article/%s.html".printf(title);
+ string path = GLib.Environment.get_user_data_dir() + "/feedreader/debug-article/%s.html".printf(title);
if(FileUtils.test(path, GLib.FileTest.EXISTS))
GLib.FileUtils.remove(path);
@@ -419,6 +554,10 @@ public class FeedReader.FeedServer : GLib.Object {
try
{
var file = GLib.File.new_for_path(path);
+ var parent = file.get_parent();
+ if(!parent.query_exists())
+ parent.make_directory_with_parents();
+
var stream = file.create(FileCreateFlags.REPLACE_DESTINATION);
stream.write(html.data);
@@ -435,7 +574,7 @@ public class FeedReader.FeedServer : GLib.Object {
output = output.replace("\n"," ");
output = output.replace("_"," ");
- path = GLib.Environment.get_user_data_dir() + "/debug-article/%s.txt".printf(title);
+ path = GLib.Environment.get_user_data_dir() + "/feedreader/debug-article/%s.txt".printf(title);
if(FileUtils.test(path, GLib.FileTest.EXISTS))
GLib.FileUtils.remove(path);
@@ -460,35 +599,53 @@ public class FeedReader.FeedServer : GLib.Object {
// Only used with command-line
public static void grabImages(string htmlFile, string url)
{
+ var session = new Soup.Session();
+ session.user_agent = Constants.USER_AGENT;
+ session.timeout = 5;
+ session.ssl_strict = false;
+
var html_cntx = new Html.ParserCtxt();
- html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
- Html.Doc* doc = html_cntx.read_file(htmlFile);
- if (doc == null)
- {
- Logger.debug("Grabber: parsing failed");
- return;
- }
+ html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
+ Html.Doc* doc = html_cntx.read_file(htmlFile);
+ if (doc == null)
+ {
+ Logger.debug("Grabber: parsing failed");
+ return;
+ }
+
+ var a = new Article ("",
+ "",
+ url,
+ "",
+ ArticleStatus.UNREAD,
+ ArticleStatus.UNMARKED,
+ "",
+ "",
+ null,
+ new GLib.DateTime.now_local());
+
+
grabberUtils.repairURL("//img", "src", doc, url);
- grabberUtils.saveImages(doc, "", "");
+ grabberUtils.saveImages(session, doc, a);
string html = "";
doc->dump_memory_enc(out html);
- html = html.replace("<h3/>", "<h3></h3>");
-
- int pos1 = html.index_of("<iframe", 0);
- int pos2 = -1;
- while(pos1 != -1)
- {
- pos2 = html.index_of("/>", pos1);
- string broken_iframe = html.substring(pos1, pos2+2-pos1);
- string fixed_iframe = broken_iframe.substring(0, broken_iframe.length) + "></iframe>";
- html = html.replace(broken_iframe, fixed_iframe);
- int pos3 = html.index_of("<iframe", pos1+7);
- if(pos3 == pos1)
- break;
- else
- pos1 = pos3;
- }
+ html = html.replace("<h3/>", "<h3></h3>");
+
+ int pos1 = html.index_of("<iframe", 0);
+ int pos2 = -1;
+ while(pos1 != -1)
+ {
+ pos2 = html.index_of("/>", pos1);
+ string broken_iframe = html.substring(pos1, pos2+2-pos1);
+ string fixed_iframe = broken_iframe.substring(0, broken_iframe.length) + "></iframe>";
+ html = html.replace(broken_iframe, fixed_iframe);
+ int pos3 = html.index_of("<iframe", pos1+7);
+ if(pos3 == pos1)
+ break;
+ else
+ pos1 = pos3;
+ }
try
{
@@ -554,12 +711,12 @@ public class FeedReader.FeedServer : GLib.Object {
return m_plugin.uncategorizedID();
}
- public bool hideCagetoryWhenEmtpy(string catID)
+ public bool hideCategoryWhenEmpty(string catID)
{
if(!m_pluginLoaded)
return false;
- return m_plugin.hideCagetoryWhenEmtpy(catID);
+ return m_plugin.hideCategoryWhenEmpty(catID);
}
public bool supportCategories()
@@ -594,6 +751,14 @@ public class FeedReader.FeedServer : GLib.Object {
return m_plugin.supportMultiCategoriesPerFeed();
}
+ public bool syncFeedsAndCategories()
+ {
+ if(!m_pluginLoaded)
+ return false;
+
+ return m_plugin.syncFeedsAndCategories();
+ }
+
// some backends (inoreader, feedly) have the tag-name as part of the ID
// but for some of them the tagID changes when the name was changed (inoreader)
public bool tagIDaffectedByNameChange()
@@ -658,12 +823,12 @@ public class FeedReader.FeedServer : GLib.Object {
m_plugin.setFeedRead(feedID);
}
- public void setCategorieRead(string catID)
+ public void setCategoryRead(string catID)
{
if(!m_pluginLoaded)
return;
- m_plugin.setCategorieRead(catID);
+ m_plugin.setCategoryRead(catID);
}
public void markAllItemsRead()
@@ -674,20 +839,20 @@ public class FeedReader.FeedServer : GLib.Object {
m_plugin.markAllItemsRead();
}
- public void tagArticle(string articleID, string tagID)
+ public void tagArticle(Article article, Tag tag)
{
if(!m_pluginLoaded)
return;
- m_plugin.tagArticle(articleID, tagID);
+ m_plugin.tagArticle(article.getArticleID(), tag.getTagID());
}
- public void removeArticleTag(string articleID, string tagID)
+ public void removeArticleTag(Article article, Tag tag)
{
if(!m_pluginLoaded)
return;
- m_plugin.removeArticleTag(articleID, tagID);
+ m_plugin.removeArticleTag(article.getArticleID(), tag.getTagID());
}
public string createTag(string caption)
@@ -722,15 +887,26 @@ public class FeedReader.FeedServer : GLib.Object {
return m_plugin.serverAvailable();
}
- public void addFeed(string feedURL, string? catID = null, string? newCatName = null)
+ public bool addFeed(string feedURL, string? catID, string? newCatName, out string? feedID, out string errmsg)
{
- if(!m_pluginLoaded)
- return;
+ if(!m_pluginLoaded) {
+ feedID = null;
+ errmsg = "Plugin not loaded";
+ return false;
+ }
- m_plugin.addFeed(feedURL, catID, newCatName);
+ if(!m_plugin.addFeed(feedURL, catID, newCatName, out feedID, out errmsg))
+ return false;
+
+ int maxArticles = ArticleSyncCount();
+ DateTime? since = ((DropArticles)Settings.general().get_enum("drop-articles-after")).to_start_date();
+ var sinceStr = since == null ? "(null)" : since.to_string();
+ Logger.info(@"Downloading up to $(maxArticles) articles for feed $(feedID) ($(feedURL)), since $(sinceStr)");
+ getArticles(maxArticles, ArticleStatus.ALL, since, feedID);
+ return true;
}
- public void addFeeds(Gee.LinkedList<feed> feeds)
+ public void addFeeds(Gee.List<Feed> feeds)
{
if(!m_pluginLoaded)
return;
@@ -810,7 +986,7 @@ public class FeedReader.FeedServer : GLib.Object {
m_plugin.importOPML(opml);
}
- public bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags)
+ public bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null)
{
if(!m_pluginLoaded)
return false;
@@ -826,17 +1002,20 @@ public class FeedReader.FeedServer : GLib.Object {
return m_plugin.getUnreadCount();
}
- public void getArticles(int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? feedID = null, bool isTagID = false)
+ public void getArticles(int count, ArticleStatus whatToGet = ArticleStatus.ALL, DateTime? since = null, string? feedID = null, bool isTagID = false, GLib.Cancellable? cancellable = null)
{
if(!m_pluginLoaded)
+ {
+ Logger.error("getArticles() called with no plugin loaded");
return;
+ }
- m_plugin.getArticles(count, whatToGet, feedID, isTagID);
+ m_plugin.getArticles(count, whatToGet, since, feedID, isTagID);
}
private void syncProgress(string text)
{
- updateSyncProgress(text);
+ FeedReaderBackend.get_default().updateSyncProgress(text);
Settings.state().set_string("sync-status", text);
}
diff --git a/src/Backend/FeedServerInterface.vala b/src/Backend/FeedServerInterface.vala
index 7e61c2ec..7682fd94 100644
--- a/src/Backend/FeedServerInterface.vala
+++ b/src/Backend/FeedServerInterface.vala
@@ -16,13 +16,12 @@
public interface FeedReader.FeedServerInterface : GLib.Object {
public signal void newFeedList();
- public signal void updateFeedList();
+ public signal void refreshFeedListCounter();
public signal void updateArticleList();
- public signal void writeInterfaceState();
public signal void showArticleListOverlay();
- public signal void writeArticles(Gee.LinkedList<article> articles);
+ public signal void writeArticles(Gee.List<Article> articles);
- public abstract void init();
+ public abstract void init(GLib.SettingsBackend? settings_backend, Secret.Collection secrets, DataBaseReadOnly db, DataBase db_write);
public abstract bool supportTags();
@@ -36,7 +35,7 @@ public interface FeedReader.FeedServerInterface : GLib.Object {
public abstract string uncategorizedID();
- public abstract bool hideCagetoryWhenEmtpy(string catID);
+ public abstract bool hideCategoryWhenEmpty(string catID);
public abstract bool supportCategories();
@@ -46,6 +45,8 @@ public interface FeedReader.FeedServerInterface : GLib.Object {
public abstract bool supportMultiCategoriesPerFeed();
+ public abstract bool syncFeedsAndCategories();
+
// some backends (inoreader, feedly) have the tag-name as part of the ID
// but for some of them the tagID changes when the name was changed (inoreader)
public abstract bool tagIDaffectedByNameChange();
@@ -65,7 +66,7 @@ public interface FeedReader.FeedServerInterface : GLib.Object {
public abstract void setFeedRead(string feedID);
- public abstract void setCategorieRead(string catID);
+ public abstract void setCategoryRead(string catID);
public abstract void markAllItemsRead();
@@ -81,9 +82,9 @@ public interface FeedReader.FeedServerInterface : GLib.Object {
public abstract bool serverAvailable();
- public abstract string addFeed(string feedURL, string? catID = null, string? newCatName = null);
+ public abstract bool addFeed(string feedURL, string? catID, string? newCatName, out string feedID, out string errmsg);
- public abstract void addFeeds(Gee.LinkedList<feed> feeds);
+ public abstract void addFeeds(Gee.List<Feed> feeds);
public abstract void removeFeed(string feedID);
@@ -103,10 +104,37 @@ public interface FeedReader.FeedServerInterface : GLib.Object {
public abstract void importOPML(string opml);
- public abstract bool getFeedsAndCats(Gee.LinkedList<feed> feeds, Gee.LinkedList<category> categories, Gee.LinkedList<tag> tags);
+ public abstract bool getFeedsAndCats(Gee.List<Feed> feeds, Gee.List<Category> categories, Gee.List<Tag> tags, GLib.Cancellable? cancellable = null);
public abstract int getUnreadCount();
- public abstract void getArticles(int count, ArticleStatus whatToGet = ArticleStatus.ALL, string? feedID = null, bool isTagID = false);
+ public abstract void getArticles(int count, ArticleStatus whatToGet = ArticleStatus.ALL, DateTime? since = null, string? feedID = null, bool isTagID = false, GLib.Cancellable? cancellable = null);
+
+ // UI stuff
+ public signal void tryLogin();
+
+ public abstract string getWebsite();
+
+ public abstract BackendFlags getFlags();
+
+ public abstract string getID();
+
+ public abstract Gtk.Box? getWidget();
+
+ public abstract string iconName();
+
+ public abstract string serviceName();
+
+ public abstract bool needWebLogin();
+
+ public abstract void showHtAccess();
+
+ public abstract void writeData();
+
+ public abstract async void postLoginAction();
+
+ public abstract bool extractCode(string redirectURL);
+
+ public abstract string buildLoginURL();
}
diff --git a/src/Backend/OPMLparser.vala b/src/Backend/OPMLparser.vala
index 04eaa41a..755eaf92 100644
--- a/src/Backend/OPMLparser.vala
+++ b/src/Backend/OPMLparser.vala
@@ -17,19 +17,23 @@ public class FeedReader.OPMLparser : GLib.Object {
private string m_opmlString;
private uint m_level = 0;
- private Gee.LinkedList<feed> m_feeds;
+ private Gee.List<Feed> m_feeds;
public OPMLparser(string opml)
{
m_opmlString = opml;
- m_feeds = new Gee.LinkedList<feed>();
+ m_feeds = new Gee.LinkedList<Feed>();
}
public bool parse()
{
- Xml.Doc* doc = Xml.Parser.read_doc(m_opmlString, null, null, Xml.ParserOption.NOERROR + Xml.ParserOption.NOWARNING);
+ Xml.Doc* doc = Xml.Parser.read_doc(m_opmlString, null, null, 0);
if(doc == null)
+ {
+ Logger.error("OPML: parsing xml failed");
return false;
+ }
+
Xml.Node* root = doc->get_root_element();
if(root->name != "opml")
@@ -116,7 +120,7 @@ public class FeedReader.OPMLparser : GLib.Object {
title = node->get_prop("title");
Logger.debug(space() + "Category: " + title);
- string catID = FeedDaemonServer.get_default().addCategory(title, parentCatID, true);
+ string catID = FeedReaderBackend.get_default().addCategory(title, parentCatID, true);
parseTree(node, catID);
}
@@ -143,10 +147,13 @@ public class FeedReader.OPMLparser : GLib.Object {
Logger.debug(space() + "Feed: " + title + " feedURL: " + feedURL);
}
+ var categories = new Gee.ArrayList<string>();
if(catID == null)
- m_feeds.add(new feed("", title, website, false, 0, { FeedServer.get_default().uncategorizedID() }, feedURL));
+ categories.add(FeedServer.get_default().uncategorizedID());
else
- m_feeds.add(new feed("", title, website, false, 0, { catID }, feedURL));
+ categories.add(catID);
+
+ m_feeds.add(new Feed("", title, website, 0, categories, null, feedURL));
}
}
diff --git a/src/CachedActionManager.vala b/src/CachedActionManager.vala
index 290dab91..c60e1018 100644
--- a/src/CachedActionManager.vala
+++ b/src/CachedActionManager.vala
@@ -74,19 +74,19 @@ public class FeedReader.CachedActionManager : GLib.Object {
private void addAction(CachedAction action)
{
- if(dbDaemon.get_default().cachedActionNecessary(action))
+ if(DataBase.writeAccess().cachedActionNecessary(action))
{
- dbDaemon.get_default().addCachedAction(action.getType(), action.getID());
+ DataBase.writeAccess().addCachedAction(action.getType(), action.getID());
}
else
{
- dbDaemon.get_default().deleteOppositeCachedAction(action);
+ DataBase.writeAccess().deleteOppositeCachedAction(action);
}
}
public void executeActions()
{
- if(dbDaemon.get_default().isTableEmpty("CachedActions"))
+ if(DataBase.readOnly().isTableEmpty("CachedActions"))
{
Logger.debug("CachedActionManager - executeActions: no actions to perform");
return;
@@ -95,7 +95,7 @@ public class FeedReader.CachedActionManager : GLib.Object {
Logger.debug("CachedActionManager: executeActions");
- var actions = dbDaemon.get_default().readCachedActions();
+ var actions = DataBase.writeAccess().readCachedActions();
foreach(CachedAction action in actions)
{
@@ -126,7 +126,7 @@ public class FeedReader.CachedActionManager : GLib.Object {
FeedServer.get_default().setFeedRead(action.getID());
break;
case CachedActions.MARK_READ_CATEGORY:
- FeedServer.get_default().setCategorieRead(action.getID());
+ FeedServer.get_default().setCategoryRead(action.getID());
break;
case CachedActions.MARK_READ_ALL:
FeedServer.get_default().markAllItemsRead();
@@ -140,6 +140,8 @@ public class FeedReader.CachedActionManager : GLib.Object {
{
execute(m_ids.substring(1), m_lastAction);
}
+
+ DataBase.writeAccess().resetCachedActions();
}
private void execute(string ids, CachedActions action)
diff --git a/src/Constants.vala b/src/Constants.vala
new file mode 100644
index 00000000..04072f7a
--- /dev/null
+++ b/src/Constants.vala
@@ -0,0 +1,93 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General public License for more details.
+//
+// You should have received a copy of the GNU General public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+namespace FeedReader {
+
+ public class TagID : GLib.Object {
+ public const string NEW = "blubb";
+ }
+
+ public class AboutInfo : GLib.Object {
+ public const string programmName = "FeedReader";
+ public const string copyright = "Copyright © 2014-2017 Jan Lukas Gernert";
+ public const string version = "@VERSION@";
+ public const string comments = N_("Desktop Client for various RSS Services");
+ public const string[] authors = { "Jan Lukas Gernert", "Bilal Elmoussaoui", "Anwesh Reddy" , "Jason Scurtu", null };
+ public const string[] documenters = { "nobody", null };
+ public const string[] artists = {"Jan Lukas Gernert", "Harvey Cabaguio", "Jorge Marques", "Andrew Joyce", null};
+ public const string iconName = "org.gnome.FeedReader";
+ public const string translators = N_("translator-credits");
+ public const string website = "http://jangernert.github.io/FeedReader/";
+ }
+
+ public class Menu : GLib.Object {
+ public const string about = _("About");
+ public const string settings = _("Settings");
+ public const string reset = _("Change Account");
+ public const string quit = _("Quit");
+ public const string bugs = _("Report a Bug");
+ public const string bounty = _("Bounties");
+ public const string shortcuts = _("Shortcuts");
+ }
+
+ public class MediaButton : GLib.Object {
+ public const string PLAY = "Play";
+ public const string PAUSE = "Pause";
+ public const string MUTE = "Mute";
+ public const string UNMUTE = "Unmute";
+ public const string CLOSE = "Close";
+ }
+
+ public class Constants : GLib.Object {
+
+ public const string INSTALL_PREFIX = "@PREFIX@";
+ public const string INSTALL_LIBDIR = "@PKGLIBDIR@";
+ public const string LOCALE_DIR = "@LOCALE_DIR@";
+ public const string GIT_SHA1 = "@VCS_TAG@";
+ public const string USER_AGENT = "FeedReader @VERSION@";
+ public const int DB_SCHEMA_VERSION = 5;
+ public const int REDOWNLOAD_FAVICONS_AFTER_DAYS = 7;
+
+ // tango colors
+ public const string[] COLORS = {
+ "#edd400", // butter medium
+ "#f57900", // orange medium
+ "#c17d11", // chocolate medium
+ "#73d216", // chameleon medium
+ "#3465a4", // sky blue medium
+ "#75507b", // plum medium
+ "#cc0000", // scarlet red medium
+ "#d3d7cf", // aluminium medium
+
+ "#fce94f", // butter light
+ "#fcaf3e", // orange light
+ "#e9b96e", // chocolate light
+ "#8ae234", // chameleon light
+ "#729fcf", // sky blue light
+ "#ad7fa8", // plum light
+ "#ef2929", // scarlet red light
+ "#eeeeec", // aluminium light
+
+ "#c4a000", // butter dark
+ "#ce5c00", // orange dark
+ "#8f5902", // chocolate dark
+ "#4e9a06", // chameleon dark
+ "#204a87", // sky blue dark
+ "#5c3566", // plum dark
+ "#a40000", // scarlet red dark
+ "#babdb6" // aluminium dark
+ };
+ }
+}
diff --git a/src/ContentGrabber/grabber.vala b/src/ContentGrabber/grabber.vala
index 36a4b828..47e5e9e9 100644
--- a/src/ContentGrabber/grabber.vala
+++ b/src/ContentGrabber/grabber.vala
@@ -14,517 +14,585 @@
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
public class FeedReader.Grabber : GLib.Object {
- private string m_articleURL;
- private string? m_articleID;
- private string? m_feedID;
- private string m_rawHtml;
- private string m_nexPageURL;
- private GrabberConfig m_config;
- private bool m_firstPage;
- private Html.Doc* m_doc;
- private Xml.Node* m_root;
- private Xml.Ns* m_ns;
- private bool m_foundSomething;
- private bool m_singlePage;
-
-
- public string m_author;
- public string m_title;
- public string m_date;
- public string m_html;
-
- public Grabber(string articleURL, string? articleID, string? feedID)
- {
- m_articleURL = articleURL;
- m_articleID = articleID;
- m_feedID = feedID;
- m_firstPage = true;
- m_foundSomething = false;
- m_singlePage = false;
-
- if(m_articleURL.has_prefix("//"))
- m_articleURL = "http:" + m_articleURL;
- }
-
- ~Grabber()
- {
- delete m_doc;
- delete m_root;
- delete m_ns;
- }
-
- private bool checkConfigFile()
- {
- string filepath = Constants.INSTALL_PREFIX + "/share/FeedReader/GrabberConfig/";
-
- string hostName = grabberUtils.buildHostName(m_articleURL, false);
- string filename = filepath + hostName + ".txt";
- if(FileUtils.test(filename, GLib.FileTest.EXISTS))
- {
- m_config = new GrabberConfig(filename);
- Logger.debug("Grabber: using config %s.txt".printf(hostName));
- return true;
- }
-
- Logger.debug("Grabber: no config (%s.txt) found for article: %s".printf(hostName, m_articleURL));
-
- string newHostName = grabberUtils.buildHostName(m_articleURL, true);
- if(hostName != newHostName)
- {
- filename = filepath + newHostName + ".txt";
- if(FileUtils.test("%s%s.txt".printf(filename, newHostName), GLib.FileTest.EXISTS))
- {
- m_config = new GrabberConfig(filename);
- Logger.debug("Grabber: using config %s.txt".printf(newHostName));
- return true;
- }
- }
-
-
- Logger.debug("Grabber: no config (%s.txt) - cutSubdomain - found for article: %s".printf(newHostName, m_articleURL));
- return false;
- }
-
- public bool process()
- {
- Logger.debug("Grabber: process article: " + m_articleURL);
-
- if(m_articleURL == null || m_articleURL == "")
- {
- Logger.error("No valid article-url?!?");
- return false;
- }
-
- if(!checkContentType())
- return false;
-
-
- bool downloaded = false;
-
- if(!checkConfigFile())
- {
- // special treatment for sites like youtube
- string youtube = "youtube.com/watch?v=";
- if(m_articleURL.contains(youtube))
- {
- Logger.debug("Grabber: special treatment - youtube video");
- string ytHTML = "<div class=\"videoWrapper\"><iframe width=\"100%\" src=\"https://www.youtube.com/embed/%s\" frameborder=\"0\" allowfullscreen></iframe></div>";
- int start = m_articleURL.index_of(youtube) + youtube.length;
- int end = m_articleURL.index_of("?", start);
- string id = m_articleURL.substring(start, (end == -1) ? -1 : end-start);
-
- m_html = ytHTML.printf(id);
- return true;
- }
-
- string oldURL = m_articleURL;
-
- // download to check if website redirects
- downloaded = download();
-
- // if URL is different now after redirect
- if(m_articleURL != oldURL)
- {
- // check again after possible redirect
- if(!checkConfigFile())
- return false;
- }
- else
- {
- // url is still the same, so we don't have a grabber config
- return false;
- }
- }
-
- Logger.debug("Grabber: config found");
-
- if(!downloaded && !download())
- return false;
-
-
- Logger.debug("Grabber: download success");
-
- prepArticle();
-
- Logger.debug("Grabber: empty article preped");
-
- if(!parse())
- return false;
-
- if(!m_foundSomething)
- {
- Logger.error("Grabber: no body found");
- return false;
- }
-
- return true;
- }
-
- private bool checkContentType()
- {
- Logger.debug("Grabber: check contentType");
- var session = new Soup.Session();
- var message = new Soup.Message("HEAD", m_articleURL.escape(""));
- session.send_message(message);
- var params = new GLib.HashTable<string, string>(null, null);
- string? contentType = message.response_headers.get_content_type(out params);
- if(contentType != null)
- {
- if(contentType == "text/html")
- return true;
- }
-
- Logger.debug(@"Grabber: type $contentType");
- Logger.debug(@"Grabber: type != text/html so not going to proceed further");
-
- return false;
- }
-
- private bool download()
- {
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.timeout = 5;
- var msg = new Soup.Message("GET", m_articleURL.escape(""));
- msg.restarted.connect(() => {
- Logger.debug("Grabber: download redirected - " + msg.status_code.to_string());
- if(msg.status_code == Soup.Status.MOVED_TEMPORARILY
- || msg.status_code == Soup.Status.MOVED_PERMANENTLY)
- {
- m_articleURL = msg.uri.to_string(false);
- Logger.debug("Grabber: new url is: " + m_articleURL);
- }
- });
-
- if(Settings.tweaks().get_boolean("do-not-track"))
+ private Article m_article;
+ private string m_articleURL;
+ private string m_rawHtml;
+ private string m_nexPageURL;
+ private GrabberConfig m_config;
+ private Soup.Session m_session;
+ private bool m_firstPage;
+ private Html.Doc* m_doc;
+ private Xml.Node* m_root;
+ private Xml.Ns* m_ns;
+ private bool m_foundSomething;
+ private bool m_singlePage;
+
+
+ public string m_author;
+ public string m_title;
+ public string m_date;
+ public string m_html;
+
+ public Grabber(Soup.Session session, Article article)
+ {
+ m_article = article;
+ if(m_article.getURL().has_prefix("//"))
+ m_article.setURL("http:" + m_article.getURL());
+
+ m_articleURL = m_article.getURL();
+ m_firstPage = true;
+ m_foundSomething = false;
+ m_singlePage = false;
+ m_session = session;
+ }
+
+ ~Grabber()
+ {
+ delete m_doc;
+ delete m_ns;
+ }
+
+ private bool checkConfigFile()
+ {
+ string filepath = Constants.INSTALL_PREFIX + "/share/feedreader/GrabberConfig/";
+
+ string hostName = grabberUtils.buildHostName(m_articleURL, false);
+ string filename = filepath + hostName + ".txt";
+ if(FileUtils.test(filename, GLib.FileTest.EXISTS))
+ {
+ m_config = new GrabberConfig(filename);
+ Logger.debug("Grabber: using config %s.txt".printf(hostName));
+ return true;
+ }
+
+ Logger.debug("Grabber: no config (%s.txt) found for article: %s".printf(hostName, m_articleURL));
+
+ string newHostName = grabberUtils.buildHostName(m_articleURL, true);
+ if(hostName != newHostName)
+ {
+ filename = filepath + newHostName + ".txt";
+ if(FileUtils.test("%s%s.txt".printf(filename, newHostName), GLib.FileTest.EXISTS))
+ {
+ m_config = new GrabberConfig(filename);
+ Logger.debug("Grabber: using config %s.txt".printf(newHostName));
+ return true;
+ }
+ }
+
+
+ Logger.debug("Grabber: no config (%s.txt) - cutSubdomain - found for article: %s".printf(newHostName, m_articleURL));
+ return false;
+ }
+
+ public bool process(GLib.Cancellable? cancellable = null)
+ {
+ Logger.debug("Grabber: process article: " + m_articleURL);
+
+ var uri = new Soup.URI(m_articleURL);
+ if(uri == null)
+ {
+ Logger.error("No valid article-url?!?");
+ return false;
+ }
+
+ if(!checkContentType())
+ return false;
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ bool downloaded = false;
+
+ if(!checkConfigFile())
+ {
+ // special treatment for sites like youtube
+ string youtube = "youtube.com/watch?v=";
+ if(m_articleURL.contains(youtube))
+ {
+ Logger.debug("Grabber: special treatment - youtube video");
+ string ytHTML = "<div class=\"videoWrapper\"><iframe width=\"100%\" src=\"https://www.youtube.com/embed/%s\" frameborder=\"0\" allowfullscreen></iframe></div>";
+ int start = m_articleURL.index_of(youtube) + youtube.length;
+ int end = m_articleURL.index_of("?", start);
+ string id = m_articleURL.substring(start, (end == -1) ? -1 : end-start);
+
+ m_html = ytHTML.printf(id);
+ return true;
+ }
+
+ string oldURL = m_articleURL;
+
+ // download to check if website redirects
+ downloaded = download();
+
+ // if URL is different now after redirect
+ if(m_articleURL != oldURL)
+ {
+ // check again after possible redirect
+ if(!checkConfigFile())
+ return false;
+ }
+ else
+ {
+ // url is still the same, so we don't have a grabber config
+ return false;
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ Logger.debug("Grabber: config found");
+
+ if(!downloaded && !download())
+ return false;
+
+
+ Logger.debug("Grabber: download success");
+
+ prepArticle();
+
+ Logger.debug("Grabber: empty article preped");
+
+ if(!parse(cancellable))
+ return false;
+
+ if(!m_foundSomething)
+ {
+ Logger.error("Grabber: no body found");
+ return false;
+ }
+
+ return true;
+ }
+
+ private bool checkContentType()
+ {
+ Logger.debug("Grabber: check contentType");
+ var message = new Soup.Message("HEAD", m_articleURL.escape(""));
+
+ if(message == null)
+ return false;
+
+ m_session.send_message(message);
+ var params = new GLib.HashTable<string, string>(null, null);
+ string? contentType = message.response_headers.get_content_type(out params);
+ if(contentType != null)
+ {
+ if(contentType == "text/html")
+ return true;
+ }
+
+ Logger.debug(@"Grabber: type $contentType");
+ Logger.debug(@"Grabber: type != text/html so not going to proceed further");
+
+ return false;
+ }
+
+ private bool download()
+ {
+ var msg = new Soup.Message("GET", m_articleURL.escape(""));
+ ulong handlerID = msg.restarted.connect(() => {
+ Logger.debug("Grabber: download redirected - " + msg.status_code.to_string());
+ if(msg.status_code == Soup.Status.MOVED_TEMPORARILY
+ || msg.status_code == Soup.Status.MOVED_PERMANENTLY)
+ {
+ m_articleURL = msg.uri.to_string(false);
+ m_article.setURL(m_articleURL);
+ Logger.debug("Grabber: new url is: " + m_articleURL);
+ }
+ });
+
+ if(msg == null)
+ return false;
+
+ if(Settings.tweaks().get_boolean("do-not-track"))
msg.request_headers.append("DNT", "1");
- session.send_message(msg);
-
- if(msg.response_body == null)
- {
- Logger.debug("Grabber: download failed - no response");
- return false;
- }
-
- if((string)msg.response_body.flatten().data == "")
- {
- Logger.debug("Grabber: download failed - empty response");
- return false;
- }
-
- m_rawHtml = (string)msg.response_body.flatten().data;
- if(!m_rawHtml.validate())
- {
- string needle = "content=\"text/html; charset=";
- int start = m_rawHtml.index_of(needle) + needle.length;
- string locale = "";
-
- if(start != -1)
- {
- int end = m_rawHtml.index_of("\"", start);
- locale = m_rawHtml.substring(start, end-start);
- }
- else
- {
- needle = "charset=\"";
- start = m_rawHtml.index_of(needle) + needle.length;
- if(start != -1)
- {
- int end = m_rawHtml.index_of("\"", start);
- locale = m_rawHtml.substring(start, end-start);
- }
- else
- {
- return false;
- }
- }
-
- Logger.info(locale);
- try
- {
- m_rawHtml = GLib.convert(m_rawHtml, -1, "utf-8", locale);
- }
- catch(ConvertError e)
- {
- Logger.error("grabber: failed to convert locale - " + e.message);
- }
- }
-
- return true;
- }
-
- private bool parse()
- {
- m_nexPageURL = null;
- Logger.debug("Grabber: start parsing");
-
- // replace strings before parsing html
- unowned Gee.ArrayList<StringPair> replace = m_config.getReplace();
- if(replace.size != 0)
- {
- foreach(StringPair pair in replace)
- {
- m_rawHtml = m_rawHtml.replace(pair.getString1(), pair.getString2());
- }
- }
-
- Logger.debug("Grabber: parse html");
-
- // parse html
- var html_cntx = new Html.ParserCtxt();
- html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
- var doc = html_cntx.read_doc(m_rawHtml, "");
- if(doc == null)
- {
- Logger.debug("Grabber: parsing failed");
- return false;
- }
-
- Logger.debug("Grabber: html parsed");
-
-
- // get link to next page of article if there are more than one pages
- if(m_config.getXPathNextPageURL() != null)
- {
- Logger.debug("Grabber: grab next page url");
- m_nexPageURL = grabberUtils.getURL(doc, m_config.getXPathNextPageURL());
- }
-
- // get link to single-page view if it exists and download that page
- if(m_config.getXPathSinglePageURL() != null && m_nexPageURL == null)
- {
- Logger.debug("Grabber: grab single page view");
- string url = grabberUtils.getURL(doc, m_config.getXPathSinglePageURL());
- if(url != "" && url != null)
- {
- if(!url.has_prefix("http"))
- {
- url = grabberUtils.completeURL(url, m_articleURL);
- }
- Logger.debug("Grabber: single page url " + url);
- m_singlePage = true;
- m_articleURL = url;
- download();
- delete doc;
- doc = html_cntx.read_doc(m_rawHtml, "");
- }
- }
-
- // get the title from the html (useful if feed doesn't provide one)
- unowned Gee.ArrayList<string> title = m_config.getXPathTitle();
- if(title.size != 0 && m_firstPage)
- {
- Logger.debug("Grabber: get title");
- foreach(string xpath in title)
- {
- string tmptitle = grabberUtils.getValue(doc, xpath, m_firstPage);
- if(tmptitle != null && tmptitle != "")
- m_title = tmptitle.chomp().chug();
- }
- }
-
- // get the author from the html (useful if feed doesn't provide one)
- unowned Gee.ArrayList<string> author = m_config.getXPathAuthor();
- if(author.size != 0)
- {
- Logger.debug("Grabber: get author");
- foreach(string xpath in author)
- {
- string tmpAuthor = grabberUtils.getValue(doc, xpath);
- if(tmpAuthor != null)
- m_author = tmpAuthor.chomp().chug();
- }
- }
-
- // get the date from the html (useful if feed doesn't provide one)
- unowned Gee.ArrayList<string> date = m_config.getXPathDate();
- if(date.size != 0)
- {
- Logger.debug("Grabber: get date");
- foreach(string xpath in date)
- {
- string tmpDate = grabberUtils.getValue(doc, xpath);
- if(tmpDate != null)
- m_date = tmpDate.chomp().chug();
- }
- }
-
- // strip junk
- unowned Gee.ArrayList<string> strip = m_config.getXPathStrip();
- if(strip.size != 0)
- {
- Logger.debug("Grabber: strip junk");
- foreach(string xpath in strip)
- {
- Logger.debug("Grabber: strip %s".printf(xpath));
- grabberUtils.stripNode(doc, xpath);
- }
- }
-
- // strip any element whose @id or @class contains this substring
- unowned Gee.ArrayList<string> _stripIDorClass = m_config.getXPathStripIDorClass();
- if(_stripIDorClass.size != 0)
- {
- Logger.debug("Grabber: strip id's and class");
- foreach(string IDorClass in _stripIDorClass)
- {
- grabberUtils.stripIDorClass(doc, IDorClass);
- }
- }
-
- //strip any <img> element where @src attribute contains this substring
- unowned Gee.ArrayList<string> stripImgSrc = m_config.getXPathStripImgSrc();
- if(stripImgSrc.size != 0)
- {
- Logger.debug("Grabber: strip img-tags");
- foreach(string ImgSrc in stripImgSrc)
- {
- grabberUtils.stripNode(doc, "//img[contains(@src,'%s')]".printf(ImgSrc));
- }
- }
-
- grabberUtils.fixLazyImg(doc, "lazyload", "data-src");
- grabberUtils.fixIframeSize(doc, "youtube.com");
- grabberUtils.removeAttributes(doc, null, "style");
- grabberUtils.removeAttributes(doc, "a", "onclick");
- grabberUtils.removeAttributes(doc, "img", "srcset");
- grabberUtils.removeAttributes(doc, "img", "sizes");
- grabberUtils.addAttributes(doc, "a", "target", "_blank");
-
- // complete relative source urls of images
- Logger.debug("Grabber: complete urls");
- grabberUtils.repairURL("//img", "src", doc, m_articleURL);
- grabberUtils.repairURL("//a", "src", doc, m_articleURL);
- grabberUtils.repairURL("//a", "href", doc, m_articleURL);
- grabberUtils.repairURL("//object", "data", doc, m_articleURL);
- grabberUtils.repairURL("//iframe", "src", doc, m_articleURL);
-
- // strip elements using Readability.com and Instapaper.com ignore class names
+ m_session.send_message(msg);
+ msg.disconnect(handlerID);
+
+ if(msg.response_body == null)
+ {
+ Logger.debug("Grabber: download failed - no response");
+ return false;
+ }
+
+ if((string)msg.response_body.flatten().data == "")
+ {
+ Logger.debug("Grabber: download failed - empty response");
+ return false;
+ }
+
+ m_rawHtml = (string)msg.response_body.flatten().data;
+ if(!m_rawHtml.validate())
+ {
+ string needle = "content=\"text/html; charset=";
+ int start = m_rawHtml.index_of(needle) + needle.length;
+ string locale = "";
+
+ if(start != -1)
+ {
+ int end = m_rawHtml.index_of("\"", start);
+ locale = m_rawHtml.substring(start, end-start);
+ }
+ else
+ {
+ needle = "charset=\"";
+ start = m_rawHtml.index_of(needle) + needle.length;
+ if(start != -1)
+ {
+ int end = m_rawHtml.index_of("\"", start);
+ locale = m_rawHtml.substring(start, end-start);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ Logger.info(locale);
+ try
+ {
+ m_rawHtml = GLib.convert(m_rawHtml, -1, "utf-8", locale);
+ }
+ catch(ConvertError e)
+ {
+ Logger.error("grabber: failed to convert locale - " + e.message);
+ }
+ }
+
+ return true;
+ }
+
+ private bool parse(GLib.Cancellable? cancellable = null)
+ {
+ m_nexPageURL = null;
+ Logger.debug("Grabber: start parsing");
+
+ // replace strings before parsing html
+ unowned Gee.List<StringPair> replace = m_config.getReplace();
+ if(replace.size != 0)
+ {
+ foreach(StringPair pair in replace)
+ {
+ m_rawHtml = m_rawHtml.replace(pair.getString1(), pair.getString2());
+ }
+ }
+
+ Logger.debug("Grabber: parse html");
+
+ // parse html
+ var html_cntx = new Html.ParserCtxt();
+ html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
+ var doc = html_cntx.read_doc(m_rawHtml, "");
+ if(doc == null)
+ {
+ Logger.debug("Grabber: parsing failed");
+ return false;
+ }
+
+ Logger.debug("Grabber: html parsed");
+
+
+ // get link to next page of article if there are more than one pages
+ if(m_config.getXPathNextPageURL() != null)
+ {
+ Logger.debug("Grabber: grab next page url");
+ m_nexPageURL = grabberUtils.getURL(doc, m_config.getXPathNextPageURL());
+ }
+
+ // get link to single-page view if it exists and download that page
+ if(m_config.getXPathSinglePageURL() != null && m_nexPageURL == null)
+ {
+ Logger.debug("Grabber: grab single page view");
+ string url = grabberUtils.getURL(doc, m_config.getXPathSinglePageURL());
+ if(url != "" && url != null)
+ {
+ if(!url.has_prefix("http"))
+ {
+ url = grabberUtils.completeURL(url, m_articleURL);
+ }
+ m_singlePage = true;
+ m_articleURL = url;
+ download();
+ delete doc;
+ doc = html_cntx.read_doc(m_rawHtml, "");
+ }
+ }
+
+ // get the title from the html (useful if feed doesn't provide one)
+ unowned Gee.List<string> title = m_config.getXPathTitle();
+ if(title.size != 0 && m_firstPage)
+ {
+ Logger.debug("Grabber: get title");
+ foreach(string xpath in title)
+ {
+ string tmptitle = grabberUtils.getValue(doc, xpath, m_firstPage);
+ if(tmptitle != null && tmptitle != "")
+ m_title = tmptitle.chomp().chug();
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // get the author from the html (useful if feed doesn't provide one)
+ unowned Gee.List<string> author = m_config.getXPathAuthor();
+ if(author.size != 0)
+ {
+ Logger.debug("Grabber: get author");
+ foreach(string xpath in author)
+ {
+ string tmpAuthor = grabberUtils.getValue(doc, xpath);
+ if(tmpAuthor != null)
+ m_author = tmpAuthor.chomp().chug();
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // get the date from the html (useful if feed doesn't provide one)
+ unowned Gee.List<string> date = m_config.getXPathDate();
+ if(date.size != 0)
+ {
+ Logger.debug("Grabber: get date");
+ foreach(string xpath in date)
+ {
+ string tmpDate = grabberUtils.getValue(doc, xpath);
+ if(tmpDate != null)
+ m_date = tmpDate.chomp().chug();
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // strip junk
+ unowned Gee.List<string> strip = m_config.getXPathStrip();
+ if(strip.size != 0)
+ {
+ Logger.debug("Grabber: strip junk");
+ foreach(string xpath in strip)
+ {
+ Logger.debug("Grabber: strip %s".printf(xpath));
+ grabberUtils.stripNode(doc, xpath);
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // strip any element whose @id or @class contains this substring
+ unowned Gee.List<string> _stripIDorClass = m_config.getXPathStripIDorClass();
+ if(_stripIDorClass.size != 0)
+ {
+ Logger.debug("Grabber: strip id's and class");
+ foreach(string IDorClass in _stripIDorClass)
+ {
+ grabberUtils.stripIDorClass(doc, IDorClass);
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ //strip any <img> element where @src attribute contains this substring
+ unowned Gee.List<string> stripImgSrc = m_config.getXPathStripImgSrc();
+ if(stripImgSrc.size != 0)
+ {
+ Logger.debug("Grabber: strip img-tags");
+ foreach(string ImgSrc in stripImgSrc)
+ {
+ grabberUtils.stripNode(doc, "//img[contains(@src,'%s')]".printf(ImgSrc));
+ }
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ grabberUtils.fixLazyImg(doc, "lazyload", "data-src");
+ grabberUtils.fixIframeSize(doc, "youtube.com");
+ grabberUtils.removeAttributes(doc, null, "style");
+ grabberUtils.removeAttributes(doc, "a", "onclick");
+ grabberUtils.removeAttributes(doc, "img", "srcset");
+ grabberUtils.removeAttributes(doc, "img", "sizes");
+ grabberUtils.addAttributes(doc, "a", "target", "_blank");
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // complete relative source urls of images
+ Logger.debug("Grabber: complete urls");
+ grabberUtils.repairURL("//img", "src", doc, m_articleURL);
+ grabberUtils.repairURL("//a", "src", doc, m_articleURL);
+ grabberUtils.repairURL("//a", "href", doc, m_articleURL);
+ grabberUtils.repairURL("//object", "data", doc, m_articleURL);
+ grabberUtils.repairURL("//iframe", "src", doc, m_articleURL);
+
+ // strip elements using Readability.com and Instapaper.com ignore class names
// .entry-unrelated and .instapaper_ignore
// See https://www.readability.com/publishers/guidelines/#view-plainGuidelines
// and http://blog.instapaper.com/post/730281947
- Logger.debug("Grabber: strip instapaper and readability");
- grabberUtils.stripNode(doc,
- "//*[contains(concat(' ',normalize-space(@class),' '),' entry-unrelated ') or contains(concat(' ',normalize-space(@class),' '),' instapaper_ignore ')]");
-
-
- // strip elements that contain style="display: none;"
- Logger.debug("Grabber: strip invisible elements");
- grabberUtils.stripNode(doc, "//*[contains(@style,'display:none')]");
-
- // strip all scripts
- Logger.debug("Grabber: strip all scripts");
- grabberUtils.stripNode(doc, "//script");
-
- // strip <noscript>
- Logger.debug("Grabber: strip all scripts");
- grabberUtils.stripNode(doc, "//noscript");
-
- // strip all comments
- Logger.debug("Grabber: strip all comments");
- grabberUtils.stripNode(doc, "//comment()");
-
- // strip all empty url-tags <a/>
- Logger.debug("Grabber: strip all empty url-tags");
- grabberUtils.stripNode(doc, "//a[not(node())]");
-
- // strip all external css and fonts
- Logger.debug("Grabber: strip all external css and fonts");
- grabberUtils.stripNode(doc, "//*[@type='text/css']");
-
- // get the content of the article
- unowned Gee.ArrayList<string> bodyList = m_config.getXPathBody();
- if(bodyList.size != 0)
- {
- Logger.debug("Grabber: get body");
- foreach(string bodyXPath in bodyList)
- {
- if(grabberUtils.extractBody(doc, bodyXPath, m_root))
- m_foundSomething = true;
- else
- Logger.error(bodyXPath);
- }
-
- if(m_foundSomething)
- {
- Logger.debug("Grabber: body found");
- }
- else
- {
- Logger.debug("Grabber: no body found");
- return false;
- }
- }
- else
- {
- Logger.error("Grabber: config file has no rule for 'body'");
- }
-
- delete doc;
-
- m_firstPage = false;
-
- if(m_nexPageURL != null && !m_singlePage)
- {
- Logger.debug("Grabber: load next page");
- if(!m_nexPageURL.has_prefix("http"))
- {
- m_nexPageURL = grabberUtils.completeURL(m_nexPageURL, m_articleURL);
- }
- m_articleURL = m_nexPageURL;
- Logger.debug("Grabber: next page url: %s".printf(m_nexPageURL));
- download();
- parse();
- return true;
- }
-
- if(!Settings.tweaks().get_boolean("dont-download-images"))
- {
- if(m_articleID != null && m_feedID != null)
- grabberUtils.saveImages(m_doc, m_articleID, m_feedID);
- else
- grabberUtils.saveImages(m_doc, "", "");
- }
-
- m_doc->dump_memory_enc(out m_html);
- m_html = grabberUtils.postProcessing(ref m_html);
- return true;
- }
-
- private void prepArticle()
- {
- m_doc = new Html.Doc("1.0");
- m_ns = new Xml.Ns(null, "", "article");
- m_ns->type = Xml.ElementType.ELEMENT_NODE;
- m_root = new Xml.Node(m_ns, "body");
- m_doc->set_root_element(m_root);
- }
-
- public string getArticle()
- {
- return m_html;
- }
-
- public void print()
- {
- if(m_title != null)
- Logger.debug("Grabber: title: %s".printf(m_title));
-
- if(m_author != null)
- Logger.debug("Grabber: author: %s".printf(m_author));
-
- if(m_date != null)
- Logger.debug("Grabber: date: %s".printf(m_date));
- }
-
- public string? getAuthor()
- {
- return m_author;
- }
-
- public string? getTitle()
- {
- return m_title;
- }
+ Logger.debug("Grabber: strip instapaper and readability");
+ grabberUtils.stripNode(doc,
+ "//*[contains(concat(' ',normalize-space(@class),' '),' entry-unrelated ') or contains(concat(' ',normalize-space(@class),' '),' instapaper_ignore ')]");
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // strip elements that contain style="display: none;"
+ Logger.debug("Grabber: strip invisible elements");
+ grabberUtils.stripNode(doc, "//*[contains(@style,'display:none')]");
+
+ // strip all scripts
+ Logger.debug("Grabber: strip all scripts");
+ grabberUtils.stripNode(doc, "//script");
+
+ // strip <noscript>
+ Logger.debug("Grabber: strip all <noscript>");
+ grabberUtils.onlyRemoveNode(doc, "//noscript");
+
+ // strip all comments
+ Logger.debug("Grabber: strip all comments");
+ grabberUtils.stripNode(doc, "//comment()");
+
+ // strip all empty url-tags <a/>
+ Logger.debug("Grabber: strip all empty url-tags");
+ grabberUtils.stripNode(doc, "//a[not(node())]");
+
+ // strip all external css and fonts
+ Logger.debug("Grabber: strip all external css and fonts");
+ grabberUtils.stripNode(doc, "//*[@type='text/css']");
+
+ if(cancellable != null && cancellable.is_cancelled())
+ {
+ delete doc;
+ return false;
+ }
+
+ // get the content of the article
+ unowned Gee.List<string> bodyList = m_config.getXPathBody();
+ if(bodyList.size != 0)
+ {
+ Logger.debug("Grabber: get body");
+ foreach(string bodyXPath in bodyList)
+ {
+ if(grabberUtils.extractBody(doc, bodyXPath, m_root))
+ m_foundSomething = true;
+ else
+ Logger.info("Failed to find: " + bodyXPath);
+ }
+
+ if(m_foundSomething)
+ {
+ Logger.debug("Grabber: body found");
+ }
+ else
+ {
+ Logger.debug("Grabber: no body found");
+ return false;
+ }
+ }
+ else
+ {
+ Logger.error("Grabber: config file has no rule for 'body'");
+ }
+
+ delete doc;
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ m_firstPage = false;
+
+ if(m_nexPageURL != null && !m_singlePage)
+ {
+ Logger.debug("Grabber: load next page");
+ if(!m_nexPageURL.has_prefix("http"))
+ {
+ m_nexPageURL = grabberUtils.completeURL(m_nexPageURL, m_articleURL);
+ }
+ if(m_articleURL != m_nexPageURL)
+ {
+ m_articleURL = m_nexPageURL;
+ Logger.debug("Grabber: next page url: %s".printf(m_nexPageURL));
+ download();
+ parse(cancellable);
+ return true;
+ }
+ }
+
+ if(Settings.general().get_boolean("download-images"))
+ {
+ grabberUtils.saveImages(m_session, m_doc, m_article, cancellable);
+ }
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ m_doc->dump_memory_enc(out m_html);
+ m_html = grabberUtils.postProcessing(ref m_html);
+ return true;
+ }
+
+ private void prepArticle()
+ {
+ m_doc = new Html.Doc("1.0");
+ m_ns = new Xml.Ns(null, "", "article");
+ m_ns->type = Xml.ElementType.ELEMENT_NODE;
+ m_root = new Xml.Node(m_ns, "body");
+ m_doc->set_root_element(m_root);
+ }
+
+ public string getArticle()
+ {
+ return m_html;
+ }
+
+ public void print()
+ {
+ if(m_title != null)
+ Logger.debug("Grabber: title: %s".printf(m_title));
+
+ if(m_author != null)
+ Logger.debug("Grabber: author: %s".printf(m_author));
+
+ if(m_date != null)
+ Logger.debug("Grabber: date: %s".printf(m_date));
+ }
+
+ public string? getAuthor()
+ {
+ return m_author;
+ }
+
+ public string? getTitle()
+ {
+ return m_title;
+ }
}
diff --git a/src/ContentGrabber/grabberConfig.vala b/src/ContentGrabber/grabberConfig.vala
index 718ae7dc..12849d1f 100644
--- a/src/ContentGrabber/grabberConfig.vala
+++ b/src/ContentGrabber/grabberConfig.vala
@@ -15,303 +15,303 @@
public class FeedReader.GrabberConfig : GLib.Object {
- private Gee.ArrayList<string> m_xpath_title;
- private Gee.ArrayList<string> m_xpath_author;
- private Gee.ArrayList<string> m_xpath_date;
- private Gee.ArrayList<string> m_xpath_body;
- private Gee.ArrayList<string> m_xpath_strip;
- private Gee.ArrayList<string> m_xpath_stripIDorClass;
- private Gee.ArrayList<string> m_xpath_stripImgSrc;
- private bool m_tidy;
- private bool m_prune;
- private bool m_autodetectOnFailure;
- private string m_singlePageLink;
- private string m_nextPageLink;
- private Gee.ArrayList<StringPair> m_replace;
- private string m_testURL;
-
- public GrabberConfig(string filename)
- {
- m_xpath_title = new Gee.ArrayList<string>();
- m_xpath_author = new Gee.ArrayList<string>();
- m_xpath_date = new Gee.ArrayList<string>();
- m_xpath_body = new Gee.ArrayList<string>();
- m_xpath_strip = new Gee.ArrayList<string>();
- m_xpath_stripIDorClass = new Gee.ArrayList<string>();
- m_xpath_stripImgSrc = new Gee.ArrayList<string>();
- m_replace = new Gee.ArrayList<StringPair>();
-
- // init defaults:
- m_tidy = true;
- m_prune = true;
- m_autodetectOnFailure = true;
-
- var file = File.new_for_path(filename);
-
- if(!file.query_exists())
- {
- Logger.error("File '%s' doesn't exist.".printf(file.get_path()));
- return;
- }
-
- try
- {
- var dis = new DataInputStream(file.read ());
- string line;
-
- while((line = dis.read_line()) != null)
- {
- line = line.chug();
- if(!line.has_prefix("#") && line != "")
- {
- if(line.has_prefix("title:"))
- {
- splitValues(ref m_xpath_title, extractValue("title:", line));
- }
- else if(line.has_prefix("body:"))
- {
- splitValues(ref m_xpath_body, extractValue("body:", line));
- }
- else if(line.has_prefix("date:"))
- {
- splitValues(ref m_xpath_date, extractValue("date:", line));
- }
- else if(line.has_prefix("author:"))
- {
- splitValues(ref m_xpath_author, extractValue("author:", line));
- }
- else if(line.has_prefix("strip:"))
- {
- m_xpath_strip.add(extractValue("strip:", line));
- }
- else if(line.has_prefix("strip_id_or_class:"))
- {
- m_xpath_stripIDorClass.add(extractValue("strip_id_or_class:", line));
- }
- else if(line.has_prefix("strip_image_src:"))
- {
- m_xpath_stripImgSrc.add(extractValue("strip_image_src:", line));
- }
- else if(line.has_prefix("tidy:"))
- {
- if(extractValue("tidy:", line) == "no")
- m_tidy = false;
- }
- else if(line.has_prefix("prune:"))
- {
- if(extractValue("prune:", line) == "no")
- m_prune = false;
- }
- else if(line.has_prefix("autodetect_on_failure:"))
- {
- if(extractValue("autodetect_on_failure:", line) == "no")
- m_autodetectOnFailure = false;
- }
- else if(line.has_prefix("single_page_link:"))
- {
- m_singlePageLink = extractValue("single_page_link:", line);
- }
- else if(line.has_prefix("next_page_link:"))
- {
- m_nextPageLink = extractValue("next_page_link:", line);
- }
- else if(line.has_prefix("find_string:"))
- {
- string toReplace = extractValue("find_string:", line);
- line = dis.read_line();
- string replaceWith = extractValue("replace_string:", line);
- m_replace.add(new StringPair(toReplace, replaceWith));
- }
- else if(line.has_prefix("replace_string("))
- {
- string tmp = extractValue("replace_string(", line);
- var values = tmp.split("): ");
- m_replace.add(new StringPair(values[0], values[1]));
- }
- else if(line.has_prefix("test_url:"))
- {
- m_testURL = extractValue("test_url:", line);
- }
- }
- }
- }
- catch(Error e)
- {
- error("%s", e.message);
- }
- }
-
- private string extractValue(string identifier, string line)
- {
- string res = line.splice(0, identifier.length);
-
- int index = res.index_of("#");
- if(index != -1)
- {
- res = res.splice(index, res.length);
- }
-
- return res.chug().chomp();
- }
-
- private void splitValues(ref Gee.ArrayList<string> list, string line)
- {
- var array = line.split(" | ");
- foreach(string tmp in array)
- {
- list.add(tmp);
- }
- }
-
- public void print()
- {
- const string TAB = " ";
-
- if(m_xpath_title.size != 0)
- {
- Logger.debug("title:");
- foreach(string title in m_xpath_title)
- {
- Logger.debug(TAB + title);
- }
- }
-
- if(m_xpath_author.size != 0)
- {
- Logger.debug("author:");
- foreach(string author in m_xpath_author)
- {
- Logger.debug(TAB + author);
- }
- }
-
- if(m_xpath_date.size != 0)
- {
- Logger.debug("date:");
- foreach(string date in m_xpath_date)
- {
- Logger.debug(TAB + date);
- }
- }
-
- if(m_xpath_body.size != 0)
- {
- Logger.debug("body:");
- foreach(string body in m_xpath_body)
- {
- Logger.debug(TAB + body);
- }
- }
-
- if(m_xpath_strip.size != 0)
- {
- Logger.debug("strip:");
- foreach(string strip in m_xpath_strip)
- {
- Logger.debug(TAB + strip);
- }
- }
-
- if(m_xpath_stripIDorClass.size != 0)
- {
- Logger.debug("stripIDorClass:");
- foreach(string stripIDorClass in m_xpath_stripIDorClass)
- {
- Logger.debug(TAB + stripIDorClass);
- }
- }
-
- if(m_xpath_stripImgSrc.size != 0)
- {
- Logger.debug("stripImgSrc:");
- foreach(string stripImgSrc in m_xpath_stripImgSrc)
- {
- Logger.debug(TAB + stripImgSrc);
- }
- }
-
- if(m_tidy)
- Logger.debug("tidy: yes");
- else
- Logger.debug("tidy: no");
-
- if(m_prune)
- Logger.debug("prune: yes");
- else
- Logger.debug("prune: no");
-
- if(m_autodetectOnFailure)
- Logger.debug("autodetectOnFailure: yes");
- else
- Logger.debug("autodetectOnFailure: no");
-
- if(m_singlePageLink != null)
- Logger.debug("singlePageLink: " + m_singlePageLink);
-
- if(m_nextPageLink != null)
- Logger.debug("nextPageLink: " + m_nextPageLink);
-
- if(m_replace.size != 0)
- {
- Logger.debug("replace:");
- foreach(StringPair tmp in m_replace)
- {
- Logger.debug("replace %s with %s".printf(tmp.getString1(), tmp.getString2()));
- }
- }
-
- if(m_testURL != null)
- Logger.debug("testURL: " + m_testURL);
- }
-
-
- public string getXPathNextPageURL()
- {
- return m_nextPageLink;
- }
-
- public string getXPathSinglePageURL()
- {
- return m_singlePageLink;
- }
-
- public unowned Gee.ArrayList<string> getXPathTitle()
- {
- return m_xpath_title;
- }
-
- public unowned Gee.ArrayList<string> getXPathAuthor()
- {
- return m_xpath_author;
- }
-
- public unowned Gee.ArrayList<string> getXPathDate()
- {
- return m_xpath_date;
- }
-
- public unowned Gee.ArrayList<string> getXPathStrip()
- {
- return m_xpath_strip;
- }
-
- public unowned Gee.ArrayList<string> getXPathStripIDorClass()
- {
- return m_xpath_stripIDorClass;
- }
-
- public unowned Gee.ArrayList<string> getXPathStripImgSrc()
- {
- return m_xpath_stripImgSrc;
- }
-
- public unowned Gee.ArrayList<string> getXPathBody()
- {
- return m_xpath_body;
- }
-
- public unowned Gee.ArrayList<StringPair> getReplace()
- {
- return m_replace;
- }
+ private Gee.List<string> m_xpath_title;
+ private Gee.List<string> m_xpath_author;
+ private Gee.List<string> m_xpath_date;
+ private Gee.List<string> m_xpath_body;
+ private Gee.List<string> m_xpath_strip;
+ private Gee.List<string> m_xpath_stripIDorClass;
+ private Gee.List<string> m_xpath_stripImgSrc;
+ private bool m_tidy;
+ private bool m_prune;
+ private bool m_autodetectOnFailure;
+ private string m_singlePageLink;
+ private string m_nextPageLink;
+ private Gee.List<StringPair> m_replace;
+ private string m_testURL;
+
+ public GrabberConfig(string filename)
+ {
+ m_xpath_title = new Gee.ArrayList<string>();
+ m_xpath_author = new Gee.ArrayList<string>();
+ m_xpath_date = new Gee.ArrayList<string>();
+ m_xpath_body = new Gee.ArrayList<string>();
+ m_xpath_strip = new Gee.ArrayList<string>();
+ m_xpath_stripIDorClass = new Gee.ArrayList<string>();
+ m_xpath_stripImgSrc = new Gee.ArrayList<string>();
+ m_replace = new Gee.ArrayList<StringPair>();
+
+ // init defaults:
+ m_tidy = true;
+ m_prune = true;
+ m_autodetectOnFailure = true;
+
+ var file = File.new_for_path(filename);
+
+ if(!file.query_exists())
+ {
+ Logger.error("File '%s' doesn't exist.".printf(file.get_path()));
+ return;
+ }
+
+ try
+ {
+ var dis = new DataInputStream(file.read ());
+ string line;
+
+ while((line = dis.read_line()) != null)
+ {
+ line = line.chug();
+ if(!line.has_prefix("#") && line != "")
+ {
+ if(line.has_prefix("title:"))
+ {
+ splitValues(ref m_xpath_title, extractValue("title:", line));
+ }
+ else if(line.has_prefix("body:"))
+ {
+ splitValues(ref m_xpath_body, extractValue("body:", line));
+ }
+ else if(line.has_prefix("date:"))
+ {
+ splitValues(ref m_xpath_date, extractValue("date:", line));
+ }
+ else if(line.has_prefix("author:"))
+ {
+ splitValues(ref m_xpath_author, extractValue("author:", line));
+ }
+ else if(line.has_prefix("strip:"))
+ {
+ m_xpath_strip.add(extractValue("strip:", line));
+ }
+ else if(line.has_prefix("strip_id_or_class:"))
+ {
+ m_xpath_stripIDorClass.add(extractValue("strip_id_or_class:", line));
+ }
+ else if(line.has_prefix("strip_image_src:"))
+ {
+ m_xpath_stripImgSrc.add(extractValue("strip_image_src:", line));
+ }
+ else if(line.has_prefix("tidy:"))
+ {
+ if(extractValue("tidy:", line) == "no")
+ m_tidy = false;
+ }
+ else if(line.has_prefix("prune:"))
+ {
+ if(extractValue("prune:", line) == "no")
+ m_prune = false;
+ }
+ else if(line.has_prefix("autodetect_on_failure:"))
+ {
+ if(extractValue("autodetect_on_failure:", line) == "no")
+ m_autodetectOnFailure = false;
+ }
+ else if(line.has_prefix("single_page_link:"))
+ {
+ m_singlePageLink = extractValue("single_page_link:", line);
+ }
+ else if(line.has_prefix("next_page_link:"))
+ {
+ m_nextPageLink = extractValue("next_page_link:", line);
+ }
+ else if(line.has_prefix("find_string:"))
+ {
+ string toReplace = extractValue("find_string:", line);
+ line = dis.read_line();
+ string replaceWith = extractValue("replace_string:", line);
+ m_replace.add(new StringPair(toReplace, replaceWith));
+ }
+ else if(line.has_prefix("replace_string("))
+ {
+ string tmp = extractValue("replace_string(", line);
+ var values = tmp.split("): ");
+ m_replace.add(new StringPair(values[0], values[1]));
+ }
+ else if(line.has_prefix("test_url:"))
+ {
+ m_testURL = extractValue("test_url:", line);
+ }
+ }
+ }
+ }
+ catch(Error e)
+ {
+ error("%s", e.message);
+ }
+ }
+
+ private string extractValue(string identifier, string line)
+ {
+ string res = line.splice(0, identifier.length);
+
+ int index = res.index_of("#");
+ if(index != -1)
+ {
+ res = res.splice(index, res.length);
+ }
+
+ return res.chug().chomp();
+ }
+
+ private void splitValues(ref Gee.List<string> list, string line)
+ {
+ var array = line.split(" | ");
+ foreach(string tmp in array)
+ {
+ list.add(tmp);
+ }
+ }
+
+ public void print()
+ {
+ const string TAB = " ";
+
+ if(m_xpath_title.size != 0)
+ {
+ Logger.debug("title:");
+ foreach(string title in m_xpath_title)
+ {
+ Logger.debug(TAB + title);
+ }
+ }
+
+ if(m_xpath_author.size != 0)
+ {
+ Logger.debug("author:");
+ foreach(string author in m_xpath_author)
+ {
+ Logger.debug(TAB + author);
+ }
+ }
+
+ if(m_xpath_date.size != 0)
+ {
+ Logger.debug("date:");
+ foreach(string date in m_xpath_date)
+ {
+ Logger.debug(TAB + date);
+ }
+ }
+
+ if(m_xpath_body.size != 0)
+ {
+ Logger.debug("body:");
+ foreach(string body in m_xpath_body)
+ {
+ Logger.debug(TAB + body);
+ }
+ }
+
+ if(m_xpath_strip.size != 0)
+ {
+ Logger.debug("strip:");
+ foreach(string strip in m_xpath_strip)
+ {
+ Logger.debug(TAB + strip);
+ }
+ }
+
+ if(m_xpath_stripIDorClass.size != 0)
+ {
+ Logger.debug("stripIDorClass:");
+ foreach(string stripIDorClass in m_xpath_stripIDorClass)
+ {
+ Logger.debug(TAB + stripIDorClass);
+ }
+ }
+
+ if(m_xpath_stripImgSrc.size != 0)
+ {
+ Logger.debug("stripImgSrc:");
+ foreach(string stripImgSrc in m_xpath_stripImgSrc)
+ {
+ Logger.debug(TAB + stripImgSrc);
+ }
+ }
+
+ if(m_tidy)
+ Logger.debug("tidy: yes");
+ else
+ Logger.debug("tidy: no");
+
+ if(m_prune)
+ Logger.debug("prune: yes");
+ else
+ Logger.debug("prune: no");
+
+ if(m_autodetectOnFailure)
+ Logger.debug("autodetectOnFailure: yes");
+ else
+ Logger.debug("autodetectOnFailure: no");
+
+ if(m_singlePageLink != null)
+ Logger.debug("singlePageLink: " + m_singlePageLink);
+
+ if(m_nextPageLink != null)
+ Logger.debug("nextPageLink: " + m_nextPageLink);
+
+ if(m_replace.size != 0)
+ {
+ Logger.debug("replace:");
+ foreach(StringPair tmp in m_replace)
+ {
+ Logger.debug("replace %s with %s".printf(tmp.getString1(), tmp.getString2()));
+ }
+ }
+
+ if(m_testURL != null)
+ Logger.debug("testURL: " + m_testURL);
+ }
+
+
+ public string getXPathNextPageURL()
+ {
+ return m_nextPageLink;
+ }
+
+ public string getXPathSinglePageURL()
+ {
+ return m_singlePageLink;
+ }
+
+ public unowned Gee.List<string> getXPathTitle()
+ {
+ return m_xpath_title;
+ }
+
+ public unowned Gee.List<string> getXPathAuthor()
+ {
+ return m_xpath_author;
+ }
+
+ public unowned Gee.List<string> getXPathDate()
+ {
+ return m_xpath_date;
+ }
+
+ public unowned Gee.List<string> getXPathStrip()
+ {
+ return m_xpath_strip;
+ }
+
+ public unowned Gee.List<string> getXPathStripIDorClass()
+ {
+ return m_xpath_stripIDorClass;
+ }
+
+ public unowned Gee.List<string> getXPathStripImgSrc()
+ {
+ return m_xpath_stripImgSrc;
+ }
+
+ public unowned Gee.List<string> getXPathBody()
+ {
+ return m_xpath_body;
+ }
+
+ public unowned Gee.List<StringPair> getReplace()
+ {
+ return m_replace;
+ }
}
diff --git a/src/ContentGrabber/grabberUtils.vala b/src/ContentGrabber/grabberUtils.vala
index 4016705b..4ce7f2a8 100644
--- a/src/ContentGrabber/grabberUtils.vala
+++ b/src/ContentGrabber/grabberUtils.vala
@@ -15,531 +15,603 @@
public class FeedReader.grabberUtils : GLib.Object {
- public grabberUtils()
- {
-
- }
-
- public static bool extractBody(Html.Doc* doc, string xpath, Xml.Node* destination)
- {
- bool foundSomething = false;
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- var res = cntx.eval_expression(xpath);
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
-
- // remove property "style" of all tags
- node->has_prop("style")->remove();
-
- node->unlink();
- destination->add_child(node);
-
- if(!foundSomething)
- foundSomething = true;
- }
-
- delete res;
- return foundSomething;
- }
-
- public static string? getURL(Html.Doc* doc, string xpath)
- {
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression(xpath);
-
- if(res == null)
- {
- return null;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return null;
- }
-
- Xml.Node* node = res->nodesetval->item(0);
- string URL = node->get_prop("href");
-
- node->unlink();
- node->free_list();
- delete res;
- return URL;
- }
-
- public static string? getValue(Html.Doc* doc, string xpath, bool remove = false)
- {
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression(xpath);
-
- if(res == null)
- {
- return null;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return null;
- }
-
- Xml.Node* node = res->nodesetval->item(0);
- string result = cleanString(node->get_content());
-
- if(remove)
- {
- node->unlink();
- node->free_list();
- }
-
- delete res;
- return result;
- }
-
- public static bool repairURL(string xpath, string attr, Html.Doc* doc, string articleURL)
- {
- Logger.debug("GrabberUtils: repairURL xpath:\"%s\" attr:\"%s\"".printf(xpath, attr));
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression(xpath);
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- if(node->get_prop(attr) != null)
- node->set_prop(attr, completeURL(node->get_prop(attr), articleURL));
- }
-
- delete res;
- return true;
- }
-
- public static bool fixLazyImg(Html.Doc* doc, string className, string correctURL)
- {
- Logger.debug("grabberUtils: fixLazyImg");
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression("//img[contains(@class, '%s')]".printf(className));
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- node->set_prop("src", node->get_prop(correctURL));
- }
-
- delete res;
- return true;
- }
-
- public static bool fixIframeSize(Html.Doc* doc, string siteName)
- {
- Logger.debug("grabberUtils: fixIframeSize");
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression(@"//iframe[contains(@src, '$siteName')]");
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- Xml.Node* videoWrapper = new Xml.Node(null, "div");
- Xml.Node* parent = node->parent;
-
- videoWrapper->set_prop("class", "videoWrapper");
- node->set_prop("width", "100%");
- node->unset_prop("height");
-
- node->unlink();
- videoWrapper->add_child(node);
- parent->add_child(videoWrapper);
- }
-
- delete res;
- return true;
- }
-
- public static void stripNode(Html.Doc* doc, string xpath)
- {
- string ancestor = xpath;
- if(ancestor.has_prefix("//"))
- {
- ancestor = ancestor.substring(2);
- }
- string query = "%s[not(ancestor::%s)]".printf(xpath, ancestor);
-
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression(query);
-
- if(res != null
- && res->type == Xml.XPath.ObjectType.NODESET
- && res->nodesetval != null)
- {
- for(int i = 0; i < res->nodesetval->length(); ++i)
- {
- Xml.Node* node = res->nodesetval->item(i);
- if(node != null)
- {
- node->unlink();
- node->free_list();
- }
- }
- }
-
- delete res;
- }
-
- public static bool setAttributes(Html.Doc* doc, string attribute, string newValue)
- {
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression("//*[@%s]".printf(attribute));
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- node->set_prop(attribute, newValue);
- }
-
- delete res;
- return true;
- }
-
- public static bool removeAttributes(Html.Doc* doc, string? tag, string attribute)
- {
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res;
- if(tag == null)
- res = cntx.eval_expression("//*[@%s]".printf(attribute));
- else
- res = cntx.eval_expression("//%s[@%s]".printf(tag, attribute));
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- node->unset_prop(attribute);
- }
-
- delete res;
- return true;
- }
-
- public static bool addAttributes(Html.Doc* doc, string? tag, string attribute, string val)
- {
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res;
- if(tag == null)
- {
- Logger.debug(@"addAttributes: //* $attribute $val");
- res = cntx.eval_expression(@"//*");
- }
- else
- {
- Logger.debug(@"addAttributes: //$tag $attribute $val");
- res = cntx.eval_expression(@"//$tag");
- }
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- node->set_prop(attribute, val);
- }
-
- delete res;
- return true;
- }
-
- public static void stripIDorClass(Html.Doc* doc, string IDorClass)
- {
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- string xpath = "//*[contains(@class, '%s') or contains(@id, '%s')]".printf(IDorClass, IDorClass);
- Xml.XPath.Object* res = cntx.eval_expression(xpath);
-
- if(res != null
- && res->type == Xml.XPath.ObjectType.NODESET
- && res->nodesetval != null)
- {
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- if(node->get_prop("class") != null
- || node->get_prop("id") != null
- || node->get_prop("src") != null)
- {
- node->unlink();
- node->free_list();
- }
- }
- }
-
- delete res;
- }
-
- public static string cleanString(string? text)
- {
- if(text == null)
- return "";
-
- var tmpText = text.replace("\n", "");
- var array = tmpText.split(" ");
- tmpText = "";
-
- foreach(string word in array)
- {
- if(word.chug() != "")
- {
- tmpText += word + " ";
- }
- }
-
- return tmpText.chomp();
- }
-
- public static string completeURL(string incompleteURL, string articleURL)
- {
- int index = 0;
- if(articleURL.has_prefix("http"))
- {
- index = 8;
- }
- else
- index = articleURL.index_of_char('.', 0);
-
- string baseURL = "";
-
- if(incompleteURL.has_prefix("/") && !incompleteURL.has_prefix("//"))
- {
- index = articleURL.index_of_char('/', index);
- baseURL = articleURL.substring(0, index);
- if(baseURL.has_suffix("/"))
- {
- baseURL = baseURL.substring(0, baseURL.char_count()-1);
- }
- return baseURL + incompleteURL;
- }
- else if(incompleteURL.has_prefix("?"))
- {
- index = articleURL.index_of_char('?', index);
- baseURL = articleURL.substring(0, index);
- return baseURL + incompleteURL;
- }
- else if(!incompleteURL.has_prefix("http")
- && !incompleteURL.has_prefix("www")
- && !incompleteURL.has_prefix("//"))
- {
- index = articleURL.index_of_char('/', index);
- baseURL = articleURL.substring(0, index);
- if(!baseURL.has_suffix("/"))
- {
- baseURL = baseURL + "/";
- }
- return baseURL + incompleteURL;
- }
- else if(incompleteURL.has_prefix("//"))
- {
- return "http:" + incompleteURL;
- }
-
- return incompleteURL;
- }
-
- public static string buildHostName(string URL, bool cutSubdomain = true)
- {
- string hostname = URL;
- if(hostname.has_prefix("http://"))
- {
- hostname = hostname.substring(7);
- }
- else if(hostname.has_prefix("https://"))
- {
- hostname = hostname.substring(8);
- }
-
- if(hostname.has_prefix("www."))
- {
- hostname = hostname.substring(4);
- }
-
- int index = hostname.index_of_char('/');
- hostname = hostname.substring(0, index);
-
- if(cutSubdomain)
- {
- index = hostname.index_of_char('.');
- if(index != -1 && hostname.index_of_char('.', index+1) != -1)
- {
- hostname = hostname.substring(index);
- }
- }
-
- return hostname;
- }
-
-
- public static bool saveImages(Html.Doc* doc, string articleID, string feedID)
- {
- Logger.debug("GrabberUtils: save Images: %s, %s".printf(articleID, feedID));
- Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
- Xml.XPath.Object* res = cntx.eval_expression("//img");
-
- if(res == null)
- {
- return false;
- }
- else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
- {
- delete res;
- return false;
- }
-
- for(int i = 0; i < res->nodesetval->length(); i++)
- {
- Xml.Node* node = res->nodesetval->item(i);
- if(node->get_prop("src") != null)
- {
- if(
- ((node->get_prop("width") != null && int.parse(node->get_prop("width")) > 1)
- || (node->get_prop("width") == null))
- &&
- ((node->get_prop("height") != null && int.parse(node->get_prop("height")) > 1)
- || (node->get_prop("height") == null))
- )
- {
- string original = downloadImage(node->get_prop("src"), articleID, feedID, i+1);
- string? parentURL = checkParent(node);
- if(parentURL != null)
- {
- string parent = downloadImage(parentURL, articleID, feedID, i+1, true);
- node->set_prop("src", original);
- node->set_prop("FR_parent", parent);
- }
- else
- {
- string? resized = resizeImg(original);
- if(resized != null)
- {
- node->set_prop("src", resized);
- node->set_prop("FR_huge", original);
- }
- else
- node->set_prop("src", original);
- }
- }
- }
- }
-
- delete res;
- return true;
- }
-
-
- public static string downloadImage(string url, string articleID, string feedID, int nr, bool parent = false)
- {
- Logger.debug("GrabberUtils: download Image %s".printf(url));
- string fixedURL = url;
- string imgPath = "";
-
- if(fixedURL.has_prefix("//"))
- {
- fixedURL = "http:" + fixedURL;
- }
-
- if(articleID == "" && feedID == "")
- imgPath = GLib.Environment.get_user_data_dir() + "/debug-article/ArticleImages/";
- else
- imgPath = GLib.Environment.get_user_data_dir() + "/feedreader/data/images/%s/%s/".printf(feedID.replace("/", "_"), articleID);
-
- var path = GLib.File.new_for_path(imgPath);
- try{
+ public grabberUtils()
+ {
+
+ }
+
+ public static bool extractBody(Html.Doc* doc, string xpath, Xml.Node* destination)
+ {
+ bool foundSomething = false;
+ var cntx = new Xml.XPath.Context(doc);
+ var res = cntx.eval_expression(xpath);
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+
+ // remove property "style" of all tags
+ node->has_prop("style")->remove();
+
+ node->unlink();
+ destination->add_child(node);
+
+ if(!foundSomething)
+ foundSomething = true;
+ }
+
+ delete res;
+ return foundSomething;
+ }
+
+ public static string? getURL(Html.Doc* doc, string xpath)
+ {
+ var cntx = new Xml.XPath.Context(doc);
+ var res = cntx.eval_expression(xpath);
+
+ if(res == null)
+ {
+ return null;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return null;
+ }
+
+ Xml.Node* node = res->nodesetval->item(0);
+ string URL = node->get_prop("href");
+
+ node->unlink();
+ node->free_list();
+ delete res;
+ return URL;
+ }
+
+ public static string? getValue(Html.Doc* doc, string xpath, bool remove = false)
+ {
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression(xpath);
+
+ if(res == null)
+ {
+ return null;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return null;
+ }
+
+ Xml.Node* node = res->nodesetval->item(0);
+ string result = cleanString(node->get_content());
+
+ if(remove)
+ {
+ node->unlink();
+ node->free_list();
+ }
+
+ delete res;
+ return result;
+ }
+
+ public static bool repairURL(string xpath, string attr, Html.Doc* doc, string articleURL)
+ {
+ Logger.debug("GrabberUtils: repairURL xpath:\"%s\" attr:\"%s\"".printf(xpath, attr));
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression(xpath);
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ if(node->get_prop(attr) != null)
+ node->set_prop(attr, completeURL(node->get_prop(attr), articleURL));
+ }
+
+ delete res;
+ return true;
+ }
+
+ public static bool fixLazyImg(Html.Doc* doc, string className, string correctURL)
+ {
+ Logger.debug("grabberUtils: fixLazyImg");
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression("//img[contains(@class, '%s')]".printf(className));
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ node->set_prop("src", node->get_prop(correctURL));
+ }
+
+ delete res;
+ return true;
+ }
+
+ public static bool fixIframeSize(Html.Doc* doc, string siteName)
+ {
+ Logger.debug("grabberUtils: fixIframeSize");
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression(@"//iframe[contains(@src, '$siteName')]");
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ Xml.Node* videoWrapper = new Xml.Node(null, "div");
+ Xml.Node* parent = node->parent;
+
+ videoWrapper->set_prop("class", "videoWrapper");
+ node->set_prop("width", "100%");
+ node->unset_prop("height");
+
+ node->unlink();
+ videoWrapper->add_child(node);
+ parent->add_child(videoWrapper);
+ }
+
+ delete res;
+ return true;
+ }
+
+ public static void stripNode(Html.Doc* doc, string xpath)
+ {
+ string ancestor = xpath;
+ if(ancestor.has_prefix("//"))
+ {
+ ancestor = ancestor.substring(2);
+ }
+ string query = "%s[not(ancestor::%s)]".printf(xpath, ancestor);
+
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression(query);
+
+ if(res != null
+ && res->type == Xml.XPath.ObjectType.NODESET
+ && res->nodesetval != null)
+ {
+ for(int i = 0; i < res->nodesetval->length(); ++i)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ if(node == null)
+ continue;
+
+ node->unlink();
+ node->free_list();
+ }
+ }
+
+ delete res;
+ }
+
+ public static void onlyRemoveNode(Html.Doc* doc, string xpath)
+ {
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ bool changed = false;
+ do
+ {
+ changed = false;
+ Xml.XPath.Object* res = cntx.eval_expression(xpath);
+
+ if(res != null
+ && res->type == Xml.XPath.ObjectType.NODESET
+ && res->nodesetval != null)
+ {
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ if(node == null)
+ continue;
+
+ Xml.Node* parent = node->parent;
+ Xml.Node* children = node->children;
+
+ children->unlink();
+ parent->add_child(children);
+
+ node->unlink();
+ node->free_list();
+ changed = true;
+ break;
+ }
+ }
+
+ delete res;
+ }while(changed);
+ }
+
+ public static bool setAttributes(Html.Doc* doc, string attribute, string newValue)
+ {
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression("//*[@%s]".printf(attribute));
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ node->set_prop(attribute, newValue);
+ }
+
+ delete res;
+ return true;
+ }
+
+ public static bool removeAttributes(Html.Doc* doc, string? tag, string attribute)
+ {
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res;
+ if(tag == null)
+ res = cntx.eval_expression("//*[@%s]".printf(attribute));
+ else
+ res = cntx.eval_expression("//%s[@%s]".printf(tag, attribute));
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ node->unset_prop(attribute);
+ }
+
+ delete res;
+ return true;
+ }
+
+ public static bool addAttributes(Html.Doc* doc, string? tag, string attribute, string val)
+ {
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res;
+ if(tag == null)
+ {
+ Logger.debug(@"addAttributes: //* $attribute $val");
+ res = cntx.eval_expression(@"//*");
+ }
+ else
+ {
+ Logger.debug(@"addAttributes: //$tag $attribute $val");
+ res = cntx.eval_expression(@"//$tag");
+ }
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ node->set_prop(attribute, val);
+ }
+
+ delete res;
+ return true;
+ }
+
+ public static void stripIDorClass(Html.Doc* doc, string IDorClass)
+ {
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ string xpath = "//*[contains(@class, '%s') or contains(@id, '%s')]".printf(IDorClass, IDorClass);
+ Xml.XPath.Object* res = cntx.eval_expression(xpath);
+
+ if(res != null
+ && res->type == Xml.XPath.ObjectType.NODESET
+ && res->nodesetval != null)
+ {
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ Xml.Node* node = res->nodesetval->item(i);
+ if(node->get_prop("class") != null
+ || node->get_prop("id") != null
+ || node->get_prop("src") != null)
+ {
+ node->unlink();
+ node->free_list();
+ }
+ }
+ }
+
+ delete res;
+ }
+
+ public static string cleanString(string? text)
+ {
+ if(text == null)
+ return "";
+
+ var tmpText = text.replace("\n", "");
+ var array = tmpText.split(" ");
+ tmpText = "";
+
+ foreach(string word in array)
+ {
+ if(word.chug() != "")
+ {
+ tmpText += word + " ";
+ }
+ }
+
+ return tmpText.chomp();
+ }
+
+ public static string completeURL(string incompleteURL, string articleURL)
+ {
+ int index = 0;
+ if(articleURL.has_prefix("http"))
+ {
+ index = 8;
+ }
+ else
+ index = articleURL.index_of_char('.', 0);
+
+ string baseURL = "";
+
+ if(incompleteURL.has_prefix("/") && !incompleteURL.has_prefix("//"))
+ {
+ index = articleURL.index_of_char('/', index);
+ baseURL = articleURL.substring(0, index);
+ if(baseURL.has_suffix("/"))
+ {
+ baseURL = baseURL.substring(0, baseURL.char_count()-1);
+ }
+ return baseURL + incompleteURL;
+ }
+ else if(incompleteURL.has_prefix("?"))
+ {
+ index = articleURL.index_of_char('?', index);
+ baseURL = articleURL.substring(0, index);
+ return baseURL + incompleteURL;
+ }
+ else if(!incompleteURL.has_prefix("http")
+ && !incompleteURL.has_prefix("www")
+ && !incompleteURL.has_prefix("//"))
+ {
+ index = articleURL.index_of_char('/', index);
+ baseURL = articleURL.substring(0, index);
+ if(!baseURL.has_suffix("/"))
+ {
+ baseURL = baseURL + "/";
+ }
+ return baseURL + incompleteURL;
+ }
+ else if(incompleteURL.has_prefix("//"))
+ {
+ return "http:" + incompleteURL;
+ }
+
+ return incompleteURL;
+ }
+
+ public static string buildHostName(string URL, bool cutSubdomain = true)
+ {
+ string hostname = URL;
+ if(hostname.has_prefix("http://"))
+ {
+ hostname = hostname.substring(7);
+ }
+ else if(hostname.has_prefix("https://"))
+ {
+ hostname = hostname.substring(8);
+ }
+
+ if(hostname.has_prefix("www."))
+ {
+ hostname = hostname.substring(4);
+ }
+
+ int index = hostname.index_of_char('/');
+ hostname = hostname.substring(0, index);
+
+ if(cutSubdomain)
+ {
+ index = hostname.index_of_char('.');
+ if(index != -1 && hostname.index_of_char('.', index+1) != -1)
+ {
+ hostname = hostname.substring(index);
+ }
+ }
+
+ return hostname;
+ }
+
+
+ public static bool saveImages(Soup.Session session, Html.Doc* doc, Article article, GLib.Cancellable? cancellable = null)
+ {
+ Logger.debug("GrabberUtils: save Images: %s, %s".printf(article.getArticleID(), article.getFeedID()));
+ Xml.XPath.Context cntx = new Xml.XPath.Context(doc);
+ Xml.XPath.Object* res = cntx.eval_expression("//img");
+
+ if(res == null)
+ {
+ return false;
+ }
+ else if(res->type != Xml.XPath.ObjectType.NODESET || res->nodesetval == null)
+ {
+ delete res;
+ return false;
+ }
+
+ for(int i = 0; i < res->nodesetval->length(); i++)
+ {
+ if(cancellable != null && cancellable.is_cancelled())
+ break;
+
+ Xml.Node* node = res->nodesetval->item(i);
+ if(node->get_prop("src") != null)
+ {
+ if(
+ ((node->get_prop("width") != null && int.parse(node->get_prop("width")) > 1)
+ || (node->get_prop("width") == null))
+ &&
+ ((node->get_prop("height") != null && int.parse(node->get_prop("height")) > 1)
+ || (node->get_prop("height") == null))
+ )
+ {
+ string? original = downloadImage(session, node->get_prop("src"), article, i+1);
+
+ if(original == null)
+ continue;
+
+ string? parentURL = checkParent(session, node);
+ if(parentURL != null)
+ {
+ string parent = downloadImage(session, parentURL, article, i+1, true);
+
+ if(compareImageSize(parent, original) > 0)
+ {
+ // parent is bigger than orignal image
+ node->set_prop("src", original);
+ node->set_prop("FR_parent", parent);
+ }
+ else
+ {
+ // parent is no improvement over orignal image
+ // just delete parent again and only set orignal
+ GLib.FileUtils.remove(parent);
+ node->set_prop("src", original);
+ }
+ }
+ else
+ {
+ string? resized = resizeImg(original);
+ if(resized != null)
+ {
+ node->set_prop("src", resized);
+ node->set_prop("FR_huge", original);
+ }
+ else
+ node->set_prop("src", original);
+ }
+ }
+ }
+ }
+
+ delete res;
+ return true;
+ }
+
+
+ public static string? downloadImage(Soup.Session session, string? url, Article article, int nr, bool parent = false)
+ {
+ if(url == null || url.down().has_prefix("data:image"))
+ return null;
+
+ string fixedURL = url;
+ string imgPath = GLib.Environment.get_user_data_dir();
+
+ if(fixedURL.has_prefix("//"))
+ {
+ fixedURL = "http:" + fixedURL;
+ }
+
+ if(article.getArticleID() == "" && article.getFeedID() == "")
+ imgPath += "/debug-article/ArticleImages/";
+ else
+ imgPath += "/feedreader/data/images/%s/%s/".printf(article.getFeedFileName(), article.getArticleFileName());
+
+ var path = GLib.File.new_for_path(imgPath);
+ try
+ {
path.make_directory_with_parents();
}
- catch(GLib.Error e){
+ catch(GLib.Error e)
+ {
//Logger.debug(e.message);
}
- string localFilename = imgPath + nr.to_string();
+ string localFilename = imgPath + nr.to_string();
- if(parent)
- localFilename += "_parent";
+ if(parent)
+ localFilename += "_parent";
- if(!FileUtils.test(localFilename, GLib.FileTest.EXISTS))
+ if(!FileUtils.test(localFilename, GLib.FileTest.EXISTS))
{
- Soup.Message message_dlImg = new Soup.Message("GET", fixedURL);
+ var message_dlImg = new Soup.Message("GET", fixedURL);
+
+ if(message_dlImg == null)
+ {
+ Logger.warning(@"grabberUtils.downloadImage: could not create soup message $fixedURL");
+ return url;
+ }
if(Settings.tweaks().get_boolean("do-not-track"))
message_dlImg.request_headers.append("DNT", "1");
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.timeout = 8;
- session.ssl_strict = false;
var status = session.send_message(message_dlImg);
if(status == 200)
{
+ var params = new GLib.HashTable<string, string>(null, null);
+ string? contentType = message_dlImg.response_headers.get_content_type(out params);
+ if(contentType != null)
+ {
+ Logger.debug(@"Grabber: type $contentType");
+ if(contentType.has_prefix("image/svg"))
+ {
+ localFilename += ".svg";
+ }
+ }
+
try{
FileUtils.set_contents( localFilename,
(string)message_dlImg.response_body.flatten().data,
@@ -548,125 +620,182 @@ public class FeedReader.grabberUtils : GLib.Object {
catch(GLib.FileError e)
{
Logger.error("Error writing image: %s".printf(e.message));
- return url;
+ return url;
+ }
+ }
+ else
+ {
+ Logger.error("Error downloading image: %s".printf(fixedURL));
+ return url;
+ }
+ }
+
+ return localFilename.replace("?", "%3F");
+ }
+
+
+ // if image is >2000px then resize it to 1000px and add FR_huge attribute
+ // with url to original image
+ private static string? resizeImg(string path)
+ {
+ try
+ {
+ int? height = 0;
+ int? width = 0;
+ Gdk.PixbufFormat? format = Gdk.Pixbuf.get_file_info(path, out width, out height);
+
+ if(format == null || height == null || width == null)
+ return null;
+
+ if(width > 2000 || height > 2000)
+ {
+ int nHeight = 1000;
+ int nWidth = 1000;
+ if(width > height)
+ nHeight = -1;
+ else if(height > width)
+ nWidth = -1;
+
+ var img = new Gdk.Pixbuf.from_file_at_scale(path, nWidth, nHeight, true);
+ img.save(path + "_resized", "png");
+ return path + "_resized";
+ }
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Error resizing image: %s".printf(e.message));
+ return null;
+ }
+ return null;
+ }
+
+ // receives 2 paths to images stored on the hdd and compares the size
+ // 1: file1 > file2
+ // 0: file1 = file2
+ // -1: file1 < file2
+ private static int compareImageSize(string file1, string file2)
+ {
+ int? height1 = 0;
+ int? width1 = 0;
+ Gdk.Pixbuf.get_file_info(file1, out width1, out height1);
+
+ int? height2 = 0;
+ int? width2 = 0;
+ Gdk.Pixbuf.get_file_info(file2, out width2, out height2);
+
+ if(height1 == null
+ || width1 == null
+ || height2 == null
+ || width2 == null)
+ {
+ Logger.warning("Utils.compareImageSize: couldn't read image sizes");
+ return 0;
+ }
+
+ if(height1 == height2
+ && width1 == width2)
+ return 0;
+ else if(height1*width1 > height2*width2)
+ return 1;
+ else
+ return -1;
+ }
+
+ // check if the parent node is a link that points to a picture
+ // (most likely a bigger version of said picture)
+ private static string? checkParent(Soup.Session session, Xml.Node* node)
+ {
+ Logger.debug("Grabber: checkParent");
+ string smallImgURL = node->get_prop("src");
+ int64 origSize = 0;
+ int64 size = 0;
+ Xml.Node* parent = node->parent;
+ string name = parent->name;
+ Logger.debug(@"Grabber: parent $name");
+ if(name == "a")
+ {
+ string url = parent->get_prop("href");
+
+ if(url != "" && url != null)
+ {
+ if(url.has_prefix("//"))
+ url = "http:" + url;
+
+ var message = new Soup.Message("HEAD", url);
+ if(message == null)
+ return null;
+ session.send_message(message);
+ var params = new GLib.HashTable<string, string>(null, null);
+ string? contentType = message.response_headers.get_content_type(out params);
+ size = message.response_headers.get_content_length();
+ var message2 = new Soup.Message("HEAD", smallImgURL);
+ if(message2 == null)
+ return null;
+ session.send_message(message2);
+ origSize = message2.response_headers.get_content_length();
+ if(contentType != null)
+ {
+ Logger.debug(@"Grabber: type $contentType");
+ if(contentType.has_prefix("image/"))
+ {
+ if(size != 0 && origSize != 0)
+ {
+ if(size > origSize)
+ return url;
+ else
+ return null;
+ }
+ else
+ return url;
+ }
}
}
- else
- {
- Logger.error("Error downloading image: %s".printf(fixedURL));
- return url;
- }
- }
-
- return localFilename.replace("?", "%3F");
- }
-
-
- // if image is >2000px then resize it to 1000px and add FR_huge attribute
- // with url to original image
- private static string? resizeImg(string path)
- {
- try
- {
- int height = 0;
- int width = 0;
- Gdk.Pixbuf.get_file_info(path, out width, out height);
- if(width > 2000 || height > 2000)
- {
- int nHeight = 1000;
- int nWidth = 1000;
- if(width > height)
- nHeight = -1;
- else if(height > width)
- nWidth = -1;
-
- var img = new Gdk.Pixbuf.from_file_at_scale(path, nWidth, nHeight, true);
- img.save(path + "_resized", "png");
- return path + "_resized";
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("Error resizing image: %s".printf(e.message));
- return null;
- }
- return null;
- }
-
- // check if the parent node is a link that points to a picture
- // (most likely a bigger version of said picture)
- private static string? checkParent(Xml.Node* node)
- {
- Logger.debug("Grabber: checkParent");
- string smallImgURL = node->get_prop("src");
- int64 origSize = 0;
- int64 size = 0;
- Xml.Node* parent = node->parent;
- string name = parent->name;
- Logger.debug(@"Grabber: parent $name");
- if(name == "a")
- {
- string url = parent->get_prop("href");
-
- if(url != "" && url != null)
- {
- if(url.has_prefix("//"))
- url = "http:" + url;
-
- Logger.debug(@"Grabber: url $url");
- var session = new Soup.Session();
- var message = new Soup.Message("HEAD", url);
- session.send_message(message);
- var params = new GLib.HashTable<string, string>(null, null);
- string? contentType = message.response_headers.get_content_type(out params);
- size = message.response_headers.get_content_length();
- var message2 = new Soup.Message("HEAD", smallImgURL);
- session.send_message(message2);
- origSize = message2.response_headers.get_content_length();
- if(contentType != null)
- {
- Logger.debug(@"Grabber: type $contentType");
- if(contentType.has_prefix("image/"))
- {
- if(size != 0 && origSize != 0)
- {
- if(size > origSize)
- return url;
- else
- return null;
- }
- else
- return url;
- }
- }
- }
- }
-
- return null;
- }
-
- public static string postProcessing(ref string html)
- {
- Logger.debug("GrabberUtils: postProcessing");
- html = html.replace("<h3/>", "<h3></h3>");
-
- int pos1 = html.index_of("<iframe", 0);
- int pos2 = -1;
- while(pos1 != -1)
- {
- pos2 = html.index_of("/>", pos1);
- string broken_iframe = html.substring(pos1, pos2+2-pos1);
- Logger.debug("GrabberUtils: broken = %s".printf(broken_iframe));
- string fixed_iframe = broken_iframe.substring(0, broken_iframe.length-2) + "></iframe>";
- Logger.debug("GrabberUtils: fixed = %s".printf(fixed_iframe));
- html = html.replace(broken_iframe, fixed_iframe);
- int pos3 = html.index_of("<iframe", pos1+7);
- if(pos3 == pos1 || pos3 > html.length)
- break;
- else
- pos1 = pos3;
- }
- Logger.debug("GrabberUtils: postProcessing done");
- return html;
- }
+ }
+
+ return null;
+ }
+
+ public static string postProcessing(ref string html)
+ {
+ Logger.debug("GrabberUtils: postProcessing");
+ html = html.replace("<h3/>", "<h3></h3>");
+
+ int pos1 = html.index_of("<iframe", 0);
+ int pos2 = -1;
+ int pos3 = -1;
+ while(pos1 != -1)
+ {
+ pos2 = html.index_of("/>", pos1);
+ pos3 = html.index_of("</iframe>", pos1);
+
+ if(pos3 == -1 && pos2 == -1)
+ {
+ Logger.error("GrabberUtils.postProcessing: could not find closing for iframe tag");
+ pos1 = html.index_of("<iframe", pos1+7);
+ continue;
+ }
+
+ if((pos2 != -1 && pos3 != -1 && pos3 < pos2) || pos2 == -1)
+ {
+ Logger.debug("GrabberUtils.postProcessing: iframe not broken");
+ pos1 = html.index_of("<iframe", pos1+7);
+ continue;
+ }
+
+
+
+ string broken_iframe = html.substring(pos1, pos2+2-pos1);
+ Logger.debug("GrabberUtils: broken = %s".printf(broken_iframe));
+ string fixed_iframe = broken_iframe.substring(0, broken_iframe.length-2) + "></iframe>";
+ Logger.debug("GrabberUtils: fixed = %s".printf(fixed_iframe));
+ html = html.replace(broken_iframe, fixed_iframe);
+ pos3 = html.index_of("<iframe", pos1+7);
+ if(pos3 == pos1 || pos3 > html.length)
+ break;
+ else
+ pos1 = pos3;
+ }
+ Logger.debug("GrabberUtils: postProcessing done");
+ return html;
+ }
}
diff --git a/src/ContentGrabber/stringPair.vala b/src/ContentGrabber/stringPair.vala
index 4e09de8e..b4eb99cd 100644
--- a/src/ContentGrabber/stringPair.vala
+++ b/src/ContentGrabber/stringPair.vala
@@ -14,22 +14,22 @@
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
public class FeedReader.StringPair : GLib.Object {
- private string m_string1;
- private string m_string2;
+ private string m_string1;
+ private string m_string2;
- public StringPair(string string1, string string2)
- {
- m_string1 = string1;
- m_string2 = string2;
- }
+ public StringPair(string string1, string string2)
+ {
+ m_string1 = string1;
+ m_string2 = string2;
+ }
- public string getString1()
- {
- return m_string1;
- }
+ public string getString1()
+ {
+ return m_string1;
+ }
- public string getString2()
- {
- return m_string2;
- }
+ public string getString2()
+ {
+ return m_string2;
+ }
}
diff --git a/src/DBusConnection.vala b/src/DBusConnection.vala
deleted file mode 100644
index 98277a57..00000000
--- a/src/DBusConnection.vala
+++ /dev/null
@@ -1,233 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-namespace FeedReader {
-
- [DBus (name = "org.gnome.FeedReader.Daemon")]
- public interface FeedDaemon : Object {
-
- public abstract void scheduleSync(int time) throws IOError;
- public abstract void startSync() throws IOError;
- public abstract void startInitSync() throws IOError;
- public abstract void changeArticle(string articleID, ArticleStatus status) throws IOError;
- public abstract void markFeedAsRead(string feedID, bool isCat) throws IOError;
- public abstract void markAllItemsRead() throws IOError;
- public abstract void updateBadge() throws IOError;
-
-
- // OFFLINE / ONLINE
- public abstract LoginResponse login(string plugin) throws IOError;
- public abstract LoginResponse isLoggedIn() throws IOError;
- public abstract bool isOnline() throws IOError;
- public abstract bool checkOnlineAsync() throws IOError;
-
- // GENERAL
- public abstract void resetAccount() throws IOError;
- public abstract void resetDB() throws IOError;
- public abstract int getVersion() throws IOError;
- public abstract void quit() throws IOError;
-
- // BACKEND INFOS
- public abstract bool hideCagetoryWhenEmtpy(string catID) throws IOError;
- public abstract bool supportCategories() throws IOError;
- public abstract bool supportFeedManipulation() throws IOError;
- public abstract bool supportMultiLevelCategories() throws IOError;
- public abstract bool supportTags() throws IOError;
- public abstract bool useMaxArticles() throws IOError;
- public abstract string symbolicIcon() throws IOError;
- public abstract string accountName() throws IOError;
- public abstract string getServerURL() throws IOError;
- public abstract string uncategorizedID() throws IOError;
-
- // MANIPULATE TAGS
- public abstract string createTag(string caption) throws IOError;
- public abstract void tagArticle(string articleID, string tagID, bool add) throws IOError;
- public abstract void deleteTag(string tagID) throws IOError;
- public abstract void renameTag(string tagID, string newName) throws IOError;
- public abstract void updateTagColor(string tagID, int color) throws IOError;
-
- // MANIPULATE CATEGORIES
- public abstract string addCategory(string title, string parentID, bool createLocally) throws IOError;
- public abstract void removeCategory(string catID) throws IOError;
- public abstract void removeCategoryWithChildren(string catID) throws IOError;
- public abstract void moveCategory(string catID, string newParentID) throws IOError;
- public abstract void renameCategory(string catID, string newName) throws IOError;
-
- // MANIPULATE FEEDS
- public abstract void addFeed(string feedURL, string cat, bool isID, bool asynchron = true) throws IOError;
- public abstract void removeFeed(string feedID) throws IOError;
- public abstract void removeFeedOnlyFromCat(string m_feedID, string m_catID) throws IOError;
- public abstract void moveFeed(string feedID, string currentCatID, string? newCatID = null) throws IOError;
- public abstract void renameFeed(string feedID, string newName) throws IOError;
- public abstract void importOPML(string opml) throws IOError;
-
- // SIGNALS
- public signal void syncStarted();
- public signal void syncFinished();
- public signal void springCleanStarted();
- public signal void springCleanFinished();
- public signal void newFeedList();
- public signal void updateFeedList();
- public signal void updateArticleList();
- public signal void writeInterfaceState();
- public signal void showArticleListOverlay();
- public signal void setOffline();
- public signal void setOnline();
- public signal void feedAdded();
- public signal void opmlImported();
- public signal void updateSyncProgress(string progress);
- }
-
-
- public class DBusConnection : GLib.Object {
-
- private static FeedDaemon? m_connection = null;
-
- public static FeedDaemon get_default()
- {
- if(m_connection == null)
- setup();
-
- return m_connection;
- }
-
- private DBusConnection()
- {
-
- }
-
- private static void setup()
- {
- try
- {
- m_connection = Bus.get_proxy_sync(BusType.SESSION, "org.gnome.FeedReader.Daemon", "/org/gnome/FeedReader/Daemon");
- }
- catch(IOError e)
- {
- Logger.error("Failed to connect to daemon! " + e.message);
- }
-
- checkDaemonVersion();
- }
-
- public static void connectSignals()
- {
- if(m_connection == null)
- setup();
-
- m_connection.newFeedList.connect(() => {
- Logger.debug("DBusConnection: newFeedList");
- ColumnView.get_default().newFeedList();
- });
-
- m_connection.updateFeedList.connect(() => {
- Logger.debug("DBusConnection: updateFeedList");
- ColumnView.get_default().updateFeedList();
- });
-
- m_connection.updateArticleList.connect(() => {
- Logger.debug("DBusConnection: updateArticleList");
- ColumnView.get_default().updateArticleList();
- });
-
- m_connection.syncStarted.connect(() => {
- Logger.debug("DBusConnection: syncStarted");
- MainWindow.get_default().writeInterfaceState();
- ColumnView.get_default().getHeader().setRefreshButton(true);
- });
-
- m_connection.syncFinished.connect(() => {
- Logger.debug("DBusConnection: syncFinished");
- ColumnView.get_default().syncFinished();
- MainWindow.get_default().showContent(Gtk.StackTransitionType.SLIDE_LEFT, true);
- ColumnView.get_default().getHeader().setRefreshButton(false);
- });
-
- m_connection.springCleanStarted.connect(() => {
- Logger.debug("DBusConnection: springCleanStarted");
- MainWindow.get_default().showSpringClean();
- });
-
- m_connection.springCleanFinished.connect(() => {
- Logger.debug("DBusConnection: springCleanFinished");
- MainWindow.get_default().showContent();
- });
-
- m_connection.writeInterfaceState.connect(() => {
- Logger.debug("DBusConnection: writeInterfaceState");
- MainWindow.get_default().writeInterfaceState();
- });
-
- m_connection.showArticleListOverlay.connect(() => {
- Logger.debug("DBusConnection: showArticleListOverlay");
- ColumnView.get_default().showArticleListOverlay();
- });
-
- m_connection.setOffline.connect(() => {
- Logger.debug("DBusConnection: setOffline");
- if(FeedReaderApp.get_default().isOnline())
- {
- FeedReaderApp.get_default().setOnline(false);
- ColumnView.get_default().setOffline();
- }
- });
-
- m_connection.setOnline.connect(() => {
- Logger.debug("DBusConnection: setOnline");
- if(!FeedReaderApp.get_default().isOnline())
- {
- FeedReaderApp.get_default().setOnline(true);
- ColumnView.get_default().setOnline();
- }
- });
-
- m_connection.feedAdded.connect(() => {
- Logger.debug("DBusConnection: feedAdded");
- ColumnView.get_default().footerSetReady();
- });
-
- m_connection.opmlImported.connect(() => {
- Logger.debug("DBusConnection: opmlImported");
- ColumnView.get_default().footerSetReady();
- ColumnView.get_default().newFeedList();
- });
-
- m_connection.updateSyncProgress.connect((progress) => {
- Logger.debug("DBusConnection: updateSyncProgress");
- ColumnView.get_default().getHeader().updateSyncProgress(progress);
- });
- }
-
- private static void checkDaemonVersion()
- {
- try
- {
- if(m_connection.getVersion() < Constants.DBusAPIVersion)
- {
- m_connection.quit();
-
- // call random method on dbus-server of daemon to spawn the process again
- m_connection.isOnline();
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("checkDaemonVersion: %s".printf(e.message));
- }
-
- }
-
- }
-}
diff --git a/src/Daemon.vala b/src/Daemon.vala
deleted file mode 100644
index 840feacd..00000000
--- a/src/Daemon.vala
+++ /dev/null
@@ -1,941 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-extern void exit(int exit_code);
-
-namespace FeedReader {
-
- [DBus (name = "org.gnome.FeedReader.Daemon")]
- public class FeedDaemonServer : GLib.Object {
-
-#if WITH_LIBUNITY
- private Unity.LauncherEntry m_launcher;
-#endif
- private LoginResponse m_loggedin;
- private bool m_offline = true;
- private bool m_cacheSync = false;
- private uint m_timeout_source_id = 0;
- private delegate void asyncPayload();
-
- public signal void syncStarted();
- public signal void syncFinished();
- public signal void springCleanStarted();
- public signal void springCleanFinished();
- public signal void newFeedList();
- public signal void updateFeedList();
- public signal void updateArticleList();
- public signal void writeInterfaceState();
- public signal void showArticleListOverlay();
- public signal void setOffline();
- public signal void setOnline();
- public signal void feedAdded();
- public signal void opmlImported();
- public signal void updateSyncProgress(string progress);
-
- private static FeedDaemonServer? m_daemon;
-
- public static FeedDaemonServer get_default()
- {
- if(m_daemon == null)
- m_daemon = new FeedDaemonServer();
-
- return m_daemon;
- }
-
- private FeedDaemonServer()
- {
- Logger.debug("daemon: constructor");
- login(Settings.general().get_string("plugin"));
-
-#if WITH_LIBUNITY
- m_launcher = Unity.LauncherEntry.get_for_desktop_id("org.gnome.FeedReader.desktop");
- updateBadge();
-#endif
- scheduleSync(Settings.general().get_int("sync"));
- }
-
- public void startSync()
- {
- callAsync.begin(sync, (obj, res) => {
- callAsync.begin.end(res);
- });
- }
-
- public void startInitSync()
- {
- callAsync.begin(initSync, (obj, res) => {
- callAsync.begin.end(res);
- });
- }
-
- public int getVersion()
- {
- return Constants.DBusAPIVersion;
- }
-
-
- public bool supportTags()
- {
- return FeedServer.get_default().supportTags();
- }
-
- public bool supportCategories()
- {
- return FeedServer.get_default().supportCategories();
- }
-
- public bool supportFeedManipulation()
- {
- return FeedServer.get_default().supportFeedManipulation();
- }
-
- public bool supportMultiLevelCategories()
- {
- return FeedServer.get_default().supportMultiLevelCategories();
- }
-
- public string symbolicIcon()
- {
- Logger.debug("daemon: symbolicIcon");
- return FeedServer.get_default().symbolicIcon();
- }
-
- public string accountName()
- {
- return FeedServer.get_default().accountName();
- }
-
- public string getServerURL()
- {
- return FeedServer.get_default().getServerURL();
- }
-
- public string uncategorizedID()
- {
- return FeedServer.get_default().uncategorizedID();
- }
-
- public bool hideCagetoryWhenEmtpy(string catID)
- {
- return FeedServer.get_default().hideCagetoryWhenEmtpy(catID);
- }
-
- public bool useMaxArticles()
- {
- return FeedServer.get_default().useMaxArticles();
- }
-
- public void scheduleSync(int time)
- {
- if (m_timeout_source_id > 0)
- {
- GLib.Source.remove(m_timeout_source_id);
- m_timeout_source_id = 0;
- }
-
- m_timeout_source_id = GLib.Timeout.add_seconds_full(GLib.Priority.DEFAULT, time*60, () => {
- if(!Settings.state().get_boolean("currently-updating")
- && FeedServer.get_default().pluginLoaded())
- {
- Logger.debug("daemon: Timeout!");
- startSync();
- }
- return true;
- });
- }
-
- private void sync()
- {
- if(Utils.springCleaningNecessary())
- {
- Logger.info("daemon: spring cleaning");
- Settings.state().set_boolean("spring-cleaning", true);
- springCleanStarted();
- dbDaemon.get_default().springCleaning();
- Settings.state().set_boolean("spring-cleaning", false);
- springCleanFinished();
- }
-
- syncStarted();
-
-
- if(!checkOnline())
- {
- syncFinished();
- return;
- }
-
- if(m_loggedin != LoginResponse.SUCCESS)
- {
- login(Settings.general().get_string("plugin"));
- if(m_loggedin != LoginResponse.SUCCESS)
- {
- setOffline();
- syncFinished();
- return;
- }
- }
-
- if(m_loggedin == LoginResponse.SUCCESS && Settings.state().get_boolean("currently-updating") == false)
- {
- Logger.info("daemon: sync started");
- m_cacheSync = true;
- Settings.state().set_boolean("currently-updating", true);
- FeedServer.get_default().syncContent();
- updateBadge();
- m_cacheSync = false;
- FeedServer.get_default().grabContent();
- Settings.state().set_boolean("currently-updating", false);
- Settings.state().set_string("sync-status", "");
- syncFinished();
- Logger.info("daemon: sync finished");
- }
- else
- {
- Logger.debug("Cant sync because login failed or sync already ongoing");
- }
- }
-
- public bool checkOnline()
- {
- Logger.debug("Daemon: checkOnline");
- if(!FeedServer.get_default().serverAvailable())
- {
- m_loggedin = LoginResponse.UNKNOWN_ERROR;
- setOffline();
- return false;
- }
-
- if(m_loggedin != LoginResponse.SUCCESS)
- {
- FeedServer.get_default().logout();
- login(Settings.general().get_string("plugin"));
- }
-
- setOnline();
- return true;
- }
-
-
- public async bool checkOnlineAsync()
- {
- Logger.debug("Daemon: checkOnlineAsync");
- bool online = false;
- SourceFunc callback = checkOnlineAsync.callback;
- ThreadFunc<void*> run = () => {
- Idle.add((owned) callback);
- online = checkOnline();
- return null;
- };
-
- new GLib.Thread<void*>("checkOnlineAsync", run);
- yield;
- return online;
- }
-
-
- private void initSync()
- {
- if(!FeedServer.get_default().doInitSync())
- return;
-
- if(m_loggedin != LoginResponse.SUCCESS)
- {
- login(Settings.general().get_string("plugin"));
- }
-
- if(m_loggedin == LoginResponse.SUCCESS && Settings.state().get_boolean("currently-updating") == false)
- {
- syncStarted();
- Logger.info("daemon: initSync started");
- Settings.state().set_boolean("currently-updating", true);
- FeedServer.get_default().InitSyncContent();
- updateBadge();
- FeedServer.get_default().grabContent();
- Settings.state().set_boolean("currently-updating", false);
- Settings.state().set_string("sync-status", "");
- syncFinished();
- Logger.info("daemon: initSync finished");
- }
- else
- Logger.debug("Cant sync because login failed or sync already ongoing");
- }
-
- public LoginResponse login(string plugName)
- {
- Logger.debug("daemon: new FeedServer and login");
-
- FeedServer.get_default().unloadPlugin();
- FeedServer.get_default().loadPlugin(plugName);
-
- if(!FeedServer.get_default().pluginLoaded())
- {
- Logger.error(@"daemon: plugin '$plugName' couldn't be loaded by feedserver");
- m_loggedin = LoginResponse.NO_BACKEND;
- return m_loggedin;
- }
-
- this.setOffline.connect(() => {
- m_offline = true;
- });
- this.setOnline.connect(() => {
- m_offline = false;
- if(dbDaemon.get_default().isTableEmpty("CachedActions"))
- {
- CachedActionManager.get_default().executeActions();
- dbDaemon.get_default().resetCachedActions();
- }
- });
-
- FeedServer.get_default().newFeedList.connect(() => {
- newFeedList();
- });
-
- FeedServer.get_default().updateFeedList.connect(() => {
- updateFeedList();
- });
-
- FeedServer.get_default().updateArticleList.connect(() => {
- updateArticleList();
- });
-
- FeedServer.get_default().writeInterfaceState.connect(() => {
- writeInterfaceState();
- });
-
- FeedServer.get_default().showArticleListOverlay.connect(() => {
- showArticleListOverlay();
- });
-
- FeedServer.get_default().updateSyncProgress.connect((progress) => {
- updateSyncProgress(progress);
- });
-
- m_loggedin = FeedServer.get_default().login();
-
- if(m_loggedin == LoginResponse.SUCCESS)
- {
- Settings.general().set_string("plugin", plugName);
- setOnline();
- }
- else if(m_loggedin == LoginResponse.NO_BACKEND)
- {
- // do nothing
- }
- else
- {
- setOffline();
- }
-
-
- Logger.debug("daemon: login status = " + m_loggedin.to_string());
- return m_loggedin;
- }
-
- public LoginResponse isLoggedIn()
- {
- return m_loggedin;
- }
-
- public bool isOnline()
- {
- if(m_loggedin != LoginResponse.SUCCESS)
- {
- return false;
- }
-
- return true;
- }
-
- public void changeArticle(string articleID, ArticleStatus status)
- {
- Logger.debug("Daemon: changeArticle %s %s".printf(articleID, status.to_string()));
- if(status == ArticleStatus.READ || status == ArticleStatus.UNREAD)
- {
- bool increase = true;
- if(status == ArticleStatus.READ)
- increase = false;
-
- if(m_offline)
- {
- var idArray = articleID.split(",");
- foreach(string id in idArray)
- {
- CachedActionManager.get_default().markArticleRead(id, status);
- }
- }
- else
- {
- if(m_cacheSync)
- {
- var idArray = articleID.split(",");
- foreach(string id in idArray)
- {
- ActionCache.get_default().markArticleRead(id, status);
- }
- }
-
- asyncPayload pl = () => { FeedServer.get_default().setArticleIsRead(articleID, status); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
- }
-
- asyncPayload pl = () => { dbDaemon.get_default().update_article(articleID, "unread", status); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- updateFeedList();
- updateBadge();
- });
- }
- else if(status == ArticleStatus.MARKED || status == ArticleStatus.UNMARKED)
- {
- if(m_offline)
- CachedActionManager.get_default().markArticleStarred(articleID, status);
- else
- {
- if(m_cacheSync)
- ActionCache.get_default().markArticleStarred(articleID, status);
- asyncPayload pl = () => { FeedServer.get_default().setArticleIsMarked(articleID, status); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
- }
-
-
- asyncPayload pl = () => { dbDaemon.get_default().update_article(articleID, "marked", status); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- updateFeedList();
- });
- }
- }
-
-
- public string createTag(string caption)
- {
- if(m_offline)
- return ":(";
-
- string tagID = FeedServer.get_default().createTag(caption);
- var Tag = new tag(tagID, caption, 0);
- var taglist = new Gee.LinkedList<tag>();
- taglist.add(Tag);
- dbDaemon.get_default().write_tags(taglist);
- newFeedList();
-
- return tagID;
- }
-
- public void tagArticle(string articleID, string tagID, bool add)
- {
- if(m_offline)
- return;
-
- string tags = dbDaemon.get_default().read_article_tags(articleID);
-
- if(add)
- {
- asyncPayload pl = () => { FeedServer.get_default().tagArticle(articleID, tagID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- if(!tags.contains(tagID))
- {
- tags = tags + tagID + ",";
- }
- }
- else
- {
- Logger.debug("daemon: remove tag: " + tagID + " from article: " + articleID);
-
- asyncPayload pl = () => { FeedServer.get_default().removeArticleTag(articleID, tagID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- Logger.debug("daemon: tagstring = " + tags);
-
- if(tags == tagID)
- {
- tags = "";
- }
- else if(tags.contains(tagID))
- {
- int start = tags.index_of(tagID);
- int end = start + tagID.length + 1;
-
- string part1 = tags.substring(0, start);
- string part2 = tags.substring(end);
-
- if(part2.has_prefix(","))
- {
- part2 = part2.substring(1);
- Logger.error("daemon: tagArticle");
- }
-
- tags = part1 + part2;
-
- if(!dbDaemon.get_default().tag_still_used(tagID))
- {
- Logger.debug("daemon: remove tag completely");
- asyncPayload pl2 = () => { FeedServer.get_default().deleteTag(tagID); };
- callAsync.begin((owned)pl2, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl3 = () => { dbDaemon.get_default().dropTag(tagID); };
- callAsync.begin((owned)pl3, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
- }
- }
-
- Logger.debug("daemon: set tag string: " + tags);
- dbDaemon.get_default().set_article_tags(articleID, tags);
- }
-
- public void renameTag(string tagID, string newName)
- {
- if(m_offline)
- return;
-
- asyncPayload pl = () => { FeedServer.get_default().renameTag(tagID, newName); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().rename_tag(tagID, newName); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void deleteTag(string tagID)
- {
- if(m_offline)
- return;
-
- asyncPayload pl = () => { FeedServer.get_default().deleteTag(tagID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().dropTag(tagID); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void updateTagColor(string tagID, int color)
- {
- dbDaemon.get_default().update_tag_color(tagID, color);
- }
-
- public void resetDB()
- {
- dbDaemon.get_default().resetDB();
- dbDaemon.get_default().init();
- }
-
- public void resetAccount()
- {
- FeedServer.get_default().resetAccount();
- }
-
- public void markFeedAsRead(string feedID, bool isCat)
- {
- if(isCat)
- {
- if(m_offline)
- {
- CachedActionManager.get_default().markCategoryRead(feedID);
- }
- else
- {
- if(m_cacheSync)
- ActionCache.get_default().markCategoryRead(feedID);
- asyncPayload pl = () => { FeedServer.get_default().setCategorieRead(feedID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
- }
-
- asyncPayload pl = () => { dbDaemon.get_default().markCategorieRead(feedID); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- updateBadge();
- newFeedList();
- updateArticleList();
- });
- }
- else
- {
- if(m_offline)
- {
- CachedActionManager.get_default().markFeedRead(feedID);
- }
- else
- {
- if(m_cacheSync)
- ActionCache.get_default().markFeedRead(feedID);
- asyncPayload pl = () => { FeedServer.get_default().setFeedRead(feedID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
- }
-
- asyncPayload pl = () => { dbDaemon.get_default().markFeedRead(feedID); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- updateBadge();
- newFeedList();
- updateArticleList();
- });
- }
- }
-
- public void markAllItemsRead()
- {
- if(m_offline)
- {
- CachedActionManager.get_default().markAllRead();
- }
- else
- {
- if(m_cacheSync)
- ActionCache.get_default().markAllRead();
- asyncPayload pl = () => { FeedServer.get_default().markAllItemsRead(); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
- }
-
- asyncPayload pl = () => { dbDaemon.get_default().markAllRead(); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- updateBadge();
- newFeedList();
- updateArticleList();
- });
- }
-
- public void removeCategory(string catID)
- {
- asyncPayload pl = () => { FeedServer.get_default().deleteCategory(catID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().delete_category(catID); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void moveCategory(string catID, string newParentID)
- {
- asyncPayload pl = () => { FeedServer.get_default().moveCategory(catID, newParentID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().move_category(catID, newParentID); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public string addCategory(string title, string? parentID = null, bool createLocally = false)
- {
- Logger.debug("daemon: addCategory " + title);
- string catID = FeedServer.get_default().createCategory(title, parentID);
-
- if(createLocally)
- {
- string? parent = parentID;
- int level = 1;
- if(parentID == null || parentID == "")
- {
- parent = CategoryID.MASTER.to_string();
- }
- else
- {
- var parentCat = dbDaemon.get_default().read_category(parentID);
- level = parentCat.getLevel()+1;
- }
-
- var cat = new category(catID, title, 0, 99, parent, level);
- var list = new Gee.LinkedList<category>();
- list.add(cat);
- dbDaemon.get_default().write_categories(list);
- }
-
- return catID;
- }
-
- public void removeCategoryWithChildren(string catID)
- {
- var feeds = dbDaemon.get_default().read_feeds();
- deleteFeedsofCat(catID, feeds);
-
- var cats = dbDaemon.get_default().read_categories(feeds);
- foreach(var cat in cats)
- {
- if(cat.getParent() == catID)
- {
- removeCategoryWithChildren(catID);
- }
- }
- }
-
- private void deleteFeedsofCat(string catID, Gee.ArrayList<feed> feeds)
- {
- foreach(feed Feed in feeds)
- {
- if(Feed.hasCat(catID))
- {
- removeFeed(Feed.getFeedID());
- }
- }
- }
-
- public void renameCategory(string catID, string newName)
- {
- asyncPayload pl = () => { FeedServer.get_default().renameCategory(catID, newName); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().rename_category(catID, newName); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void renameFeed(string feedID, string newName)
- {
- asyncPayload pl = () => { FeedServer.get_default().renameFeed(feedID, newName); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().rename_feed(feedID, newName); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void moveFeed(string feedID, string currentCatID, string? newCatID = null)
- {
- asyncPayload pl = () => { FeedServer.get_default().moveFeed(feedID, newCatID, currentCatID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().move_feed(feedID, currentCatID, newCatID); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void addFeed(string feedURL, string cat, bool isID, bool asynchron = true)
- {
- string catID = null;
- string newCatName = null;
-
- if(cat != "")
- {
- if(isID)
- catID = cat;
- else
- newCatName = cat;
- }
-
- if(asynchron)
- {
- asyncPayload pl = () => { FeedServer.get_default().addFeed(feedURL, catID, newCatName); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- feedAdded();
- startSync();
- });
- }
- else
- {
- FeedServer.get_default().addFeed(feedURL, catID, newCatName);
- }
- }
-
- public void removeFeed(string feedID)
- {
- asyncPayload pl = () => { FeedServer.get_default().removeFeed(feedID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().delete_feed(feedID); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- updateArticleList();
- });
- }
-
- public void removeFeedOnlyFromCat(string feedID, string catID)
- {
- asyncPayload pl = () => { FeedServer.get_default().removeCatFromFeed(feedID, catID); };
- callAsync.begin((owned)pl, (obj, res) => { callAsync.end(res); });
-
- asyncPayload pl2 = () => { dbDaemon.get_default().removeCatFromFeed(feedID, catID); };
- callAsync.begin((owned)pl2, (obj, res) => {
- callAsync.end(res);
- newFeedList();
- });
- }
-
- public void importOPML(string opml)
- {
- asyncPayload pl = () => { FeedServer.get_default().importOPML(opml); };
- callAsync.begin((owned)pl, (obj, res) => {
- callAsync.end(res);
- opmlImported();
- });
- }
-
- public void updateBadge()
- {
-#if WITH_LIBUNITY
- if(!Settings.state().get_boolean("spring-cleaning")
- && Settings.tweaks().get_boolean("show-badge"))
- {
- var count = dbDaemon.get_default().get_unread_total();
- Logger.debug("daemon: update badge count %u".printf(count));
- m_launcher.count = count;
- if(count > 0)
- m_launcher.count_visible = true;
- else
- m_launcher.count_visible = false;
- }
-#endif
- }
-
- public void quit()
- {
- Logger.debug("Quit!");
- GLib.Timeout.add_seconds_full(GLib.Priority.DEFAULT, 1, () => {
- exit(-1);
- return false;
- });
- }
-
- private async void callAsync(owned asyncPayload func)
- {
- SourceFunc callback = callAsync.callback;
- new GLib.Thread<void*>(null, () => {
- func();
- Idle.add((owned) callback);
- return null;
- });
- yield;
- }
-
- }
-
- [DBus (name = "org.gnome.FeedReader.DaemonError")]
- public errordomain FeedError
- {
- SOME_ERROR
- }
-
- void on_bus_aquired(DBusConnection conn)
- {
- try
- {
- conn.register_object("/org/gnome/FeedReader/Daemon", FeedDaemonServer.get_default());
- }
- catch (IOError e)
- {
- Logger.warning("daemon: Could not register service. Will shut down!");
- Logger.warning(e.message);
- exit(-1);
- }
- Logger.debug("daemon: bus aquired");
- }
-
- private const GLib.OptionEntry[] options = {
- { "version", 0, 0, OptionArg.NONE, ref version, "FeedReader version number", null },
- { "grabArticle", 0, 0, OptionArg.STRING, ref grabArticle, "use the ContentGrabber to grab the given URL", "URL" },
- { "grabImages", 0, 0, OptionArg.STRING, ref grabImages, "download all images of the html-document", "PATH" },
- { "url", 0, 0, OptionArg.STRING, ref articleUrl, "url of the article needed to do grabImages", "URL" },
- { "unreadCount", 0, 0, OptionArg.NONE, ref unreadCount, "current count of unread articles in the database", null },
- { null }
- };
-
- private static bool version = false;
- private static bool unreadCount = false;
- private static string? grabArticle = null;
- private static string? grabImages = null;
- private static string? articleUrl = null;
-
-
- int main(string[] args)
- {
- try
- {
- var opt_context = new GLib.OptionContext();
- opt_context.set_help_enabled(true);
- opt_context.add_main_entries(options, null);
- opt_context.parse(ref args);
- }
- catch(OptionError e)
- {
- print(e.message + "\n");
- return 0;
- }
-
- if(version)
- {
- stdout.printf("Version: %s\n", AboutInfo.version);
- return 0;
- }
-
- if(unreadCount)
- {
- var old_stdout =(owned)stdout;
- stdout = FileStream.open("/dev/null", "w");
- Logger.init("daemon");
- stdout =(owned)old_stdout;
- stdout.printf("%u\n", dbDaemon.get_default().get_unread_total());
- return 0;
- }
-
- if(grabImages != null && articleUrl != null)
- {
- Logger.init("daemon");
- FeedServer.grabImages(grabImages, articleUrl);
- return 0;
- }
-
- if(grabArticle != null)
- {
- Logger.init("daemon");
- FeedServer.grabArticle(grabArticle);
- return 0;
- }
-
- Logger.init("daemon");
- Notification.init();
- Utils.copyAutostart();
-
- Logger.info("FeedReader Daemon " + AboutInfo.version);
-
- if(dbDaemon.get_default().uninitialized())
- dbDaemon.get_default().init();
-
- Bus.own_name (BusType.SESSION, "org.gnome.FeedReader.Daemon", BusNameOwnerFlags.NONE,
- on_bus_aquired,
- () => {
- Settings.state().set_boolean("currently-updating", false);
- Settings.state().set_boolean("spring-cleaning", false);
- },
- () => {
- Logger.warning("daemon: Could not aquire name (already running). Will shut down!");
- exit(-1);
- }
- );
- var mainloop = new GLib.MainLoop();
- mainloop.run();
- return 0;
- }
-}
diff --git a/src/DataBaseReadOnly.vala b/src/DataBaseReadOnly.vala
new file mode 100644
index 00000000..6d48fd05
--- /dev/null
+++ b/src/DataBaseReadOnly.vala
@@ -0,0 +1,1054 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.DataBaseReadOnly : GLib.Object {
+
+ protected SQLite m_db;
+
+ public DataBaseReadOnly(string db_file = "feedreader-%01i.db".printf(Constants.DB_SCHEMA_VERSION))
+ {
+ Sqlite.config(Sqlite.Config.LOG, errorLogCallback);
+ string db_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/" + db_file;
+
+ Logger.debug(@"Opening Database: $db_path");
+ m_db = new SQLite(db_path);
+ }
+
+ private void errorLogCallback(int code, string msg)
+ {
+ Logger.error(@"dbErrorLog: $code: $msg");
+ }
+
+ public void init()
+ {
+ Logger.debug("init database");
+ m_db.simple_query("PRAGMA journal_mode = WAL");
+ m_db.simple_query("PRAGMA page_size = 4096");
+ m_db.simple_query("PRAGMA foreign_keys = ON");
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."feeds"
+ (
+ "feed_id" TEXT PRIMARY KEY NOT NULL UNIQUE,
+ "name" TEXT NOT NULL,
+ "url" TEXT NOT NULL,
+ "category_id" TEXT,
+ "subscribed" INTEGER DEFAULT 1,
+ "xmlURL" TEXT,
+ "iconURL" TEXT
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."categories"
+ (
+ "categorieID" TEXT PRIMARY KEY NOT NULL UNIQUE,
+ "title" TEXT NOT NULL,
+ "orderID" INTEGER,
+ "exists" INTEGER,
+ "Parent" TEXT,
+ "Level" INTEGER
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."articles"
+ (
+ "articleID" TEXT PRIMARY KEY NOT NULL UNIQUE,
+ "feedID" TEXT NOT NULL,
+ "title" TEXT NOT NULL,
+ "author" TEXT,
+ "url" TEXT NOT NULL,
+ "html" TEXT NOT NULL,
+ "preview" TEXT NOT NULL,
+ "unread" INTEGER NOT NULL,
+ "marked" INTEGER NOT NULL,
+ "date" INTEGER NOT NULL,
+ "guidHash" TEXT,
+ "lastModified" INTEGER,
+ "contentFetched" INTEGER NOT NULL
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."tags"
+ (
+ "tagID" TEXT PRIMARY KEY NOT NULL UNIQUE,
+ "title" TEXT NOT NULL,
+ "exists" INTEGER,
+ "color" INTEGER
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."CachedActions"
+ (
+ "action" INTEGER NOT NULL,
+ "id" TEXT NOT NULL,
+ "argument" INTEGER
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."Enclosures"
+ (
+ "articleID" TEXT NOT NULL,
+ "url" TEXT NOT NULL,
+ "type" INTEGER NOT NULL,
+ FOREIGN KEY(articleID) REFERENCES articles(articleID)
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE TABLE IF NOT EXISTS "main"."taggings"
+ (
+ "articleID" TEXT NOT NULL,
+ "tagID" TEXT NOT NULL,
+ FOREIGN KEY(articleID) REFERENCES articles(articleID),
+ FOREIGN KEY(tagID) REFERENCES tags(tagID)
+ )
+ """);
+
+ m_db.simple_query("""
+ CREATE INDEX IF NOT EXISTS "index_articles"
+ ON "articles" ("feedID" DESC, "unread" ASC, "marked" ASC)
+ """);
+
+ m_db.simple_query("""
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_table
+ USING fts4 (content='articles', articleID, preview, title, author)
+ """);
+ }
+
+ public bool uninitialized()
+ {
+ string query = "SELECT count(*) FROM sqlite_master WHERE type='table' AND name='articles'";
+ var rows = m_db.execute(query);
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int() == 0;
+ }
+
+ public bool isEmpty()
+ {
+ return isTableEmpty("articles")
+ && isTableEmpty("categories")
+ && isTableEmpty("feeds")
+ && isTableEmpty("tags");
+ }
+
+ public bool isTableEmpty(string table)
+ {
+ var query = @"SELECT COUNT(*) FROM $table";
+ var rows = m_db.execute(query);
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int() == 0;
+ }
+
+ private uint count_article_status(ArticleStatus status)
+ {
+ var query = "SELECT COUNT(*) FROM articles";
+ string status_column = status.column();
+ if(status_column != null)
+ query += @" WHERE $status_column = ?";
+ var rows = m_db.execute(query, { status });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int();
+ }
+
+ public uint get_unread_total()
+ {
+ return count_article_status(ArticleStatus.UNREAD);
+ }
+
+ public uint get_marked_total()
+ {
+ return count_article_status(ArticleStatus.MARKED);
+ }
+
+ private uint count_status_uncategorized(ArticleStatus status)
+ {
+ var query = new QueryBuilder(QueryType.SELECT, "articles");
+ query.selectField("count(*)");
+ var status_column = status.column();
+ if(status_column != null)
+ query.addEqualsCondition(status_column, status.to_string());
+ query.addCustomCondition(getUncategorizedFeedsQuery());
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int unread = 0;
+ while (stmt.step() == Sqlite.ROW) {
+ unread = stmt.column_int(0);
+ }
+ stmt.reset();
+ return unread;
+ }
+
+ public uint get_unread_uncategorized()
+ {
+ return count_status_uncategorized(ArticleStatus.UNREAD);
+ }
+
+ public uint get_marked_uncategorized()
+ {
+ return count_status_uncategorized(ArticleStatus.MARKED);
+ }
+
+ public int get_new_unread_count(int row_id)
+ {
+ if(row_id == 0)
+ return 0;
+
+ string query = "SELECT count(*) FROM articles WHERE unread = ? AND rowid > ?";
+ var rows = m_db.execute(query, { ArticleStatus.UNREAD, row_id });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int();
+ }
+
+ public int getTagColor()
+ {
+ var rows = m_db.execute("SELECT COUNT(*) FROM tags WHERE instr(tagID, \"global.\") = 0");
+ assert(rows.size == 1 && rows[0].size == 1);
+ int tagCount = rows[0][0].to_int();
+ return tagCount % Constants.COLORS.length;
+ }
+
+ public bool tag_still_used(Tag tag)
+ {
+ var query = "SELECT 1 FROM main.taggings WHERE tagID = ? LIMIT 1";
+ var rows = m_db.execute(query, { tag.getTagID() });
+ return rows.size > 0;
+ }
+
+ public string? getTagName(string tag_id)
+ {
+ var query = "SELECT title FROM tags WHERE tagID = ?";
+ var rows = m_db.execute(query, { tag_id });
+ assert(rows.size == 0 || (rows.size == 1 && rows[0].size == 1));
+ if(rows.size == 1)
+ return rows[0][0].to_string();
+ return _("Unknown tag");
+ }
+
+ public int getLastModified()
+ {
+ var query = "SELECT MAX(lastModified) FROM articles";
+ var rows = m_db.execute(query);
+ assert(rows.size == 0 || (rows.size == 1 && rows[0].size == 1));
+ if(rows.size == 1 && rows[0][0] != null)
+ return rows[0][0].to_int();
+ else
+ return 0;
+ }
+
+
+ public string getCategoryName(string catID)
+ {
+ if(catID == CategoryID.TAGS.to_string())
+ return "Tags";
+
+ var query = "SELECT title FROM categories WHERE categorieID = ?";
+ var rows = m_db.execute(query, { catID });
+
+ string result = "";
+ if(rows.size != 0)
+ result = rows[0][0].to_string();
+
+ if(result == "")
+ result = _("Uncategorized");
+
+ return result;
+ }
+
+ public string? getCategoryID(string catname)
+ {
+ var query = "SELECT categorieID FROM categories WHERE title = ?";
+ var rows = m_db.execute(query, { catname });
+ if(rows.size == 0)
+ return null;
+ else
+ return rows[0][0].to_string();
+ }
+
+ public bool preview_empty(string articleID)
+ {
+ var query = "SELECT COUNT(*) FROM articles WHERE articleID = ? AND preview != ''";
+ var rows = m_db.execute(query, { articleID });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int() != 0;
+ }
+
+ public Gee.List<Article> read_article_between(
+ string feedID,
+ FeedListType selectedType,
+ ArticleListState state,
+ string searchTerm,
+ string id1,
+ GLib.DateTime date1,
+ string id2,
+ GLib.DateTime date2)
+ {
+ var query = articleQuery(feedID, selectedType, state, searchTerm);
+ var sorting = (ArticleListSort)Settings.general().get_enum("articlelist-sort-by");
+
+ if(sorting == ArticleListSort.RECEIVED)
+ query.addCustomCondition(@"date BETWEEN (SELECT rowid FROM articles WHERE articleID = \"$id1\") AND (SELECT rowid FROM articles WHERE articleID = \"$id2\")");
+ else
+ {
+ bool bigger = (date1.to_unix() > date2.to_unix());
+ var biggerDate = (bigger) ? date1.to_unix() : date2.to_unix();
+ var smallerDate = (bigger) ? date2.to_unix() : date1.to_unix();
+ query.addCustomCondition(@"date BETWEEN $smallerDate AND $biggerDate");
+ }
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ var articles = new Gee.ArrayList<Article>();
+ while (stmt.step () == Sqlite.ROW)
+ {
+ if(stmt.column_text(2) == id1
+ || stmt.column_text(2) == id2)
+ continue;
+
+ articles.add(new Article(
+ stmt.column_text(2), // articleID
+ stmt.column_text(3), // title
+ stmt.column_text(5), // url
+ stmt.column_text(1), // feedID
+ (ArticleStatus)stmt.column_int(7), // unread
+ (ArticleStatus)stmt.column_int(8), // marked
+ null, // html
+ stmt.column_text(6), // preview
+ stmt.column_text(4), // author
+ new GLib.DateTime.from_unix_local(stmt.column_int(9)), // date
+ stmt.column_int(0), // sortID
+ read_taggings_by_article_id(stmt.column_text(2)), // tags
+ read_enclosures(stmt.column_text(2)), // enclosures
+ stmt.column_text(10) // guid
+ ));
+ }
+ stmt.reset();
+ return articles;
+ }
+
+ private Gee.List<Enclosure> read_enclosures(string article_id)
+ {
+ var list = new Gee.ArrayList<Enclosure>();
+
+ var query = "SELECT url, type FROM Enclosures WHERE articleID = ?";
+ var rows = m_db.execute(query, { article_id });
+
+ foreach(var row in rows)
+ {
+ list.add(new Enclosure(article_id, row[0].to_string(), (EnclosureType)row[1].to_int()));
+ }
+
+ return list;
+ }
+
+ public Gee.HashMap<string, Article> read_article_stats(Gee.List<string> ids)
+ {
+ var query = new QueryBuilder(QueryType.SELECT, "articles");
+ query.selectField("articleID, unread, marked");
+ query.addRangeConditionString("articleID", ids);
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ var articles = new Gee.HashMap<string, Article>();
+
+ while(stmt.step() == Sqlite.ROW)
+ {
+ articles.set(stmt.column_text(0),
+ new Article(stmt.column_text(0), null, null, null, (ArticleStatus)stmt.column_int(1),
+ (ArticleStatus)stmt.column_int(2), null, null, null, new GLib.DateTime.now_local()));
+ }
+ stmt.reset();
+ return articles;
+ }
+
+ public Article? read_article(string articleID)
+ {
+ Logger.debug(@"DataBaseReadOnly.read_article(): $articleID");
+ var rows = m_db.execute("SELECT ROWID, * FROM articles WHERE articleID = ?", { articleID });
+ if(rows.size == 0)
+ return null;
+ var row = rows[0];
+ string? author = row[4].to_string();
+ if(author == "")
+ author = null;
+
+ return new Article(
+ articleID,
+ row[3].to_string(),
+ row[5].to_string(),
+ row[2].to_string(),
+ (ArticleStatus)row[8].to_int(),
+ (ArticleStatus)row[9].to_int(),
+ row[6].to_string(),
+ row[7].to_string(),
+ author,
+ new GLib.DateTime.from_unix_local(row[11].to_int()),
+ row[0].to_int(), // rowid (sortid)
+ read_taggings_by_article_id(articleID), // tags
+ read_enclosures(articleID), // enclosures
+ row[11].to_string() // guid
+ );
+ }
+
+ public int getMaxCatLevel()
+ {
+ var rows = m_db.execute("SELECT MAX(Level) FROM categories");
+ assert(rows.size == 1 && rows[0].size == 1);
+ int maxCatLevel = rows[0][0].to_int();
+ if(maxCatLevel == 0)
+ maxCatLevel = 1;
+ return maxCatLevel;
+ }
+
+ public bool haveFeedsWithoutCat()
+ {
+ var query = new QueryBuilder(QueryType.SELECT, "feeds");
+ query.selectField("count(*)");
+ query.addCustomCondition(getUncategorizedQuery());
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ while (stmt.step () == Sqlite.ROW) {
+ int count = stmt.column_int(0);
+
+ if(count > 0)
+ return true;
+ }
+ return false;
+ }
+
+ public bool haveCategories()
+ {
+ var rows = m_db.execute("SELECT COUNT(*) FROM categories");
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int() > 0;
+ }
+
+ public bool article_exists(string articleID)
+ {
+ var rows = m_db.execute("SELECT 1 FROM articles WHERE articleID = ? LIMIT 1", { articleID });
+ return rows.size != 0;
+ }
+
+ public bool category_exists(string catID)
+ {
+ var rows = m_db.execute("SELECT 1 FROM categories WHERE categorieID = ? LIMIT 1", { catID });
+ return rows.size != 0;
+ }
+
+ public int getRowCountHeadlineByDate(string date)
+ {
+ var rows = m_db.execute("SELECT COUNT(*) FROM articles WHERE date > ?", { date });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int();
+ }
+
+ public int getArticleCountNewerThanID(string articleID, string feedID, FeedListType selectedType, ArticleListState state, string searchTerm, int searchRows = 0)
+ {
+ int result = 0;
+ string orderBy = ((ArticleListSort)Settings.general().get_enum("articlelist-sort-by") == ArticleListSort.RECEIVED) ? "rowid" : "date";
+
+ var query = new QueryBuilder(QueryType.SELECT, "articles");
+ query.addEqualsCondition("articleID", articleID, true, true);
+
+ var query2 = new QueryBuilder(QueryType.SELECT, "articles");
+ query2.selectField("count(*)");
+
+
+ query.selectField(orderBy);
+ query.build();
+
+ if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
+ query2.addCustomCondition(@"$orderBy < (%s)".printf(query.get()));
+ else
+ query2.addCustomCondition(@"$orderBy > (%s)".printf(query.get()));
+
+
+ if(selectedType == FeedListType.FEED && feedID != FeedID.ALL.to_string())
+ {
+ query2.addEqualsCondition("feedID", feedID, true, true);
+ }
+ else if(selectedType == FeedListType.CATEGORY && feedID != CategoryID.MASTER.to_string() && feedID != CategoryID.TAGS.to_string())
+ {
+ query2.addRangeConditionString("feedID", getFeedIDofCategorie(feedID));
+ }
+ else if(feedID == CategoryID.TAGS.to_string())
+ {
+ query2.addCustomCondition(getAllTagsCondition());
+ }
+ else if(selectedType == FeedListType.TAG)
+ {
+ query2.addCustomCondition("articleID IN (%s)".printf(StringUtils.join(StringUtils.sql_quote(read_taggings_by_tag_id(feedID)), ",")));
+ }
+
+ if(state == ArticleListState.UNREAD)
+ {
+ query2.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
+ }
+ else if(state == ArticleListState.MARKED)
+ {
+ query2.addEqualsCondition("marked", ArticleStatus.MARKED.to_string());
+ }
+
+ if(searchTerm != ""){
+ if(searchTerm.has_prefix("title: "))
+ {
+ query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE title MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ else if(searchTerm.has_prefix("author: "))
+ {
+ query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE author MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ else if(searchTerm.has_prefix("content: "))
+ {
+ query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE preview MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ else
+ {
+ query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE fts_table MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ }
+
+ bool desc = true;
+ string asc = "DESC";
+ if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
+ {
+ desc = false;
+ asc = "ASC";
+ }
+
+ if(searchRows != 0)
+ query.addCustomCondition(@"articleID in (SELECT articleID FROM articles ORDER BY $orderBy $asc LIMIT $searchRows)");
+
+ query2.orderBy(orderBy, desc);
+ query2.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query2.get());
+
+ while (stmt.step () == Sqlite.ROW) {
+ result = stmt.column_int(0);
+ }
+
+ return result;
+ }
+
+ public Gee.List<string> getFeedIDofCategorie(string categorieID)
+ {
+ var feedIDs = new Gee.ArrayList<string>();
+
+ var query = new QueryBuilder(QueryType.SELECT, "feeds");
+ query.selectField("feed_id, category_id");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ while (stmt.step() == Sqlite.ROW) {
+ string catString = stmt.column_text(1);
+ string[] categories = catString.split(",");
+
+ if(categorieID == "")
+ {
+ if((categories.length == 0)
+ ||(categories.length == 1 && categories[0].contains("global.must")))
+ {
+ feedIDs.add(stmt.column_text(0));
+ }
+ }
+ else
+ {
+ foreach(string cat in categories)
+ {
+ if(cat == categorieID)
+ {
+ feedIDs.add(stmt.column_text(0));
+ }
+ }
+ }
+ }
+ return feedIDs;
+ }
+
+ protected string getUncategorizedQuery()
+ {
+ string catID = FeedServer.get_default().uncategorizedID();
+ return "category_id = \"%s\"".printf(catID);
+ }
+
+ protected bool showCategory(string catID, Gee.List<Feed> feeds)
+ {
+ if(FeedServer.get_default().hideCategoryWhenEmpty(catID)
+ && !Utils.categoryIsPopulated(catID, feeds))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ protected string getUncategorizedFeedsQuery()
+ {
+ var query = new QueryBuilder(QueryType.SELECT, "feeds");
+ query.selectField("feed_id");
+ query.addCustomCondition(getUncategorizedQuery());
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ string feedIDs = "";
+ while (stmt.step () == Sqlite.ROW) {
+ feedIDs += "\"" + stmt.column_text(0) + "\"" + ",";
+ }
+
+ return "feedID IN (%s)".printf(feedIDs.substring(0, feedIDs.length-1));
+ }
+
+ public string getFeedIDofArticle(string articleID)
+ {
+ var rows = m_db.execute("SELECT feedID FROM articles WHERE articleID = ?", { articleID });
+ string id = null;
+ if(rows.size != 0)
+ id = rows[0][0].to_string();
+ if(id == null)
+ id = "";
+ return id;
+ }
+
+ public string getNewestArticle()
+ {
+ var rows = m_db.execute("SELECT articleID FROM articles WHERE rowid = ?", { getMaxID("articles", "rowid") });
+ if(rows.size == 0)
+ return "";
+ return rows[0][0].to_string();
+ }
+
+ public string getMaxID(string table, string field)
+ {
+ var rows = m_db.execute(@"SELECT MAX($field) FROM $table");
+ string? id = null;
+ if(rows.size > 0)
+ id = rows[0][0].to_string();
+ if(id == null)
+ id = "";
+ return id;
+ }
+
+ public bool feed_exists(string feed_url)
+ {
+ var rows = m_db.execute("SELECT COUNT(*) FROM main.feeds WHERE url = ? LIMIT 1", { feed_url });
+ assert(rows.size == 1 && rows[0].size == 1);
+ // Why > 1 and not > 0?
+ return rows[0][0].to_int() > 1;
+ }
+
+ public Feed? read_feed(string feedID)
+ {
+ var rows = m_db.execute("SELECT * FROM feeds WHERE feed_id = ?", { feedID });
+ if(rows.size == 0)
+ return null;
+
+ var row = rows[0];
+ return new Feed(
+ feedID,
+ row[1].to_string(),
+ row[2].to_string(),
+ getFeedUnread(feedID),
+ StringUtils.split(row[3].to_string(), ",", true),
+ row[6].to_string(),
+ row[5].to_string());
+ }
+
+ public Gee.List<Feed> read_feeds(bool starredCount = false)
+ {
+ Gee.List<Feed> feeds = new Gee.ArrayList<Feed>();
+
+ var query = new QueryBuilder(QueryType.SELECT, "feeds");
+ query.selectField("*");
+ if(Settings.general().get_enum("feedlist-sort-by") == FeedListSort.ALPHABETICAL)
+ {
+ query.orderBy("name", true);
+ }
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ while (stmt.step () == Sqlite.ROW) {
+ string feedID = stmt.column_text(0);
+ string catString = stmt.column_text(3);
+ string xmlURL = stmt.column_text(5);
+ string iconURL = stmt.column_text(6);
+ string url = stmt.column_text(2);
+ string name = stmt.column_text(1);
+ var categories = StringUtils.split(catString, ",", true);
+
+ uint count = 0;
+ if(starredCount)
+ count = getFeedStarred(feedID);
+ else
+ count = getFeedUnread(feedID);
+
+ var feed = new Feed(feedID, name, url, count, categories, iconURL, xmlURL);
+ feeds.add(feed);
+ }
+
+ return feeds;
+ }
+
+ public uint getFeedUnread(string feedID)
+ {
+ var query = "SELECT COUNT(*) FROM articles WHERE unread = ? AND feedID = ?";
+ var rows = m_db.execute(query, { ArticleStatus.UNREAD, feedID });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int();
+ }
+
+ public uint getFeedStarred(string feedID)
+ {
+ var query = "SELECT COUNT(*) FROM articles WHERE marked = ? AND feedID = ?";
+ var rows = m_db.execute(query, { ArticleStatus.MARKED, feedID });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int();
+ }
+
+ public Gee.List<Feed> read_feeds_without_cat()
+ {
+ var feeds = new Gee.ArrayList<Feed>();
+
+ var query = new QueryBuilder(QueryType.SELECT, "feeds");
+ query.selectField("*");
+ query.addCustomCondition(getUncategorizedQuery());
+ if(Settings.general().get_enum("feedlist-sort-by") == FeedListSort.ALPHABETICAL)
+ {
+ query.orderBy("name", true);
+ }
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ while (stmt.step () == Sqlite.ROW) {
+ string feedID = stmt.column_text(0);
+ string catString = stmt.column_text(3);
+ string xmlURL = stmt.column_text(5);
+ string iconURL = stmt.column_text(6);
+ string url = stmt.column_text(2);
+ string name = stmt.column_text(1);
+ var categories = StringUtils.split(catString, ",", true);
+ var feed = new Feed(feedID, name, url, getFeedUnread(feedID), categories, iconURL, xmlURL);
+ feeds.add(feed);
+ }
+
+ return feeds;
+ }
+
+ public Category? read_category(string catID)
+ {
+ var query = "SELECT * FROM categories WHERE categorieID = ?";
+ var rows = m_db.execute(query, { catID });
+ if(rows.size == 0)
+ return null;
+
+ var row = rows[0];
+ return new Category(
+ catID,
+ row[1].to_string(),
+ 0,
+ row[3].to_int(),
+ row[4].to_string(),
+ row[5].to_int()
+ );
+ }
+
+ public Gee.List<Tag> read_tags()
+ {
+ var rows = m_db.execute("SELECT * FROM tags WHERE instr(tagID, \"global.\") = 0");
+
+ var tags = new Gee.ArrayList<Tag>();
+ foreach(var row in rows)
+ {
+ var tag = new Tag(
+ row[0].to_string(),
+ row[1].to_string(),
+ row[3].to_int());
+ tags.add(tag);
+ }
+
+ return tags;
+ }
+
+ private Gee.List<string> read_taggings_by_article_id(string articleID)
+ {
+ var list = new Gee.LinkedList<string>();
+
+ var rows = m_db.execute("SELECT tagID FROM taggings WHERE articleID = ?", { articleID });
+
+ foreach(var row in rows)
+ {
+ list.add(row[0].to_string());
+ }
+
+ return list;
+ }
+
+ private Gee.List<string> read_taggings_by_tag_id(string tagID)
+ {
+ var list = new Gee.LinkedList<string>();
+
+ var rows = m_db.execute("SELECT articleID FROM taggings WHERE tagID = ?", { tagID });
+
+ foreach(var row in rows)
+ {
+ list.add(row[0].to_string());
+ }
+
+ return list;
+ }
+
+ public Tag? read_tag(string tagID)
+ {
+ var query = "SELECT * FROM tags WHERE tagID = ?";
+ var rows = m_db.execute(query, { tagID });
+ if(rows.size == 0)
+ return null;
+
+ var row = rows[0];
+ return new Tag(
+ row[0].to_string(),
+ row[1].to_string(),
+ row[3].to_int());
+ }
+
+ protected string getAllTagsCondition()
+ {
+ var tags = read_tags();
+ string query = "(";
+ foreach(Tag tag in tags)
+ {
+ query += "instr(\"tags\", \"%s\") > 0 OR ".printf(tag.getTagID());
+ }
+
+ int or = query.char_count()-4;
+ return query.substring(0, or) + ")";
+ }
+
+ public int getTagCount()
+ {
+ var rows = m_db.execute("SELECT COUNT(*) FROM tags WHERE instr(tagID, \"global.\") = 0");
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int();
+ }
+
+ public Gee.List<Category> read_categories_level(int level, Gee.List<Feed>? feeds = null)
+ {
+ var categories = read_categories(feeds);
+ var tmpCategories = new Gee.ArrayList<Category>();
+
+ foreach(Category cat in categories)
+ {
+ if(cat.getLevel() == level)
+ {
+ tmpCategories.add(cat);
+ }
+ }
+
+ return tmpCategories;
+ }
+
+ public Gee.List<Category> read_categories(Gee.List<Feed>? feeds = null)
+ {
+ Gee.List<Category> tmp = new Gee.ArrayList<Category>();
+
+ var query = new QueryBuilder(QueryType.SELECT, "categories");
+ query.selectField("*");
+
+ if(Settings.general().get_enum("feedlist-sort-by") == FeedListSort.ALPHABETICAL)
+ {
+ query.orderBy("title", true);
+ }
+ else
+ {
+ query.orderBy("orderID", true);
+ }
+
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ while(stmt.step () == Sqlite.ROW)
+ {
+ string catID = stmt.column_text(0);
+
+ if(feeds == null || showCategory(catID, feeds))
+ {
+ var tmpcategory = new Category(
+ catID,
+ stmt.column_text(1),
+ (feeds == null) ? 0 : Utils.categoryGetUnread(catID, feeds),
+ stmt.column_int(3),
+ stmt.column_text(4),
+ stmt.column_int(5)
+ );
+
+ tmp.add(tmpcategory);
+ }
+ }
+
+ return tmp;
+ }
+
+ public Gee.List<Article> readUnfetchedArticles()
+ {
+ var rows = m_db.execute("SELECT articleID, url, preview, html, feedID FROM articles WHERE contentFetched = 0");
+
+ var articles = new Gee.LinkedList<Article>();
+ foreach(var row in rows)
+ {
+ articles.add(new Article(
+ row[0].to_string(), // articleID
+ null, // title
+ row[1].to_string(), // url
+ row[4].to_string(), // feedID
+ ArticleStatus.UNREAD, // unread
+ ArticleStatus.UNMARKED, // marked
+ row[3].to_string(), // html
+ row[2].to_string(), // preview
+ null, // author
+ new GLib.DateTime.now_local() // date
+ ));
+ }
+ return articles;
+ }
+
+ public QueryBuilder articleQuery(string id, FeedListType selectedType, ArticleListState state, string searchTerm)
+ {
+ string orderBy = ((ArticleListSort)Settings.general().get_enum("articlelist-sort-by") == ArticleListSort.RECEIVED) ? "rowid" : "date";
+
+ var query = new QueryBuilder(QueryType.SELECT, "articles");
+ query.selectField("ROWID");
+ query.selectField("feedID");
+ query.selectField("articleID");
+ query.selectField("title");
+ query.selectField("author");
+ query.selectField("url");
+ query.selectField("preview");
+ query.selectField("unread");
+ query.selectField("marked");
+ query.selectField("date");
+ query.selectField("guidHash");
+
+ if(selectedType == FeedListType.FEED && id != FeedID.ALL.to_string())
+ {
+ query.addEqualsCondition("feedID", id, true, true);
+ }
+ else if(selectedType == FeedListType.CATEGORY && id != CategoryID.MASTER.to_string() && id != CategoryID.TAGS.to_string())
+ {
+ query.addRangeConditionString("feedID", getFeedIDofCategorie(id));
+ }
+ else if(id == CategoryID.TAGS.to_string())
+ {
+ query.addCustomCondition(getAllTagsCondition());
+ }
+ else if(selectedType == FeedListType.TAG)
+ {
+ query.addCustomCondition("articleID IN (%s)".printf(StringUtils.join(StringUtils.sql_quote(read_taggings_by_tag_id(id)), ",")));
+ }
+
+ if(state == ArticleListState.UNREAD)
+ {
+ query.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
+ }
+ else if(state == ArticleListState.MARKED)
+ {
+ query.addEqualsCondition("marked", ArticleStatus.MARKED.to_string());
+ }
+
+ if(searchTerm != ""){
+ if(searchTerm.has_prefix("title: "))
+ {
+ query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE title MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ else if(searchTerm.has_prefix("author: "))
+ {
+ query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE author MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ else if(searchTerm.has_prefix("content: "))
+ {
+ query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE preview MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ else
+ {
+ query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE fts_table MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
+ }
+ }
+
+ bool desc = true;
+ if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
+ desc = false;
+
+ query.orderBy(orderBy, desc);
+
+ return query;
+ }
+
+ public Gee.List<Article> read_articles(string id, FeedListType selectedType, ArticleListState state, string searchTerm, uint limit = 20, uint offset = 0, int searchRows = 0)
+ {
+ var query = articleQuery(id, selectedType, state, searchTerm);
+
+ string desc = "DESC";
+ if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
+ desc = "ASC";
+
+ if(searchRows != 0)
+ {
+ string orderBy = ((ArticleListSort)Settings.general().get_enum("articlelist-sort-by") == ArticleListSort.RECEIVED) ? "rowid" : "date";
+ query.addCustomCondition(@"articleID in (SELECT articleID FROM articles ORDER BY $orderBy $desc LIMIT $searchRows)");
+ }
+
+ query.limit(limit);
+ query.offset(offset);
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ var tmp = new Gee.LinkedList<Article>();
+ while (stmt.step () == Sqlite.ROW)
+ {
+ tmp.add(new Article(
+ stmt.column_text(2), // articleID
+ stmt.column_text(3), // title
+ stmt.column_text(5), // url
+ stmt.column_text(1), // feedID
+ (ArticleStatus)stmt.column_int(7), // unread
+ (ArticleStatus)stmt.column_int(8), // marked
+ null, // html
+ stmt.column_text(6), // preview
+ stmt.column_text(4), // author
+ new GLib.DateTime.from_unix_local(stmt.column_int(9)), // date
+ stmt.column_int(0), // sortID
+ read_taggings_by_article_id(stmt.column_text(2)), // tags
+ read_enclosures(stmt.column_text(2)), // enclosures
+ stmt.column_text(10) // guid
+ ));
+ }
+
+ return tmp;
+ }
+}
diff --git a/src/DataBaseWriteAccess.vala b/src/DataBaseWriteAccess.vala
new file mode 100644
index 00000000..3136cebe
--- /dev/null
+++ b/src/DataBaseWriteAccess.vala
@@ -0,0 +1,799 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.DataBase : DataBaseReadOnly {
+
+ private static DataBase? m_dataBase = null;
+
+ public static new DataBase writeAccess()
+ {
+ if(m_dataBase == null)
+ {
+ m_dataBase = new DataBase();
+ if(m_dataBase.uninitialized())
+ m_dataBase.init();
+ }
+
+ return m_dataBase;
+ }
+
+ public static new DataBaseReadOnly readOnly()
+ {
+ return writeAccess() as DataBaseReadOnly;
+ }
+
+ public DataBase(string dbFile = "feedreader-%01i.db".printf(Constants.DB_SCHEMA_VERSION))
+ {
+ base(dbFile);
+ }
+
+ public void checkpoint()
+ {
+ m_db.checkpoint();
+ }
+
+ public bool resetDB()
+ {
+ Logger.warning("resetDB");
+ m_db.simple_query("DROP TABLE main.feeds");
+ m_db.simple_query("DROP TABLE main.categories");
+ m_db.simple_query("DROP TABLE main.articles");
+ m_db.simple_query("DROP TABLE main.tags");
+ m_db.simple_query("DROP TABLE main.fts_table");
+ m_db.simple_query("VACUUM");
+
+ string query = "PRAGMA INTEGRITY_CHECK";
+ Sqlite.Statement stmt = m_db.prepare(query);
+
+ int cols = stmt.column_count ();
+ while (stmt.step () == Sqlite.ROW) {
+ for (int i = 0; i < cols; i++) {
+ if(stmt.column_text(i) != "ok")
+ {
+ Logger.error("resetting the database failed");
+ return false;
+ }
+ }
+ }
+ stmt.reset();
+ return true;
+ }
+
+ public void updateFTS()
+ {
+ m_db.simple_query("INSERT INTO fts_table(fts_table) VALUES('rebuild')");
+ }
+
+ public void springCleaning()
+ {
+ m_db.simple_query("VACUUM");
+ var now = new DateTime.now_local();
+ Settings.state().set_int("last-spring-cleaning", (int)now.to_unix());
+ }
+
+ public void dropOldArtilces(int weeks)
+ {
+ var query = new QueryBuilder(QueryType.SELECT, "main.articles");
+ query.selectField("articleID");
+ query.selectField("feedID");
+ query.addCustomCondition("datetime(date, 'unixepoch', 'localtime') <= datetime('now', '-%i days')".printf(weeks*7));
+ query.addEqualsCondition("marked", ArticleStatus.UNMARKED.to_string());
+ if(FeedServer.get_default().useMaxArticles())
+ {
+ int syncCount = Settings.general().get_int("max-articles");
+ query.addCustomCondition(@"rowid BETWEEN 1 AND (SELECT rowid FROM articles ORDER BY rowid DESC LIMIT 1 OFFSET $syncCount)");
+ }
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+ while (stmt.step () == Sqlite.ROW) {
+ delete_article(stmt.column_text(0), stmt.column_text(1));
+ }
+ }
+
+ private void delete_article(string articleID, string feedID)
+ {
+ Logger.info(@"Deleting article \"$articleID\"");
+ m_db.execute("DELETE FROM main.articles WHERE articleID = ?", { articleID });
+ m_db.execute("DELETE FROM main.Enclosures WHERE articleID = ?", { articleID });
+ string folder_path = GLib.Environment.get_user_data_dir() + @"/feedreader/data/images/$feedID/$articleID/";
+ Utils.remove_directory(folder_path);
+ }
+
+ public void dropTag(Tag tag)
+ {
+ m_db.execute("DELETE FROM main.tags WHERE tagID = ?", { tag.getTagID() });
+
+ var rows = m_db.execute("SELECT tags, articleID FROM main.articles WHERE instr(tags, ?) > 0", { tag.getTagID() });
+ foreach(var row in rows)
+ {
+ string articleID = row[1].to_string();
+ Gee.List<string> tags = StringUtils.split(row[0].to_string(), ",", true);
+ if(tags.contains(tag.getTagID()))
+ tags.remove(tag.getTagID());
+
+ m_db.execute("UPDATE main.articles SET tags = ? WHERE articleID = ?",
+ { StringUtils.join(tags, ","), articleID });
+ }
+ }
+
+ public void write_feeds(Gee.List<Feed> feeds)
+ {
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var query = new QueryBuilder(QueryType.INSERT_OR_REPLACE, "main.feeds");
+ query.insertValuePair("feed_id", "$FEEDID");
+ query.insertValuePair("name", "$FEEDNAME");
+ query.insertValuePair("url", "$FEEDURL");
+ query.insertValuePair("category_id", "$CATID");
+ query.insertValuePair("subscribed", "1");
+ query.insertValuePair("xmlURL", "$XMLURL");
+ query.insertValuePair("iconURL", "$ICONURL");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int feedID_pos = stmt.bind_parameter_index("$FEEDID");
+ int feedName_pos = stmt.bind_parameter_index("$FEEDNAME");
+ int feedURL_pos = stmt.bind_parameter_index("$FEEDURL");
+ int catID_pos = stmt.bind_parameter_index("$CATID");
+ int xmlURL_pos = stmt.bind_parameter_index("$XMLURL");
+ int iconURL_pos = stmt.bind_parameter_index("$ICONURL");
+ assert (feedID_pos > 0);
+ assert (feedName_pos > 0);
+ assert (feedURL_pos > 0);
+ assert (catID_pos > 0);
+ assert (xmlURL_pos > 0);
+ assert (iconURL_pos > 0);
+
+ foreach(var feed_item in feeds)
+ {
+ string catString = "";
+ foreach(string category in feed_item.getCatIDs())
+ {
+ catString += category + ",";
+ }
+
+ catString = catString.substring(0, catString.length-1);
+
+ stmt.bind_text(feedID_pos, feed_item.getFeedID());
+ stmt.bind_text(feedName_pos, feed_item.getTitle());
+ stmt.bind_text(feedURL_pos, feed_item.getURL());
+ stmt.bind_text(catID_pos, catString);
+ stmt.bind_text(xmlURL_pos, feed_item.getXmlUrl());
+ stmt.bind_text(iconURL_pos, feed_item.getIconURL());
+
+ while(stmt.step() == Sqlite.ROW){}
+ stmt.reset();
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+ public void write_tag(Tag tag)
+ {
+ var list = new Gee.ArrayList<Tag>();
+ list.add(tag);
+ write_tags(list);
+ }
+
+ public void write_tags(Gee.List<Tag> tags)
+ {
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var query = new QueryBuilder(QueryType.INSERT_OR_IGNORE, "main.tags");
+ query.insertValuePair("tagID", "$TAGID");
+ query.insertValuePair("title", "$LABEL");
+ query.insertValuePair("\"exists\"", "1");
+ query.insertValuePair("color", "$COLOR");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int tagID_position = stmt.bind_parameter_index("$TAGID");
+ int label_position = stmt.bind_parameter_index("$LABEL");
+ int color_position = stmt.bind_parameter_index("$COLOR");
+ assert (tagID_position > 0);
+ assert (label_position > 0);
+ assert (color_position > 0);
+
+ foreach(var tag_item in tags)
+ {
+ stmt.bind_text(tagID_position, tag_item.getTagID());
+ stmt.bind_text(label_position, tag_item.getTitle());
+ stmt.bind_int (color_position, tag_item.getColor());
+
+ while(stmt.step() == Sqlite.ROW){}
+ stmt.reset ();
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+ public void update_tag(Tag tag)
+ {
+ var list = new Gee.ArrayList<Tag>();
+ list.add(tag);
+ update_tags(list);
+
+ if(FeedServer.get_default().tagIDaffectedByNameChange())
+ {
+ string newID = tag.getTagID().replace(tag.getTitle(), tag.getTitle());
+ m_db.execute("UPDATE tags SET tagID = ? WHERE tagID = ?", { newID, tag.getTagID() });
+ m_db.execute("UPDATE articles SET tags = replace(tags, ?, ?) WHERE instr(tags, ?)",
+ { tag.getTagID(), newID, tag.getTagID() });
+ }
+ }
+
+ public void update_tags(Gee.List<Tag> tags)
+ {
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var query = new QueryBuilder(QueryType.UPDATE, "main.tags");
+ query.updateValuePair("title", "$TITLE");
+ query.updateValuePair("\"exists\"", "1");
+ query.addEqualsCondition("tagID", "$TAGID");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int title_position = stmt.bind_parameter_index("$TITLE");
+ int tagID_position = stmt.bind_parameter_index("$TAGID");
+ assert (title_position > 0);
+ assert (tagID_position > 0);
+
+ foreach(var tag_item in tags)
+ {
+ stmt.bind_text(title_position, tag_item.getTitle());
+ stmt.bind_text(tagID_position, tag_item.getTagID());
+ while (stmt.step () == Sqlite.ROW) {}
+ stmt.reset ();
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+
+ public void write_categories(Gee.List<Category> categories)
+ {
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var query = new QueryBuilder(QueryType.INSERT_OR_REPLACE, "main.categories");
+ query.insertValuePair("categorieID", "$CATID");
+ query.insertValuePair("title", "$FEEDNAME");
+ query.insertValuePair("orderID", "$ORDERID");
+ query.insertValuePair("\"exists\"", "1");
+ query.insertValuePair("Parent", "$PARENT");
+ query.insertValuePair("Level", "$LEVEL");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int catID_position = stmt.bind_parameter_index("$CATID");
+ int feedName_position = stmt.bind_parameter_index("$FEEDNAME");
+ int orderID_position = stmt.bind_parameter_index("$ORDERID");
+ int parent_position = stmt.bind_parameter_index("$PARENT");
+ int level_position = stmt.bind_parameter_index("$LEVEL");
+ assert (catID_position > 0);
+ assert (feedName_position > 0);
+ assert (orderID_position > 0);
+ assert (parent_position > 0);
+ assert (level_position > 0);
+
+ foreach(var cat_item in categories)
+ {
+ stmt.bind_text(catID_position, cat_item.getCatID());
+ stmt.bind_text(feedName_position, cat_item.getTitle());
+ stmt.bind_int (orderID_position, cat_item.getOrderID());
+ stmt.bind_text(parent_position, cat_item.getParent());
+ stmt.bind_int (level_position, cat_item.getLevel());
+
+ while (stmt.step () == Sqlite.ROW) {}
+ stmt.reset ();
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+ public void updateArticlesByID(Gee.List<string> ids, string field)
+ {
+ // first reset all articles
+ var reset_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
+ if(field == "unread")
+ reset_query.updateValuePair(field, ArticleStatus.READ.to_string());
+ else if(field == "marked")
+ reset_query.updateValuePair(field, ArticleStatus.UNMARKED.to_string());
+ m_db.simple_query(reset_query.build());
+
+
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ // then reapply states of the synced articles
+ var update_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
+
+ if(field == "unread")
+ update_query.updateValuePair(field, ArticleStatus.UNREAD.to_string());
+ else if(field == "marked")
+ update_query.updateValuePair(field, ArticleStatus.MARKED.to_string());
+
+ update_query.addEqualsCondition("articleID", "$ARTICLEID");
+ update_query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(update_query.get());
+
+ int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
+ assert (articleID_position > 0);
+
+
+ foreach(string id in ids)
+ {
+ stmt.bind_text(articleID_position, id);
+ while(stmt.step() != Sqlite.DONE){}
+ stmt.reset();
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+ public void writeContent(Article article)
+ {
+ var update_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
+ update_query.updateValuePair("html", "$HTML");
+ update_query.updateValuePair("preview", "$PREVIEW");
+ update_query.updateValuePair("contentFetched", "1");
+ update_query.addEqualsCondition("articleID", article.getArticleID(), true, true);
+ update_query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(update_query.get());
+
+ int html_position = stmt.bind_parameter_index("$HTML");
+ int preview_position = stmt.bind_parameter_index("$PREVIEW");
+ assert (html_position > 0);
+ assert (preview_position > 0);
+
+
+ stmt.bind_text(html_position, article.getHTML());
+ stmt.bind_text(preview_position, article.getPreview());
+
+ while(stmt.step() != Sqlite.DONE){}
+ stmt.reset();
+ }
+
+ public void update_article(Article article)
+ {
+ var list = new Gee.ArrayList<Article>();
+ list.add(article);
+ update_articles(list);
+ }
+
+ public void update_articles(Gee.List<Article> articles)
+ {
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var update_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
+ update_query.updateValuePair("unread", "$UNREAD");
+ update_query.updateValuePair("marked", "$MARKED");
+ update_query.updateValuePair("lastModified", "$LASTMODIFIED");
+ update_query.addEqualsCondition("articleID", "$ARTICLEID", true, false);
+ update_query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(update_query.get());
+
+ int unread_position = stmt.bind_parameter_index("$UNREAD");
+ int marked_position = stmt.bind_parameter_index("$MARKED");
+ int modified_position = stmt.bind_parameter_index("$LASTMODIFIED");
+ int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
+ assert (unread_position > 0);
+ assert (marked_position > 0);
+ assert (modified_position > 0);
+ assert (articleID_position > 0);
+
+
+ foreach(Article a in articles)
+ {
+ var unread = ActionCache.get_default().checkRead(a);
+ var marked = ActionCache.get_default().checkStarred(a.getArticleID(), a.getMarked());
+
+ if(unread != ArticleStatus.READ && unread != ArticleStatus.UNREAD)
+ Logger.warning(@"DataBase.update_articles: writing invalid unread status $unread for article " + a.getArticleID());
+
+ if(marked != ArticleStatus.MARKED && marked != ArticleStatus.UNMARKED)
+ Logger.warning(@"DataBase.update_articles: writing invalid marked status $marked for article " + a.getArticleID());
+
+ stmt.bind_int (unread_position, unread);
+ stmt.bind_int (marked_position, marked);
+ stmt.bind_int (modified_position, a.getLastModified());
+ stmt.bind_text(articleID_position, a.getArticleID());
+
+ while(stmt.step() != Sqlite.DONE){}
+ stmt.reset();
+
+ write_taggings(a);
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+
+ public void write_articles(Gee.List<Article> articles)
+ {
+ Utils.generatePreviews(articles);
+ Utils.checkHTML(articles);
+
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var query = new QueryBuilder(QueryType.INSERT_OR_IGNORE, "main.articles");
+ query.insertValuePair("articleID", "$ARTICLEID");
+ query.insertValuePair("feedID", "$FEEDID");
+ query.insertValuePair("title", "$TITLE");
+ query.insertValuePair("author", "$AUTHOR");
+ query.insertValuePair("url", "$URL");
+ query.insertValuePair("html", "$HTML");
+ query.insertValuePair("preview", "$PREVIEW");
+ query.insertValuePair("unread", "$UNREAD");
+ query.insertValuePair("marked", "$MARKED");
+ query.insertValuePair("date", "$DATE");
+ query.insertValuePair("guidHash", "$GUIDHASH");
+ query.insertValuePair("lastModified", "$LASTMODIFIED");
+ query.insertValuePair("contentFetched", "0");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
+ int feedID_position = stmt.bind_parameter_index("$FEEDID");
+ int url_position = stmt.bind_parameter_index("$URL");
+ int unread_position = stmt.bind_parameter_index("$UNREAD");
+ int marked_position = stmt.bind_parameter_index("$MARKED");
+ int title_position = stmt.bind_parameter_index("$TITLE");
+ int html_position = stmt.bind_parameter_index("$HTML");
+ int preview_position = stmt.bind_parameter_index("$PREVIEW");
+ int author_position = stmt.bind_parameter_index("$AUTHOR");
+ int date_position = stmt.bind_parameter_index("$DATE");
+ int guidHash_position = stmt.bind_parameter_index("$GUIDHASH");
+ int modified_position = stmt.bind_parameter_index("$LASTMODIFIED");
+
+ assert (articleID_position > 0);
+ assert (feedID_position > 0);
+ assert (url_position > 0);
+ assert (unread_position > 0);
+ assert (marked_position > 0);
+ assert (title_position > 0);
+ assert (html_position > 0);
+ assert (preview_position > 0);
+ assert (author_position > 0);
+ assert (date_position > 0);
+ assert (guidHash_position > 0);
+ assert (modified_position > 0);
+
+ foreach(var article in articles)
+ {
+ // if article time is in the future
+ var now = new GLib.DateTime.now_local();
+ if(article.getDate().compare(now) == 1)
+ article.SetDate(now);
+
+ int? weeks = ((DropArticles)Settings.general().get_enum("drop-articles-after")).to_weeks();
+ if(weeks != null && article.getDate().compare(now.add_weeks(-(int)weeks)) == -1)
+ {
+ Logger.info("Ignoring old article: %s".printf(article.getTitle()));
+ continue;
+ }
+
+ stmt.bind_text(articleID_position, article.getArticleID());
+ stmt.bind_text(feedID_position, article.getFeedID());
+ stmt.bind_text(url_position, article.getURL());
+ stmt.bind_int (unread_position, article.getUnread());
+ stmt.bind_int (marked_position, article.getMarked());
+ stmt.bind_text(title_position, Utils.UTF8fix(article.getTitle()));
+ stmt.bind_text(html_position, article.getHTML());
+ stmt.bind_text(preview_position, Utils.UTF8fix(article.getPreview(), true));
+ stmt.bind_text(author_position, article.getAuthor());
+ stmt.bind_int64(date_position, article.getDate().to_unix());
+ stmt.bind_text(guidHash_position, article.getHash());
+ stmt.bind_int (modified_position, article.getLastModified());
+
+ while(stmt.step() != Sqlite.DONE){}
+ stmt.reset();
+
+ write_enclosures(article);
+ write_taggings(article);
+ }
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+ private void write_taggings(Article article)
+ {
+ var query = new QueryBuilder(QueryType.INSERT_OR_REPLACE, "main.taggings");
+ query.insertValuePair("articleID", "$ARTICLEID");
+ query.insertValuePair("tagID", "$TAGID");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
+ int tagID_position = stmt.bind_parameter_index("$TAGID");
+
+ assert (articleID_position > 0);
+ assert (tagID_position > 0);
+
+ foreach(string tagID in article.getTagIDs())
+ {
+ stmt.bind_text(articleID_position, article.getArticleID());
+ stmt.bind_text(tagID_position, tagID);
+
+ while(stmt.step() != Sqlite.DONE){}
+ stmt.reset();
+ }
+ }
+
+ private void write_enclosures(Article article)
+ {
+ var query = new QueryBuilder(QueryType.INSERT_OR_REPLACE, "main.Enclosures");
+ query.insertValuePair("articleID", "$ARTICLEID");
+ query.insertValuePair("url", "$URL");
+ query.insertValuePair("type", "$TYPE");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
+ int url_position = stmt.bind_parameter_index("$URL");
+ int type_position = stmt.bind_parameter_index("$TYPE");
+
+ assert (articleID_position > 0);
+ assert (url_position > 0);
+ assert (type_position > 0);
+
+ foreach(Enclosure enc in article.getEnclosures())
+ {
+ stmt.bind_text(articleID_position, article.getArticleID());
+ stmt.bind_text(url_position, enc.get_url());
+ stmt.bind_int (type_position, enc.get_enclosure_type());
+
+ while(stmt.step() != Sqlite.DONE){}
+ stmt.reset();
+ }
+ }
+
+ public void markCategorieRead(string catID)
+ {
+ var query = new QueryBuilder(QueryType.UPDATE, "main.articles");
+ query.updateValuePair("unread", ArticleStatus.READ.to_string());
+ query.addRangeConditionString("feedID", getFeedIDofCategorie(catID));
+ m_db.simple_query(query.build());
+ }
+
+ public void markFeedRead(string feedID)
+ {
+ m_db.execute("UPDATE main.articles SET unread = ? WHERE feedID = ?", { ArticleStatus.READ, feedID });
+ }
+
+ public void markAllRead()
+ {
+ m_db.execute("UPDATE main.articles SET unread = ?", { ArticleStatus.READ });
+ }
+
+ public void reset_subscribed_flag()
+ {
+ m_db.simple_query("UPDATE main.feeds SET \"subscribed\" = 0");
+ }
+
+ public void reset_exists_tag()
+ {
+ m_db.simple_query("UPDATE main.tags SET \"exists\" = 0");
+ }
+
+ public void reset_exists_flag()
+ {
+ m_db.simple_query("UPDATE main.categories SET \"exists\" = 0");
+ }
+
+ public void delete_unsubscribed_feeds()
+ {
+ Logger.warning("DataBase: Deleting unsubscribed feeds");
+ m_db.simple_query("DELETE FROM main.feeds WHERE \"subscribed\" = 0");
+ }
+
+ public void delete_nonexisting_categories()
+ {
+ Logger.warning("DataBase: Deleting nonexisting categories");
+ m_db.simple_query("DELETE FROM main.categories WHERE \"exists\" = 0");
+ }
+
+ public void delete_nonexisting_tags()
+ {
+ Logger.warning("DataBase: Deleting nonexisting tags");
+ m_db.simple_query("DELETE FROM main.tags WHERE \"exists\" = 0");
+ }
+
+ public void delete_articles_without_feed()
+ {
+ Logger.warning("DataBase: Deleting articles without feed");
+ var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
+ query.selectField("feed_id");
+ query.addEqualsCondition("subscribed", "0", true, false);
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+ while(stmt.step () == Sqlite.ROW)
+ {
+ delete_articles(stmt.column_text(0));
+ }
+ }
+
+ public void delete_articles(string feedID)
+ {
+ Logger.warning(@"DataBase: Deleting all articles of feed \"$feedID\"");
+ m_db.execute("DELETE FROM main.articles WHERE feedID = ?", { feedID });
+ m_db.execute("DELETE FROM main.Enclosures INNER JOIN main.articles ON main.Enclosures.articleID = main.articles.articleID WHERE feedID = ?", { feedID });
+ string folder_path = GLib.Environment.get_user_data_dir() + @"/feedreader/data/images/$feedID/";
+ Utils.remove_directory(folder_path);
+ }
+
+ public void delete_category(string catID)
+ {
+ m_db.execute("DELETE FROM main.categories WHERE categorieID = ?", { catID });
+
+ if(FeedServer.get_default().supportMultiCategoriesPerFeed())
+ {
+ var rows = m_db.execute("SELECT feed_id, category_id FROM feeds WHERE instr(category_id, ?) > 0", { catID });
+ foreach(var row in rows)
+ {
+ string feedID = row[0].to_string();
+ string catIDs = row[1].to_string().replace(catID + ",", "");
+
+ m_db.execute("UPDATE main.feeds set category_id = ? WHERE feed_id = ?", { catIDs, feedID });
+ }
+ }
+ else
+ {
+ m_db.execute("UPDATE main.feeds set category_id = ? WHERE category_id = ?", { FeedServer.get_default().uncategorizedID(), catID });
+ if(FeedServer.get_default().supportMultiLevelCategories())
+ {
+ m_db.execute("UPDATE main.categories set Parent = \"-2\" WHERE categorieID = ?", { catID });
+ }
+ }
+ }
+
+ public void rename_category(string catID, string newName)
+ {
+ if(FeedServer.get_default().tagIDaffectedByNameChange())
+ {
+ var cat = read_category(catID);
+ string newID = catID.replace(cat.getTitle(), newName);
+ var query = "UPDATE categories SET categorieID = ?, title = ? WHERE categorieID = ?";
+ m_db.execute(query, {newID, newName, catID });
+
+ query = "UPDATE feeds SET category_id = replace(category_id, ?, ?) WHERE instr(category_id, ?)";
+ m_db.execute(query, { catID, newID, catID });
+ }
+ else
+ {
+ var query = "UPDATE categories SET title = ? WHERE categorieID = ?";
+ m_db.execute(query, { newName, catID });
+ }
+ }
+
+ public void move_category(string catID, string newParentID)
+ {
+ var parent = read_category(newParentID);
+ var query = "UPDATE categories SET Parent = ?, Level = ? WHERE categorieID = ?";
+ m_db.execute(query, { newParentID, parent.getLevel() + 1, catID });
+ }
+
+ public void rename_feed(string feedID, string newName)
+ {
+ var query = "UPDATE feeds SET name = ? WHERE feed_id = ?";
+ m_db.execute(query, { newName, feedID });
+ }
+
+ public void move_feed(string feedID, string currentCatID, string? newCatID = null)
+ {
+ var Feed = read_feed(feedID);
+ var categories = Feed.getCatIDs();
+ categories.remove(currentCatID);
+
+ if(newCatID != null)
+ categories.add(newCatID);
+
+ string catString = StringUtils.join(categories, ",");
+
+ var query = "UPDATE feeds SET category_id = ? WHERE feed_id = ?";
+ m_db.execute(query, { catString, feedID });
+ }
+
+ public void removeCatFromFeed(string feedID, string catID)
+ {
+ var feed = read_feed(feedID);
+ m_db.execute("UPDATE feeds SET category_id = ? WHERE feed_id = ?",
+ { feed.getCatString().replace(catID + ",", ""), feedID });
+ }
+
+ public void delete_feed(string feedID)
+ {
+ m_db.execute("DELETE FROM feeds WHERE feed_id = ?", { feedID });
+ delete_articles(feedID);
+ }
+
+ public void addCachedAction(CachedActions action, string id, string? argument = "")
+ {
+ m_db.simple_query("BEGIN TRANSACTION");
+
+ var query = new QueryBuilder(QueryType.INSERT_OR_IGNORE, "main.CachedActions");
+ query.insertValuePair("action", "$ACTION");
+ query.insertValuePair("id", "$ID");
+ query.insertValuePair("argument", "$ARGUMENT");
+ query.build();
+
+ Sqlite.Statement stmt = m_db.prepare(query.get());
+
+ int action_position = stmt.bind_parameter_index("$ACTION");
+ int id_position = stmt.bind_parameter_index("$ID");
+ int argument_position = stmt.bind_parameter_index("$ARGUMENT");
+ assert (action_position > 0);
+ assert (id_position > 0);
+ assert (argument_position > 0);
+
+ stmt.bind_int (action_position, action);
+ stmt.bind_text(id_position, id);
+ stmt.bind_text(argument_position, argument);
+
+ while (stmt.step () == Sqlite.ROW) {}
+ stmt.reset ();
+
+ m_db.simple_query("COMMIT TRANSACTION");
+ }
+
+
+ public Gee.List<CachedAction> readCachedActions()
+ {
+ var query = "SELECT * FROM CachedActions";
+ var rows = m_db.execute(query);
+ var actions = new Gee.ArrayList<CachedAction>();
+ foreach(var row in rows)
+ {
+ var action = new CachedAction(
+ (CachedActions)row[0].to_int(),
+ row[1].to_string(),
+ row[2].to_string());
+ action.print();
+ actions.add(action);
+ }
+ return actions;
+ }
+
+ public void resetCachedActions()
+ {
+ Logger.warning("resetCachedActions");
+ m_db.simple_query("DELETE FROM CachedActions");
+ }
+
+ public bool cachedActionNecessary(CachedAction action)
+ {
+ var query = "SELECT COUNT(*) FROM CachedActions WHERE argument = ? AND id = ? AND action = ?";
+ var rows = m_db.execute(query, { action.getArgument(), action.getID(), action.opposite() });
+ assert(rows.size == 1 && rows[0].size == 1);
+ return rows[0][0].to_int() == 0;
+ }
+
+ public void deleteOppositeCachedAction(CachedAction action)
+ {
+ var query = "DELETE FROM CachedActions WHERE argument = ? AND id = ? AND action = ?";
+ m_db.execute(query, { action.getArgument(), action.getID(), action.opposite() });
+ }
+
+}
diff --git a/src/Enums.vala b/src/Enums.vala
index 697abe19..2c645db6 100644
--- a/src/Enums.vala
+++ b/src/Enums.vala
@@ -26,13 +26,6 @@ namespace FeedReader {
}
}
- public enum LogLevel {
- OFF,
- ERROR,
- MORE,
- DEBUG
- }
-
public enum ArticleListState {
ALL,
UNREAD,
@@ -40,21 +33,21 @@ namespace FeedReader {
}
public enum DragTarget {
- TAG,
- FEED,
+ TAG,
+ FEED,
CAT
}
public enum ConsoleColor {
- BLACK,
- RED,
- GREEN,
- YELLOW,
- BLUE,
- MAGENTA,
- CYAN,
- WHITE,
- }
+ BLACK,
+ RED,
+ GREEN,
+ YELLOW,
+ BLUE,
+ MAGENTA,
+ CYAN,
+ WHITE,
+ }
public enum LogMessage {
ERROR,
@@ -79,7 +72,6 @@ namespace FeedReader {
UNREAD,
UNMARKED,
MARKED,
- TOGGLE,
ALL;
public string to_string()
@@ -91,6 +83,20 @@ namespace FeedReader {
{
return (int)this;
}
+
+ public string? column()
+ {
+ switch(this) {
+ case READ:
+ case UNREAD:
+ return "unread";
+ case MARKED:
+ case UNMARKED:
+ return "marked";
+ default:
+ return null;
+ }
+ }
}
public enum LoginResponse {
@@ -178,16 +184,39 @@ namespace FeedReader {
NEVER,
ONE_WEEK,
ONE_MONTH,
- SIX_MONTHS
+ SIX_MONTHS;
+
+ public int? to_weeks()
+ {
+ switch(this)
+ {
+ case NEVER:
+ return null;
+ case ONE_WEEK:
+ return 1;
+ case ONE_MONTH:
+ return 4;
+ case SIX_MONTHS:
+ return 24;
+ default:
+ assert_not_reached();
+ }
+ }
+
+ public DateTime? to_start_date()
+ {
+ int? weeks = to_weeks();
+ if(weeks == null)
+ return null;
+
+ return new DateTime.now_utc().add_weeks(-(int)weeks);
+ }
}
public enum FeedListType {
ALL_FEEDS,
- SPACER,
- SEPERATOR,
CATEGORY,
FEED,
- HEADLINE,
TAG
}
@@ -219,6 +248,25 @@ namespace FeedReader {
DOWN
}
+ public enum EnclosureType {
+ IMAGE,
+ VIDEO,
+ AUDIO,
+ FILE;
+
+ public static EnclosureType from_string(string str)
+ {
+ if (str.contains("audio"))
+ return AUDIO;
+ else if (str.contains("video"))
+ return VIDEO;
+ else if (str.contains("image"))
+ return IMAGE;
+ else
+ return FILE;
+ }
+ }
+
[Flags] public enum BackendFlags {
LOCAL,
HOSTED,
diff --git a/src/FavIcon.vala b/src/FavIcon.vala
new file mode 100644
index 00000000..9ea26e5d
--- /dev/null
+++ b/src/FavIcon.vala
@@ -0,0 +1,382 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+public class FeedReader.FavIcon : GLib.Object
+{
+ private static string m_icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
+ private static Gee.Map<string?, FavIcon?> m_map = null;
+
+ public static FavIcon for_feed(Feed? feed)
+ {
+ if(m_map == null)
+ m_map = new Gee.HashMap<string?, FavIcon?>();
+
+ var feed_id = feed != null ? feed.getFeedID() : null;
+ var icon = m_map.get(feed_id);
+ if(icon == null)
+ {
+ icon = new FavIcon(feed);
+ m_map.set(feed_id, icon);
+ }
+
+ return icon;
+ }
+
+ private Feed? m_feed;
+ private Gee.Promise<Gdk.Pixbuf?> m_pixbuf = null;
+ private ResourceMetadata m_metadata;
+
+ public signal void surface_changed(Feed feed, Cairo.Surface surface);
+
+ private FavIcon(Feed? feed)
+ {
+ m_feed = feed;
+ }
+
+ private int get_scale_factor()
+ {
+ return MainWindow.get_default().get_style_context().get_scale();
+ }
+
+ private Cairo.Surface create_surface_from_pixbuf(Gdk.Pixbuf pixbuf)
+ {
+ return Gdk.cairo_surface_create_from_pixbuf(pixbuf, get_scale_factor(), null);
+ }
+
+ public async Cairo.Surface? get_surface()
+ {
+ // This can happen if an API gives us weird data by returning an article
+ // with no feed.
+ if(m_feed == null)
+ {
+ return null;
+ }
+
+ // wait for ready + expired so we don't make a bunch of requests at once
+ if(m_pixbuf == null || (m_pixbuf.future.ready && m_metadata.is_expired()))
+ {
+ m_pixbuf = new Gee.Promise<Gdk.Pixbuf?>();
+ load.begin((obj, res) => {
+ load.end(res);
+ });
+ }
+ try
+ {
+ Gdk.Pixbuf pixbuf = yield m_pixbuf.future.wait_async();
+ if(pixbuf == null)
+ return null;
+
+ return create_surface_from_pixbuf(pixbuf);
+ }
+ catch(Error e)
+ {
+ Logger.error("FavIcon.get_pixbuf: " + e.message);
+ return null;
+ }
+ }
+
+ private async void load()
+ {
+ try
+ {
+ var stream = yield downloadFavIcon();
+ if(stream == null)
+ return;
+
+ var pixbuf = yield new Gdk.Pixbuf.from_stream_async(stream);
+ stream.close();
+
+ if(pixbuf.get_height() <= 1 && pixbuf.get_width() <= 1)
+ {
+ Logger.warning("FavIcon: Icon for feed %s is too small".printf(m_feed.getTitle()));
+ return;
+ }
+ int scale = get_scale_factor();
+ pixbuf = pixbuf.scale_simple(24 * scale, 24 * scale, Gdk.InterpType.BILINEAR);
+
+ m_pixbuf.set_value(pixbuf);
+ if(pixbuf != null)
+ surface_changed(m_feed, create_surface_from_pixbuf(pixbuf));
+ }
+ catch(Error e)
+ {
+ Logger.error("FavIcon.load: %s - %s".printf(m_feed.getTitle(), e.message));
+ }
+ finally
+ {
+ if(!m_pixbuf.future.ready)
+ m_pixbuf.set_value(null);
+ }
+ }
+
+ private InputStream? try_load_data_uri(string? icon_url)
+ {
+ if(icon_url == null || !icon_url.has_prefix("data"))
+ return null;
+
+ // LibSoup doesn't seem to handle data URI's properly, so handle them
+ // ourselves..
+ int comma = icon_url.index_of_char(',');
+ if(comma == -1)
+ {
+ Logger.warning(@"Invalid data URI: $icon_url");
+ return null;
+ }
+ int semicolon = icon_url.index_of_char(';');
+ string data_str = icon_url[comma:icon_url.length];
+ uint8[] data;
+ if(semicolon != -1 && semicolon < comma && icon_url[semicolon + 1:comma] == "base64")
+ {
+ data = Base64.decode(data_str);
+ }
+ else
+ {
+ data = data_str.data;
+ }
+ return new MemoryInputStream.from_data(data);
+ }
+
+ private async InputStream? downloadFavIcon(GLib.Cancellable? cancellable = null) throws GLib.Error
+ {
+ var datastream = try_load_data_uri(m_feed.getIconURL());
+ if(datastream != null)
+ return datastream;
+
+ string filename_prefix = m_icon_path + m_feed.getFeedFileName();
+ string local_filename = @"$filename_prefix.ico";
+ string metadata_filename = @"$filename_prefix.txt";
+
+ if(!yield Utils.ensure_path(m_icon_path))
+ return null;
+
+ m_metadata = yield ResourceMetadata.from_file_async(metadata_filename);
+ DateTime? expires = m_metadata.expires;
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return null;
+
+ bool use_cached = false;
+ if(!m_metadata.is_expired())
+ {
+ Logger.debug("Favicon for %s is valid until %s, skipping this time".printf(m_feed.getTitle(), expires.to_string()));
+ use_cached = true;
+ }
+ else if(!NetworkMonitor.get_default().network_available)
+ {
+ Logger.debug("Network not available, skipping favicon download");
+ use_cached = true;
+ }
+ if(use_cached)
+ {
+ var file = File.new_for_path(local_filename);
+ try
+ {
+ return yield file.read_async();
+ }
+ catch(IOError.NOT_FOUND e)
+ {
+ return null;
+ }
+ }
+
+ try
+ {
+ var obvious_icons = new Gee.ArrayList<string>();
+
+ if(m_feed.getIconURL() != null)
+ obvious_icons.add(m_feed.getIconURL());
+
+ // try domainname/favicon.ico
+ var uri = new Soup.URI(m_feed.getURL());
+ string? siteURL = null;
+ if(uri != null)
+ {
+ string hostname = uri.get_host();
+ siteURL = uri.get_scheme() + "://" + hostname;
+
+ var icon_url = siteURL;
+ if(!icon_url.has_suffix("/"))
+ icon_url += "/";
+ icon_url += "favicon.ico";
+ obvious_icons.add(icon_url);
+ }
+
+ // Try to find one of those icons
+ foreach(var url in obvious_icons)
+ {
+ var stream = yield downloadIcon(url, cancellable);
+ if(stream != null)
+ return stream;
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return null;
+ }
+
+ // If all else fails, download html and parse to find location of favicon
+ if(siteURL == null)
+ return null;
+
+ var message_html = new Soup.Message("GET", siteURL);
+ if(Settings.tweaks().get_boolean("do-not-track"))
+ message_html.request_headers.append("DNT", "1");
+
+ string html;
+ try
+ {
+ var bodyStream = yield Utils.getSession().send_async(message_html);
+ html = (string)yield Utils.inputStreamToArray(bodyStream, cancellable);
+ }
+ catch (Error e)
+ {
+ Logger.warning(@"Request for $siteURL failed: " + e.message);
+ return null;
+ }
+ if(html != null && message_html.status_code == 200)
+ {
+ var html_cntx = new Html.ParserCtxt();
+ html_cntx.use_options(Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
+ Html.Doc* doc = html_cntx.read_doc(html, siteURL, null, Html.ParserOption.NOERROR + Html.ParserOption.NOWARNING);
+ if(doc == null)
+ {
+ Logger.debug(@"Utils.downloadFavIcon: parsing html on $siteURL failed");
+ return null;
+ }
+
+ try
+ {
+ // check for <link rel="icon">
+ var xpath = grabberUtils.getURL(doc, "//link[@rel='icon']");
+
+ if(xpath == null)
+ // check for <link rel="shortcut icon">
+ xpath = grabberUtils.getURL(doc, "//link[@rel='shortcut icon']");
+
+ if(xpath == null)
+ // check for <link rel="apple-touch-icon">
+ xpath = grabberUtils.getURL(doc, "//link[@rel='apple-touch-icon']");
+
+ if(xpath != null)
+ {
+ xpath = grabberUtils.completeURL(xpath, siteURL);
+ return yield downloadIcon(xpath, cancellable);
+ }
+ }
+ finally
+ {
+ delete doc;
+ }
+ }
+
+ return null;
+ }
+ finally
+ {
+ var default_expires = new DateTime.now_utc().add_days(Constants.REDOWNLOAD_FAVICONS_AFTER_DAYS);
+ if(m_metadata.expires == null || m_metadata.expires.to_unix() < default_expires.to_unix())
+ {
+ m_metadata.expires = default_expires;
+ }
+ yield m_metadata.save_to_file_async(metadata_filename);
+ }
+ }
+
+ private async InputStream? downloadIcon(string? icon_url, Cancellable? cancellable) throws GLib.Error
+ {
+ if(icon_url == "" || icon_url == null || GLib.Uri.parse_scheme(icon_url) == null)
+ {
+ Logger.warning(@"Utils.downloadIcon: icon_url not valid $icon_url");
+ return null;
+ }
+
+ string filename_prefix = m_icon_path + m_feed.getFeedFileName();
+ string local_filename = @"$filename_prefix.ico";
+
+ string etag = m_metadata.etag;
+ string last_modified = m_metadata.last_modified;
+
+ Logger.debug(@"Utils.downloadIcon: url = $icon_url");
+ var message = new Soup.Message("GET", icon_url);
+ if(message == null)
+ {
+ Logger.warning(@"Failed to create message for icon URL $icon_url");
+ return null;
+ }
+ if(Settings.tweaks().get_boolean("do-not-track"))
+ message.request_headers.append("DNT", "1");
+
+ if(etag != null)
+ message.request_headers.append("If-None-Match", etag);
+ if(last_modified != null)
+ message.request_headers.append("If-Modified-Since", last_modified);
+
+ uint8[]? data;
+ try
+ {
+ var bodyStream = yield Utils.getSession().send_async(message, cancellable);
+ data = yield Utils.inputStreamToArray(bodyStream, cancellable);
+ }
+ catch (Error e)
+ {
+ Logger.error(@"Request for $icon_url failed: " + e.message);
+ return null;
+ }
+ var status = message.status_code;
+ if(status == 304)
+ {
+ var file = File.new_for_path(local_filename);
+ return yield file.read_async();
+ }
+ else if(status == 404 || data == null)
+ {
+ return null;
+ }
+ else if(status == 200)
+ {
+ var local_file = File.new_for_path(local_filename);
+ try
+ {
+ yield local_file.replace_contents_async(data, null, false, FileCreateFlags.NONE, null, null);
+ }
+ catch(Error e)
+ {
+ Logger.error("Error writing icon: %s".printf(e.message));
+ return null;
+ }
+
+ m_metadata.etag = message.response_headers.get_one("ETag");
+ m_metadata.last_modified = message.response_headers.get_one("Last-Modified");
+
+ var cache_control = message.response_headers.get_list("Cache-Control");
+ if(cache_control != null)
+ {
+ foreach(var header in message.response_headers.get_list("Cache-Control").split(","))
+ {
+ var parts = header.split("=");
+ if(parts.length < 2 || parts[0] != "max-age")
+ continue;
+ var seconds = int64.parse(parts[1]);
+ var expires = new DateTime.now_utc();
+ expires.add_seconds(seconds);
+ m_metadata.expires = expires;
+ }
+ }
+
+ m_metadata.last_modified = message.response_headers.get_one("Last-Modified");
+ return new MemoryInputStream.from_data(data);
+ }
+
+ Logger.warning(@"Could not download icon for feed: %s $icon_url, got response code $status".printf(m_feed.getFeedID()));
+ return null;
+ }
+}
diff --git a/src/FavIconCache.vala b/src/FavIconCache.vala
deleted file mode 100644
index 9bb72ed3..00000000
--- a/src/FavIconCache.vala
+++ /dev/null
@@ -1,115 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.FavIconCache : GLib.Object {
-
- private Gee.HashMap<string, Gdk.Pixbuf> m_map;
- private static FavIconCache? m_cache = null;
-
- public static FavIconCache get_default()
- {
- if(m_cache == null)
- m_cache = new FavIconCache();
-
- return m_cache;
- }
-
- private FavIconCache()
- {
- m_map = new Gee.HashMap<string, Gdk.Pixbuf>();
-
- try
- {
- var iconDirPath = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var iconDirectory = GLib.File.new_for_path(iconDirPath);
- if(!iconDirectory.query_exists())
- {
- try
- {
- iconDirectory.make_directory_with_parents();
- }
- catch(GLib.Error e)
- {
- Logger.error("FavIconCache: Can't create directory: %s".printf(e.message));
- }
- }
- var enumerator = iconDirectory.enumerate_children(GLib.FileAttribute.STANDARD_NAME, 0);
- GLib.FileInfo? fileInfo = null;
-
- while((fileInfo = enumerator.next_file()) != null)
- {
- string fileName = fileInfo.get_name();
- var pixbuf = new Gdk.Pixbuf.from_file_at_scale(iconDirPath + fileName, 24, 24, true);
- fileName = fileName.substring(0, fileName.length - ".ico".length);
- m_map.set(fileName, pixbuf);
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("FavIconCache: %s".printf(e.message));
- }
- }
-
- private void refresh()
- {
- try
- {
- var iconDirPath = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/";
- var iconDirectory = GLib.File.new_for_path(iconDirPath);
- var enumerator = iconDirectory.enumerate_children(GLib.FileAttribute.STANDARD_NAME, 0);
- GLib.FileInfo? fileInfo = null;
-
- while((fileInfo = enumerator.next_file()) != null)
- {
- string fileName = fileInfo.get_name();
- if(!hasIcon(fileName))
- {
- var pixbuf = new Gdk.Pixbuf.from_file_at_scale(iconDirPath + fileName, 24, 24, true);
- fileName = fileName.substring(0, fileName.length - ".ico".length);
- m_map.set(fileName, pixbuf);
- }
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("FavIconCache: %s".printf(e.message));
- }
- }
-
- private bool hasIcon(string iconName)
- {
- if(m_map == null)
- return false;
-
- return m_map.has_key(iconName);
- }
-
- public Gdk.Pixbuf? getIcon(string name, bool firstTry = true)
- {
- string fixedName = name.replace("/", "_").replace(".", "_");
-
- if(hasIcon(fixedName))
- {
- return m_map.get(fixedName).copy();
- }
- else if(firstTry)
- {
- refresh();
- return getIcon(name, false);
- }
-
- return null;
- }
-}
diff --git a/src/FeedReader.vala b/src/FeedReader.vala
index d18ba016..9abc2f32 100644
--- a/src/FeedReader.vala
+++ b/src/FeedReader.vala
@@ -25,6 +25,7 @@ namespace FeedReader {
private MainWindow m_window;
private bool m_online = true;
private static FeedReaderApp? m_app = null;
+ public static bool m_verbose = false;
public signal void callback(string content);
@@ -48,38 +49,150 @@ namespace FeedReader {
protected override void startup()
{
- Logger.init("ui");
+ Logger.init(m_verbose);
Logger.info("FeedReader " + AboutInfo.version);
+ Settings.state().set_boolean("currently-updating", false);
+
base.startup();
}
public override void activate()
{
base.activate();
-
WebKit.WebContext.get_default().set_web_extensions_directory(Constants.INSTALL_PREFIX + "/" + Constants.INSTALL_LIBDIR);
if(m_window == null)
{
+ SetupActions();
m_window = MainWindow.get_default();
m_window.set_icon_name("org.gnome.FeedReader");
Gtk.IconTheme.get_default().add_resource_path("/org/gnome/FeedReader/icons");
+
+ FeedReaderBackend.get_default().newFeedList.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: newFeedList");
+ ColumnView.get_default().newFeedList();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().refreshFeedListCounter.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: refreshFeedListCounter");
+ ColumnView.get_default().refreshFeedListCounter();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().updateArticleList.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: updateArticleList");
+ ColumnView.get_default().updateArticleList();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().syncStarted.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: syncStarted");
+ MainWindow.get_default().writeInterfaceState();
+ ColumnView.get_default().getHeader().setRefreshButton(true);
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().syncFinished.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: syncFinished");
+ ColumnView.get_default().syncFinished();
+ MainWindow.get_default().showContent(Gtk.StackTransitionType.SLIDE_LEFT, true);
+ ColumnView.get_default().getHeader().setRefreshButton(false);
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().springCleanStarted.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: springCleanStarted");
+ MainWindow.get_default().showSpringClean();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().springCleanFinished.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: springCleanFinished");
+ MainWindow.get_default().showContent();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().showArticleListOverlay.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: showArticleListOverlay");
+ ColumnView.get_default().showArticleListOverlay();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().setOffline.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: setOffline");
+ if(FeedReaderApp.get_default().isOnline())
+ {
+ FeedReaderApp.get_default().setOnline(false);
+ ColumnView.get_default().setOffline();
+ }
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().setOnline.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: setOnline");
+ if(!FeedReaderApp.get_default().isOnline())
+ {
+ FeedReaderApp.get_default().setOnline(true);
+ ColumnView.get_default().setOnline();
+ }
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().feedAdded.connect((error, errmsg) => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: feedAdded");
+ ColumnView.get_default().footerSetReady();
+ if(error)
+ ColumnView.get_default().footerShowError(errmsg);
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().opmlImported.connect(() => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: opmlImported");
+ ColumnView.get_default().footerSetReady();
+ ColumnView.get_default().newFeedList();
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().updateSyncProgress.connect((progress) => {
+ GLib.Idle.add(() => {
+ Logger.debug("FeedReader: updateSyncProgress");
+ ColumnView.get_default().getHeader().updateSyncProgress(progress);
+ return GLib.Source.REMOVE;
+ });
+ });
+
+ FeedReaderBackend.get_default().updateBadge();
+ FeedReaderBackend.get_default().checkOnlineAsync.begin();
}
m_window.show_all();
m_window.present();
-
- try
- {
- DBusConnection.connectSignals();
- DBusConnection.get_default().updateBadge();
- DBusConnection.get_default().checkOnlineAsync();
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedReader.activate: %s".printf(e.message));
- }
}
public override int command_line(ApplicationCommandLine command_line)
@@ -107,14 +220,7 @@ namespace FeedReader {
{
SourceFunc callback = sync.callback;
ThreadFunc<void*> run = () => {
- try
- {
- DBusConnection.get_default().startSync();
- }
- catch(IOError e)
- {
- Logger.error("FeedReader.sync: " + e.message);
- }
+ FeedReaderBackend.get_default().startSync();
Idle.add((owned) callback);
return null;
};
@@ -123,88 +229,51 @@ namespace FeedReader {
yield;
}
- private FeedReaderApp()
+ public void cancelSync()
{
- GLib.Object(application_id: "org.gnome.FeedReader", flags: ApplicationFlags.HANDLES_COMMAND_LINE);
- }
- }
-
-
- public static int main (string[] args)
- {
- try
- {
- var opt_context = new OptionContext();
- opt_context.set_help_enabled(true);
- opt_context.add_main_entries(options, null);
- opt_context.parse(ref args);
- }
- catch(OptionError e)
- {
- print(e.message + "\n");
- return 0;
+ FeedReaderBackend.get_default().cancelSync();
}
- if(version)
+ private FeedReaderApp()
{
- stdout.printf("Version: %s\n", AboutInfo.version);
- stdout.printf("Git Commit: %s\n", Constants.GIT_SHA1);
- return 0;
+ GLib.Object(application_id: "org.gnome.FeedReader", flags: ApplicationFlags.HANDLES_COMMAND_LINE);
}
- if(about)
+ private void SetupActions()
{
- show_about(args);
- return 0;
- }
+ var quit_action = new SimpleAction("quit", null);
+ quit_action.activate.connect(() => {
- if(media != null)
- {
- UtilsUI.playMedia(args, media);
- return 0;
- }
+ MainWindow.get_default().writeInterfaceState(true);
+ m_window.close();
- if(pingURL != null)
- {
- Logger.init("ui");
- if(!Utils.ping(pingURL))
- Logger.error("Ping failed");
- return 0;
- }
+ if(Settings.state().get_boolean("currently-updating"))
+ {
+ Logger.debug("Quit: FeedReader seems to be syncing -> trying to cancel");
+ FeedReaderBackend.get_default().cancelSync();
+ while(Settings.state().get_boolean("currently-updating"))
+ {
+ Gtk.main_iteration();
+ }
+
+ Logger.debug("Quit: Sync cancelled -> shutting down");
+ }
+ else
+ {
+ Logger.debug("No Sync ongoing -> Quit right away");
+ }
- try
- {
- Gst.init_check(ref args);
+ FeedReaderApp.get_default().quit();
+ });
+ this.add_action(quit_action);
}
- catch(GLib.Error e)
- {
- Logger.error("Gst.init: " + e.message);
- }
-
- var app = FeedReaderApp.get_default();
- app.run(args);
-
- return 0;
}
- private const GLib.OptionEntry[] options = {
- { "version", 0, 0, OptionArg.NONE, ref version, "FeedReader version number", null },
- { "about", 0, 0, OptionArg.NONE, ref about, "spawn about dialog", null },
- { "playMedia", 0, 0, OptionArg.STRING, ref media, "start media player with URL", "URL" },
- { "ping", 0, 0, OptionArg.STRING, ref pingURL, "test the ping function with given URL", "URL" },
- { null }
- };
-
- private static bool version = false;
- private static bool about = false;
- private static string? media = null;
- private static string? pingURL = null;
-
- static void show_about(string[] args)
+ public static void show_about(string[] args)
{
Gtk.init(ref args);
- Gtk.AboutDialog dialog = new Gtk.AboutDialog();
- dialog.response.connect ((response_id) => {
+ Gtk.AboutDialog dialog = new Gtk.AboutDialog();
+ dialog.response.connect ((response_id) => {
if(response_id == Gtk.ResponseType.CANCEL || response_id == Gtk.ResponseType.DELETE_EVENT)
Gtk.main_quit();
});
diff --git a/src/FeedReaderMain.vala b/src/FeedReaderMain.vala
new file mode 100644
index 00000000..a86567f5
--- /dev/null
+++ b/src/FeedReaderMain.vala
@@ -0,0 +1,122 @@
+
+
+namespace FeedReader.Main {
+ private const GLib.OptionEntry[] options = {
+ { "version", 0, 0, OptionArg.NONE, ref version, "FeedReader version number", null },
+ { "about", 0, 0, OptionArg.NONE, ref about, "spawn about dialog", null },
+ { "verbose", 0, 0, OptionArg.NONE, ref verbose, "Spit out all the debug information", null },
+ { "playMedia", 0, 0, OptionArg.STRING, ref media, "start media player with URL", "URL" },
+ { "ping", 0, 0, OptionArg.STRING, ref pingURL, "test the ping function with given URL", "URL" },
+ { "addFeed", 0, 0, OptionArg.STRING, ref feedURL, "add the feed to the collection", "URL" },
+ { "grabArticle", 0, 0, OptionArg.STRING, ref grabArticle, "use the ContentGrabber to grab the given URL", "URL" },
+ { "grabImages", 0, 0, OptionArg.STRING, ref grabImages, "download all images of the html-document", "PATH" },
+ { "url", 0, 0, OptionArg.STRING, ref articleUrl, "url of the article needed to do grabImages", "URL" },
+ { "unreadCount", 0, 0, OptionArg.NONE, ref unreadCount, "current count of unread articles in the database", null },
+ { null }
+ };
+
+ private static bool version = false;
+ private static bool about = false;
+ private static bool verbose = false;
+ private static string? media = null;
+ private static string? pingURL = null;
+ private static string? feedURL = null;
+ private static string? grabArticle = null;
+ private static string? grabImages = null;
+ private static string? articleUrl = null;
+ private static bool unreadCount = false;
+
+ public static int main (string[] args)
+ {
+ Ivy.Stacktrace.register_handlers();
+ GLib.Intl.textdomain ("FeedReader");
+
+ try
+ {
+ var opt_context = new OptionContext();
+ opt_context.set_help_enabled(true);
+ opt_context.add_main_entries(options, null);
+ opt_context.parse(ref args);
+ }
+ catch(OptionError e)
+ {
+ print(e.message + "\n");
+ return 0;
+ }
+
+ FeedReaderApp.m_verbose = verbose;
+
+ if(version)
+ {
+ stdout.printf("Version: %s\n", AboutInfo.version);
+ stdout.printf("Git Commit: %s\n", Constants.GIT_SHA1);
+ return 0;
+ }
+
+ if(about)
+ {
+ FeedReader.show_about(args);
+ return 0;
+ }
+
+ if(media != null)
+ {
+ Utils.playMedia(args, media);
+ return 0;
+ }
+
+ if(pingURL != null)
+ {
+ Logger.init(verbose);
+ if(!Utils.ping(pingURL))
+ Logger.error("Ping failed");
+ return 0;
+ }
+
+ if(feedURL != null)
+ {
+ Logger.init(verbose);
+ Logger.debug(@"Adding feed $feedURL");
+ FeedReaderBackend.get_default().addFeed(feedURL, "", false, true);
+ return 0;
+ }
+
+ if(grabImages != null && articleUrl != null)
+ {
+ Logger.init(verbose);
+ FeedServer.grabImages(grabImages, articleUrl);
+ return 0;
+ }
+
+ if(grabArticle != null)
+ {
+ Logger.init(verbose);
+ FeedServer.grabArticle(grabArticle);
+ return 0;
+ }
+
+ if(unreadCount)
+ {
+ var old_stdout =(owned)stdout;
+ stdout = FileStream.open("/dev/null", "w");
+ Logger.init(verbose);
+ stdout =(owned)old_stdout;
+ stdout.printf("%u\n", DataBase.readOnly().get_unread_total());
+ return 0;
+ }
+
+ try
+ {
+ Gst.init_check(ref args);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Gst.init: " + e.message);
+ }
+
+ var app = FeedReaderApp.get_default();
+ app.run(args);
+
+ return 0;
+ }
+}
diff --git a/src/FuncUtils.vala b/src/FuncUtils.vala
new file mode 100644
index 00000000..cd92e221
--- /dev/null
+++ b/src/FuncUtils.vala
@@ -0,0 +1,28 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.FuncUtils : GLib.Object {
+ public delegate B MapFunction<A, B>(A value);
+
+ public static Gee.List<B> map<A, B>(Gee.Collection<A> items, MapFunction<A, B> f)
+ {
+ var result = new Gee.ArrayList<B>();
+ foreach(var item in items)
+ {
+ result.add(f(item));
+ }
+ return result;
+ }
+}
diff --git a/src/ListUtils.vala b/src/ListUtils.vala
new file mode 100644
index 00000000..6e5a5bd2
--- /dev/null
+++ b/src/ListUtils.vala
@@ -0,0 +1,23 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.ListUtils {
+ public static Gee.List<T> single<T>(T v)
+ {
+ var res = new Gee.ArrayList<T>();
+ res.add(v);
+ return res;
+ }
+}
diff --git a/src/Logger.vala b/src/Logger.vala
index a84e7e03..2b62c517 100644
--- a/src/Logger.vala
+++ b/src/Logger.vala
@@ -14,196 +14,39 @@
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
public class FeedReader.Logger : GLib.Object {
+ const string LOG_DOMAIN = "feedreader";
- private int m_LogLevel;
- private GLib.FileOutputStream m_stream;
- private Gee.LinkedList<string> m_pendingWrites;
+ private static bool m_log_debug_information = false;
- private static Logger? m_logger = null;
- private static string? m_fileName = null;
-
- public static void init(string filename)
+ private static void log(LogLevelFlags level, string message)
{
- m_fileName = filename;
- }
-
- private static Logger get_default()
- {
- string name = "uninitialized";
-
- if(m_fileName != null)
- name = m_fileName;
-
- if(m_logger == null)
- m_logger = new Logger(name);
-
- return m_logger;
+ GLib.log_structured(LOG_DOMAIN, level, "MESSAGE", "%s", message);
}
public static void error(string message)
{
- get_default().print(LogMessage.ERROR, message);
+ log(GLib.LogLevelFlags.LEVEL_CRITICAL, message);
}
public static void warning(string message)
{
- get_default().print(LogMessage.WARNING, message);
+ log(GLib.LogLevelFlags.LEVEL_WARNING, message);
}
public static void info(string message)
{
- get_default().print(LogMessage.INFO, message);
+ log(GLib.LogLevelFlags.LEVEL_INFO, message);
}
public static void debug(string message)
{
- get_default().print(LogMessage.DEBUG, message);
- }
-
-
- private Logger(string filename)
- {
- m_pendingWrites = new Gee.LinkedList<string>();
- var logLevel = Settings.general().get_enum("log-level");
- m_LogLevel = LogLevel.DEBUG;
-
- string directory = GLib.Path.build_filename(GLib.Environment.get_user_data_dir(), "feedreader");
- string path = "%s/%s.log".printf(directory, filename);
- try {
- GLib.File.new_for_path(directory).make_directory_with_parents();
- }
- catch {}
-
- if(FileUtils.test(path, GLib.FileTest.EXISTS))
- GLib.FileUtils.remove(path);
-
- var file = GLib.File.new_for_path(path);
- try
- {
- m_stream = file.create(FileCreateFlags.NONE);
- }
- catch(GLib.Error e)
- {
- stderr.printf("error creating log-file: %s\n", e.message);
- }
-
-
- switch(logLevel)
- {
- case LogLevel.OFF:
- print(LogMessage.INFO, "Logs are deactivated!");
- break;
-
- case LogLevel.ERROR:
- print(LogMessage.INFO, "Only critical Errors are logged!");
- break;
-
- case LogLevel.MORE:
- print(LogMessage.INFO, "Errors and some general information is logged!");
- break;
-
- case LogLevel.DEBUG:
- print(LogMessage.INFO, "Everything is logged. Used to debug!");
- break;
- }
-
- m_LogLevel = logLevel;
- }
-
- private void print(LogMessage level, string message)
- {
- switch(m_LogLevel)
- {
- case LogLevel.OFF:
- return;
-
- case LogLevel.ERROR:
- if(level != LogMessage.ERROR)
- return;
- break;
-
- case LogLevel.MORE:
- if(level > LogMessage.INFO)
- return;
- break;
-
- case LogLevel.DEBUG:
- break;
- }
-
- switch(level)
- {
- case LogMessage.ERROR:
- set_color(ConsoleColor.RED);
- stdout.printf("[ ERROR ] ");
- write(@"[ ERROR ] $message\n");
- break;
-
- case LogMessage.WARNING:
- set_color(ConsoleColor.YELLOW);
- stdout.printf("[WARNING] ");
- write(@"[WARNING] $message\n");
- break;
-
- case LogMessage.INFO:
- set_color(ConsoleColor.GREEN);
- stdout.printf("[ INFO ] ");
- write(@"[ INFO ] $message\n");
- break;
-
- case LogMessage.DEBUG:
- set_color(ConsoleColor.BLUE);
- stdout.printf("[ DEBUG ] ");
- write(@"[ DEBUG ] $message\n");
- break;
- }
-
- reset_color();
- stdout.printf("%s\n", message);
+ if(m_log_debug_information)
+ log(GLib.LogLevelFlags.LEVEL_DEBUG, message);
}
- private void reset_color()
+ public static void init(bool verbose)
{
- stdout.printf("\x001b[0m");
+ m_log_debug_information = verbose;
+ GLib.Log.set_writer_func((LogWriterFunc)GLib.Log.writer_standard_streams);
}
-
- private void set_color(ConsoleColor color)
- {
- var color_code = color + 30 + 60;
- stdout.printf("\x001b[%dm", color_code);
- }
-
- private void write(string text)
- {
-
- if(m_stream.has_pending())
- {
- m_pendingWrites.add(text);
- }
- else
- {
- m_stream.write_async.begin(text.data, GLib.Priority.DEFAULT, null, (obj, res) => {
-
- try
- {
- m_stream.write_async.end(res);
- }
- catch(GLib.Error e)
- {
- stderr.printf("[ ERROR ] error writing log to file: %s\n", e.message);
- stderr.printf("[ ERROR ] %s\n", text);
- reset_color();
- }
-
- if(m_pendingWrites.size > 0)
- {
- string item = m_pendingWrites.first();
- m_pendingWrites.remove(item);
- write(item);
- }
- });
- }
-
- }
-
}
diff --git a/src/LoginInterface.vala b/src/LoginInterface.vala
deleted file mode 100644
index 183d0a15..00000000
--- a/src/LoginInterface.vala
+++ /dev/null
@@ -1,46 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General public License for more details.
-//
-// You should have received a copy of the GNU General public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public interface FeedReader.LoginInterface : GLib.Object {
-
- public signal void login();
-
- public abstract void init();
-
- public abstract string getWebsite();
-
- public abstract BackendFlags getFlags();
-
- public abstract string getID();
-
- public abstract Gtk.Box? getWidget();
-
- public abstract string iconName();
-
- public abstract string serviceName();
-
- public abstract bool needWebLogin();
-
- public abstract void showHtAccess();
-
- public abstract void writeData();
-
- public abstract async void postLoginAction();
-
- public abstract bool extractCode(string redirectURL);
-
- public abstract string buildLoginURL();
-
-}
diff --git a/src/Model/Article.vala b/src/Model/Article.vala
index 50012a7d..727356ce 100644
--- a/src/Model/Article.vala
+++ b/src/Model/Article.vala
@@ -13,7 +13,7 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.article : GLib.Object {
+public class FeedReader.Article : GLib.Object {
private string m_articleID;
private string m_title;
@@ -21,8 +21,8 @@ public class FeedReader.article : GLib.Object {
private string m_html;
private string m_preview;
private string m_feedID;
- private Gee.ArrayList<string> m_tags;
- private Gee.ArrayList<string> m_media;
+ private Gee.List<string> m_tags;
+ private Gee.List<Enclosure> m_enclosures;
private string? m_author;
private ArticleStatus m_unread;
private ArticleStatus m_marked;
@@ -30,54 +30,59 @@ public class FeedReader.article : GLib.Object {
private GLib.DateTime m_date;
private string m_guidHash;
private int m_lastModified;
+ private int m_pos;
+ private static GLib.Settings? m_gnome_settings;
+ private static bool m_clock_12_hour = false;
+ static construct
+ {
+ // Lookup the schema in a complicated way so we don't require users
+ // to be running GNOME Shell
+ var schema_source = SettingsSchemaSource.get_default();
+ var schema = schema_source.lookup("org.gnome.desktop.interface", true);
+ if(schema != null)
+ {
+ m_gnome_settings = new GLib.Settings.full(schema, null, null);
+ m_clock_12_hour = m_gnome_settings.get_string("clock-format") == "12h";
+ m_gnome_settings.changed["clock-format"].connect(() => {
+ m_clock_12_hour = m_gnome_settings.get_string("clock-format") == "12h";
+ });
+ }
+ }
- public article ( string articleID,
- string title,
- string url,
- string feedID,
- ArticleStatus unread,
- ArticleStatus marked,
- string html,
- string preview,
- string? author,
- GLib.DateTime date,
- int sortID,
- string tags,
- string media,
- string guidHash = "",
- int lastModified = 0)
+ public Article (string articleID,
+ string? title,
+ string? url,
+ string? feedID,
+ ArticleStatus unread,
+ ArticleStatus marked,
+ string? html,
+ string? preview,
+ string? author,
+ GLib.DateTime? date,
+ int sortID = 0,
+ Gee.List<string>? tags = null,
+ Gee.List<Enclosure>? enclosures = null,
+ string guidHash = "",
+ int lastModified = 0)
{
m_articleID = articleID;
- m_title = title;
- m_url = url;
- m_html = html;
- m_preview = preview;
- m_feedID = feedID;
- m_author = author;
+ m_title = title != null ? title : "";
+ m_url = url != null ? url : "";
+ m_html = html != null ? html : "";
+ m_preview = preview != null ? preview : "";
+ m_feedID = feedID != null ? feedID : "";
+ m_author = author != "" ? author : null; // This one is actually nullable
m_unread = unread;
m_marked = marked;
m_sortID = sortID;
- m_date = date;
+ m_date = date != null ? date : new DateTime.now_utc();
m_guidHash = guidHash;
m_lastModified = lastModified;
- m_tags = new Gee.ArrayList<string>();
- var tagArray = tags.split(",");
- foreach(string tag in tagArray)
- {
- if(tag.strip() != "")
- m_tags.add(tag);
- }
-
- m_media = new Gee.ArrayList<string>();
- var mediaArray = media.split(",");
- foreach(string m in mediaArray)
- {
- if(m.strip() != "")
- m_media.add(m);
- }
+ m_tags = tags == null ? Gee.List.empty<string>() : tags;
+ m_enclosures = enclosures == null ? Gee.List.empty<Enclosure>() : enclosures;
}
public string getArticleID()
@@ -85,6 +90,16 @@ public class FeedReader.article : GLib.Object {
return m_articleID;
}
+ public string getArticleFileName()
+ {
+ return GLib.Base64.encode(m_articleID.data);
+ }
+
+ public string getFeedFileName()
+ {
+ return GLib.Base64.encode(m_articleID.data);
+ }
+
public string getTitle()
{
return m_title;
@@ -130,6 +145,11 @@ public class FeedReader.article : GLib.Object {
return m_url;
}
+ public void setURL(string url)
+ {
+ m_url = url;
+ }
+
public int getSortID()
{
return m_sortID;
@@ -140,37 +160,56 @@ public class FeedReader.article : GLib.Object {
return m_date;
}
- public string getDateStr()
+ public void SetDate(GLib.DateTime date)
{
- return m_date.format("%Y-%m-%d %H:%M:%S");
+ m_date = date;
}
- public string getDateNice()
+ public string getDateNice(bool addTime = false)
{
var now = new GLib.DateTime.now_local();
var now_year = now.get_year();
var now_day = now.get_day_of_year();
+ var now_week = now.get_week_of_year();
var date_year = m_date.get_year();
var date_day = m_date.get_day_of_year();
+ var date_week = m_date.get_week_of_year();
- if(date_year == 1900)
- {
- //return _("no date available");
- }
- else if(date_year == now_year)
+ var formats = new Gee.ArrayList<string>();
+ if(date_year == now_year)
{
if(date_day == now_day)
{
- return _("Today") + m_date.format(" %H:%M");
+ addTime = true;
+ }
+ else if(date_day == now_day -1)
+ {
+ formats.add(_("Yesterday").replace("%", "%%"));
+ addTime = true;
}
- else if(date_day == now_day-1)
+ else if(date_week == now_week)
{
- return _("Yesterday") + m_date.format(" %H:%M");
+ formats.add("%A");
+ }
+ else
+ {
+ formats.add("%B %d");
}
}
+ else
+ formats.add("%Y-%m-%d");
- return m_date.format("%d.%m.%Y %H:%M");
+ if(addTime)
+ {
+ if(m_clock_12_hour)
+ formats.add("%l:%M %p");
+ else
+ formats.add("%H:%M");
+ }
+
+ string format = StringUtils.join(formats, ", ");
+ return m_date.format(format);
}
public string getFeedID()
@@ -198,62 +237,54 @@ public class FeedReader.article : GLib.Object {
m_marked = marked;
}
- public unowned Gee.ArrayList<string> getTags()
+ public unowned Gee.List<string> getTagIDs()
{
return m_tags;
}
- public string getTagString()
- {
- string tags = "";
- foreach(string tag in m_tags)
- {
- tags += tag + ",";
- }
- return tags;
- }
-
- public void setTags(Gee.ArrayList<string> tags)
+ public void setTags(Gee.List<string> tags)
{
m_tags = tags;
}
- public void addTag(string tag)
+ public void addTag(string tagID)
{
- if(!m_tags.contains(tag))
- m_tags.add(tag);
+ if(!m_tags.contains(tagID))
+ m_tags.add(tagID);
}
- public unowned Gee.ArrayList<string> getMedia()
+ public void removeTag(string tagID)
{
- return m_media;
+ if(m_tags.contains(tagID))
+ m_tags.remove(tagID);
}
- public string getMediaString()
+ public unowned Gee.List<Enclosure> getEnclosures()
{
- string media = "";
- foreach(string m in m_media)
- {
- media += m + ",";
- }
- return media;
+ return m_enclosures;
}
- public void setMedia(Gee.ArrayList<string> media)
+ public void setImages(Gee.List<Enclosure> enclosures)
{
- m_media = media;
+ m_enclosures = enclosures;
}
- public void addMedia(string m)
+ public void addEnclosure(Enclosure enc)
{
- if(!m_media.contains(m))
- m_media.add(m);
+ if(!m_enclosures.contains(enc))
+ m_enclosures.add(enc);
}
public bool haveMedia()
{
- if(m_media.size > 0)
- return true;
+ foreach(Enclosure enc in m_enclosures)
+ {
+ if(enc.get_enclosure_type() == EnclosureType.VIDEO
+ || enc.get_enclosure_type() == EnclosureType.AUDIO)
+ {
+ return true;
+ }
+ }
return false;
}
@@ -267,4 +298,14 @@ public class FeedReader.article : GLib.Object {
{
return m_lastModified;
}
+
+ public int getPos()
+ {
+ return m_pos;
+ }
+
+ public void setPos(int pos)
+ {
+ m_pos = pos;
+ }
}
diff --git a/src/Model/Category.vala b/src/Model/Category.vala
index 9ee2b6a2..dcb794f9 100644
--- a/src/Model/Category.vala
+++ b/src/Model/Category.vala
@@ -13,7 +13,7 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.category : GLib.Object {
+public class FeedReader.Category : GLib.Object {
private string m_categorieID;
private string m_title;
@@ -22,7 +22,7 @@ public class FeedReader.category : GLib.Object {
private string m_parent;
private int m_level;
- public category (string categorieID, string title, uint unread_count, int orderID, string parent, int level) {
+ public Category (string categorieID, string title, uint unread_count, int orderID, string parent, int level) {
m_categorieID = categorieID;
m_title = title;
m_unread_count = unread_count;
@@ -36,6 +36,11 @@ public class FeedReader.category : GLib.Object {
return m_categorieID;
}
+ public string getFileName()
+ {
+ return GLib.Base64.encode(m_categorieID.data);
+ }
+
public string getTitle()
{
return m_title;
diff --git a/src/Model/Enclosure.vala b/src/Model/Enclosure.vala
new file mode 100644
index 00000000..3506cb8c
--- /dev/null
+++ b/src/Model/Enclosure.vala
@@ -0,0 +1,38 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.Enclosure : GLib.Object {
+
+ private string m_article_id;
+ private string m_url;
+ private EnclosureType m_type;
+
+ public Enclosure(string article_id, string url, EnclosureType type)
+ {
+ m_article_id = article_id;
+ m_url = url;
+ m_type = type;
+ }
+
+ public string get_url()
+ {
+ return m_url;
+ }
+
+ public EnclosureType get_enclosure_type()
+ {
+ return m_type;
+ }
+}
diff --git a/src/Model/Feed.vala b/src/Model/Feed.vala
index 009f8b44..ab4838e5 100644
--- a/src/Model/Feed.vala
+++ b/src/Model/Feed.vala
@@ -13,24 +13,24 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.feed : GLib.Object {
+public class FeedReader.Feed : GLib.Object {
private string m_feedID;
private string m_title;
private string m_url;
private string? m_xmlURL;
- private bool m_hasIcon;
private uint m_unread;
- private string[] m_catIDs;
+ private Gee.List<string> m_catIDs;
+ private string? m_iconURL;
- public feed(string feedID, string title, string url, bool hasIcon, uint unread, string[] catIDs, string? xmlURL = null)
+ public Feed(string feedID, string? title, string? url, uint unread, Gee.List<string>? catIDs = null, string? iconURL = null, string? xmlURL = null)
{
m_feedID = feedID;
- m_title = title;
- m_url = url;
+ m_url = url != null ? url : "";
+ m_title = title != null ? Utils.UTF8fix(title) : Utils.URLtoFeedName(url);
m_unread = unread;
- m_catIDs = catIDs;
- m_hasIcon = hasIcon;
+ m_catIDs = catIDs == null ? Gee.List.empty<string>() : catIDs;
+ m_iconURL = iconURL == "" ? null : iconURL;
m_xmlURL = xmlURL;
}
@@ -39,6 +39,11 @@ public class FeedReader.feed : GLib.Object {
return m_feedID;
}
+ public string getFeedFileName()
+ {
+ return GLib.Base64.encode(m_feedID.data);
+ }
+
public string getTitle()
{
return m_title;
@@ -54,9 +59,9 @@ public class FeedReader.feed : GLib.Object {
return m_url;
}
- public bool hasIcon()
+ public void setURL(string url)
{
- return m_hasIcon;
+ m_url = url;
}
public uint getUnread()
@@ -64,55 +69,66 @@ public class FeedReader.feed : GLib.Object {
return m_unread;
}
- public string[] getCatIDs()
+ public void setUnread(uint unread)
+ {
+ m_unread = unread;
+ }
+
+ public Gee.List<string> getCatIDs()
{
return m_catIDs;
}
public string getCatString()
{
- string catIDs = "";
- foreach(string id in m_catIDs)
- {
- catIDs += id + ",";
- }
-
- return catIDs;
+ return StringUtils.join(m_catIDs, ",");
}
public bool hasCat(string catID)
{
- foreach(string cat in m_catIDs)
- {
- if(cat == catID)
- return true;
- }
-
- return false;
+ return m_catIDs.contains(catID);
}
public void addCat(string catID)
{
- m_catIDs += catID;
+ m_catIDs.add(catID);
+ }
+
+ public void setCats(Gee.Collection<string> catIDs)
+ {
+ m_catIDs.clear();
+ m_catIDs.add_all(catIDs);
}
- public void setCats(string[] catIDs)
+ // Helper function for backends that only support one category per feed
+ public void setCategory(string id)
{
- m_catIDs = catIDs;
+ m_catIDs.clear();
+ m_catIDs.add(id);
}
public bool isUncategorized()
{
- if(m_catIDs.length == 0)
+ if(m_catIDs.size == 0)
return true;
- if(m_catIDs.length == 1 && m_catIDs[0].contains("global.must"))
+ if(m_catIDs.size == 1 && m_catIDs[0].contains("global.must"))
return true;
return false;
}
- public string getXmlUrl()
+ public string? getIconURL()
+ {
+ return m_iconURL;
+ }
+
+ public void setIconURL(string? url)
+ {
+ m_iconURL = url;
+ }
+
+ public string? getXmlUrl()
{
return m_xmlURL;
}
diff --git a/src/Model/InterfaceState.vala b/src/Model/InterfaceState.vala
index 9a6f8b6b..9a523bc6 100644
--- a/src/Model/InterfaceState.vala
+++ b/src/Model/InterfaceState.vala
@@ -15,191 +15,196 @@
public class FeedReader.InterfaceState : GLib.Object {
- private int m_WindowHeight = 900;
- private int m_WindowWidth = 1600;
- private int m_FeedsAndArticleWidth = 600;
- private int m_FeedListWidth = 200;
- private int m_ArticleListRowOffset = 15;
- private int m_ArticleListNewRowCount = 0;
- private int m_ArticleViewScrollPos = 0;
- private bool m_WindowMaximized = false;
- private double m_ArticleListScrollPos = 0.0;
- private double m_FeedListScrollPos = 0.0;
- private string m_SearchTerm = "";
- private string m_FeedListSelectedRow = "feed -4";
- private string m_ArticleListSelectedRow = "0";
- private string[] m_ExpandedCategories = {};
- private ArticleListState m_ArticleListState = ArticleListState.ALL;
-
- public InterfaceState()
- {
-
- }
-
- public void write()
- {
- Settings.state().set_int ("window-width", m_WindowWidth);
- Settings.state().set_int ("window-height", m_WindowHeight);
- Settings.state().set_boolean ("window-maximized", m_WindowMaximized);
- Settings.state().set_strv ("expanded-categories", m_ExpandedCategories);
- Settings.state().set_double ("feed-row-scrollpos", m_FeedListScrollPos);
- Settings.state().set_string ("feedlist-selected-row", m_FeedListSelectedRow);
- Settings.state().set_int ("feed-row-width", m_FeedListWidth);
- Settings.state().set_int ("feeds-and-articles-width", m_FeedsAndArticleWidth);
- Settings.state().set_int ("articlelist-row-offset", m_ArticleListRowOffset);
- Settings.state().set_double ("articlelist-scrollpos", m_ArticleListScrollPos);
- Settings.state().set_string ("articlelist-selected-row", m_ArticleListSelectedRow);
- Settings.state().set_enum ("show-articles", m_ArticleListState);
- Settings.state().set_string ("search-term", m_SearchTerm);
- Settings.state().set_int ("articleview-scrollpos", m_ArticleViewScrollPos);
- Settings.state().set_int ("articlelist-new-rows", m_ArticleListNewRowCount);
- Settings.state().set_boolean ("no-animations", true);
- }
-
- public void setWindowSize(int height, int width)
- {
- m_WindowHeight = height;
- m_WindowWidth = width;
- }
-
- public int getWindowHeight()
- {
- return m_WindowHeight;
- }
-
- public int getWindowWidth()
- {
- return m_WindowWidth;
- }
-
- public void setFeedsAndArticleWidth(int size)
- {
- m_FeedsAndArticleWidth = size;
- }
-
- public int getFeedsAndArticleWidth()
- {
- return m_FeedsAndArticleWidth;
- }
-
- public void setFeedListWidth(int size)
- {
- m_FeedListWidth = size;
- }
-
- public int getFeedListWidth()
- {
- return m_FeedListWidth;
- }
-
- public void setFeedListScrollPos(double pos)
- {
- m_FeedListScrollPos = pos;
- }
-
- public double getFeedListScrollPos()
- {
- return m_FeedListScrollPos;
- }
-
- public void setArticleViewScrollPos(int pos)
- {
- m_ArticleViewScrollPos = pos;
- }
-
- public int getArticleViewScrollPos()
- {
- return m_ArticleViewScrollPos;
- }
-
- public void setArticleListScrollPos(double pos)
- {
- m_ArticleListScrollPos = pos;
- }
-
- public double getArticleListScrollPos()
- {
- return m_ArticleListScrollPos;
- }
-
- public void setArticleListRowOffset(int count)
- {
- m_ArticleListRowOffset = count;
- }
-
- public int getArticleListRowOffset()
- {
- return m_ArticleListRowOffset;
- }
-
- public void setArticleListSelectedRow(string articleID)
- {
- m_ArticleListSelectedRow = articleID;
- }
-
- public string getArticleListSelectedRow()
- {
- return m_ArticleListSelectedRow;
- }
-
- public void setArticleListNewRowCount(int count)
- {
- m_ArticleListNewRowCount = count;
- }
-
- public int getArticleListNewRowCount()
- {
- return m_ArticleListNewRowCount;
- }
-
- public void setWindowMaximized(bool max)
- {
- m_WindowMaximized = max;
- }
-
- public bool getWindowMaximized()
- {
- return m_WindowMaximized;
- }
-
- public void setSearchTerm(string search)
- {
- m_SearchTerm = search;
- }
-
- public string getSearchTerm()
- {
- return m_SearchTerm;
- }
-
- public void setFeedListSelectedRow(string code)
- {
- m_FeedListSelectedRow = code;
- }
-
- public string getFeedListSelectedRow()
- {
- return m_FeedListSelectedRow;
- }
-
- public void setExpandedCategories(string[] array)
- {
- m_ExpandedCategories = array;
- }
-
- public string[] getExpandedCategories()
- {
- return m_ExpandedCategories;
- }
-
- public void setArticleListState(ArticleListState state)
- {
- m_ArticleListState = state;
- }
-
- public ArticleListState getArticleListState()
- {
- return m_ArticleListState;
- }
+ private int m_WindowHeight = 900;
+ private int m_WindowWidth = 1600;
+ private int m_FeedsAndArticleWidth = 600;
+ private int m_FeedListWidth = 200;
+ private int m_ArticleListRowOffset = 15;
+ private int m_ArticleViewScrollPos = 0;
+ private bool m_WindowMaximized = false;
+ private double m_ArticleListScrollPos = 0.0;
+ private double m_FeedListScrollPos = 0.0;
+ private string m_SearchTerm = "";
+ private string m_FeedListSelectedRow = "feed -4";
+ private string m_ArticleListSelectedRow = "0";
+ private string? m_ArticleListTopRow = null;
+ private string[] m_ExpandedCategories = {};
+ private ArticleListState m_ArticleListState = ArticleListState.ALL;
+
+ public InterfaceState()
+ {
+
+ }
+
+ public void write(bool shutdown)
+ {
+ Settings.state().set_int ("window-width", m_WindowWidth);
+ Settings.state().set_int ("window-height", m_WindowHeight);
+ Settings.state().set_boolean ("window-maximized", m_WindowMaximized);
+ Settings.state().set_strv ("expanded-categories", m_ExpandedCategories);
+ Settings.state().set_double ("feed-row-scrollpos", m_FeedListScrollPos);
+ Settings.state().set_string ("feedlist-selected-row", m_FeedListSelectedRow);
+ Settings.state().set_int ("feed-row-width", m_FeedListWidth);
+ Settings.state().set_int ("feeds-and-articles-width", m_FeedsAndArticleWidth);
+ Settings.state().set_double ("articlelist-scrollpos", m_ArticleListScrollPos);
+ Settings.state().set_string ("articlelist-selected-row", m_ArticleListSelectedRow);
+ Settings.state().set_string ("articlelist-top-row", m_ArticleListTopRow == null ? "" : m_ArticleListTopRow);
+ Settings.state().set_enum ("show-articles", m_ArticleListState);
+ Settings.state().set_string ("search-term", m_SearchTerm);
+ Settings.state().set_int ("articleview-scrollpos", m_ArticleViewScrollPos);
+ if(shutdown)
+ {
+ Settings.state().set_int ("articlelist-row-offset", m_ArticleListRowOffset);
+ }
+ }
+
+ public void setWindowSize(int height, int width)
+ {
+ m_WindowHeight = height;
+ m_WindowWidth = width;
+ }
+
+ public int getWindowHeight()
+ {
+ return m_WindowHeight;
+ }
+
+ public int getWindowWidth()
+ {
+ return m_WindowWidth;
+ }
+
+ public void setFeedsAndArticleWidth(int size)
+ {
+ m_FeedsAndArticleWidth = size;
+ }
+
+ public int getFeedsAndArticleWidth()
+ {
+ return m_FeedsAndArticleWidth;
+ }
+
+ public void setFeedListWidth(int size)
+ {
+ m_FeedListWidth = size;
+ }
+
+ public int getFeedListWidth()
+ {
+ return m_FeedListWidth;
+ }
+
+ public void setFeedListScrollPos(double pos)
+ {
+ m_FeedListScrollPos = pos;
+ }
+
+ public double getFeedListScrollPos()
+ {
+ return m_FeedListScrollPos;
+ }
+
+ public void setArticleViewScrollPos(int pos)
+ {
+ m_ArticleViewScrollPos = pos;
+ }
+
+ public int getArticleViewScrollPos()
+ {
+ return m_ArticleViewScrollPos;
+ }
+
+ public void setArticleListScrollPos(double pos)
+ {
+ m_ArticleListScrollPos = pos;
+ }
+
+ public double getArticleListScrollPos()
+ {
+ return m_ArticleListScrollPos;
+ }
+
+ public void setArticleListRowOffset(int count)
+ {
+ m_ArticleListRowOffset = count;
+ }
+
+ public int getArticleListRowOffset()
+ {
+ return m_ArticleListRowOffset;
+ }
+
+ public void setArticleListSelectedRow(string articleID)
+ {
+ m_ArticleListSelectedRow = articleID;
+ }
+
+ public string getArticleListSelectedRow()
+ {
+ return m_ArticleListSelectedRow;
+ }
+
+ public void setArticleListTopRow(Article? article)
+ {
+ if(article == null)
+ m_ArticleListTopRow = null;
+ else
+ m_ArticleListTopRow = article.getArticleID();
+ }
+
+ public string getArticleListTopRow()
+ {
+ return m_ArticleListTopRow;
+ }
+
+ public void setWindowMaximized(bool max)
+ {
+ m_WindowMaximized = max;
+ }
+
+ public bool getWindowMaximized()
+ {
+ return m_WindowMaximized;
+ }
+
+ public void setSearchTerm(string search)
+ {
+ m_SearchTerm = search;
+ }
+
+ public string getSearchTerm()
+ {
+ return m_SearchTerm;
+ }
+
+ public void setFeedListSelectedRow(string code)
+ {
+ m_FeedListSelectedRow = code;
+ }
+
+ public string getFeedListSelectedRow()
+ {
+ return m_FeedListSelectedRow;
+ }
+
+ public void setExpandedCategories(string[] array)
+ {
+ m_ExpandedCategories = array;
+ }
+
+ public string[] getExpandedCategories()
+ {
+ return m_ExpandedCategories;
+ }
+
+ public void setArticleListState(ArticleListState state)
+ {
+ m_ArticleListState = state;
+ }
+
+ public ArticleListState getArticleListState()
+ {
+ return m_ArticleListState;
+ }
}
diff --git a/src/Model/Tag.vala b/src/Model/Tag.vala
index 014c2174..19f88656 100644
--- a/src/Model/Tag.vala
+++ b/src/Model/Tag.vala
@@ -13,13 +13,13 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.tag : GLib.Object {
+public class FeedReader.Tag : GLib.Object {
private string m_tagID;
private string m_title;
private int m_color;
- public tag (string tagID, string title, int color) {
+ public Tag (string tagID, string title, int color) {
m_tagID = tagID;
m_title = title;
m_color = color;
@@ -35,8 +35,18 @@ public class FeedReader.tag : GLib.Object {
return m_title;
}
+ public void setTitle(string title)
+ {
+ m_title = title;
+ }
+
public int getColor()
{
return m_color;
}
+
+ public void setColor(int color)
+ {
+ m_color = color;
+ }
}
diff --git a/src/Notification.vala b/src/Notification.vala
index 588e0e76..79890e3b 100644
--- a/src/Notification.vala
+++ b/src/Notification.vala
@@ -15,87 +15,25 @@
public class FeedReader.Notification : GLib.Object {
- private static bool m_notifyActionSupport = false;
- private static Notify.Notification m_notification;
-
- public static void init()
- {
- Notify.init(AboutInfo.programmName);
- GLib.List<string> notify_server_caps = Notify.get_server_caps();
- foreach(string str in notify_server_caps)
- {
- if(str == "actions")
- {
- m_notifyActionSupport = true;
- Logger.info("daemon: Notification actions supported");
- break;
- }
- }
- }
-
- public static bool supportAction()
+ public static void send(uint new_articles, int new_and_unread)
{
- return m_notifyActionSupport;
- }
+ string message = "";
+ string summary = _("New articles");
+ uint unread = DataBase.readOnly().get_unread_total();
- public static void send(uint newArticles)
- {
- try
+ if(new_articles > 0 && new_and_unread > 0)
{
- string message = "";
- string summary = _("New Articles");
- uint unread = dbDaemon.get_default().get_unread_total();
+ if(new_articles == 1)
+ message = _("There is 1 new article (%u unread)").printf(unread);
+ else
+ message = _("There are %u new articles (%u unread)").printf(new_articles, unread);
- if(!Notify.is_initted())
- {
- Logger.error("notification: libnotifiy not initialized");
- return;
- }
+ var notification = new GLib.Notification(summary);
+ notification.set_body(message);
+ notification.set_priority(GLib.NotificationPriority.NORMAL);
+ notification.set_icon(new GLib.ThemedIcon("org.gnome.FeedReader"));
- if(newArticles > 0)
- {
- if(unread == 1)
- message = _("There is 1 new article (%u unread)").printf(unread);
- else
- message = _("There are %u new articles (%u unread)").printf(newArticles, unread);
-
-
- if(m_notification == null)
- {
- m_notification = new Notify.Notification(summary, message, AboutInfo.iconName);
- m_notification.set_urgency(Notify.Urgency.NORMAL);
- m_notification.set_app_name(AboutInfo.programmName);
- m_notification.set_hint("desktop-entry", new Variant ("(s)", "feedreader"));
-
- if(Notification.supportAction())
- {
- m_notification.add_action ("default", "Show FeedReader", (notification, action) => {
- Logger.debug("notification: default action");
-
- try
- {
- m_notification.close();
- string[] spawn_args = {"feedreader"};
- GLib.Process.spawn_async("/", spawn_args, null , GLib.SpawnFlags.SEARCH_PATH, null, null);
- }
- catch(Error e)
- {
- Logger.error("Notification: close - " + e.message);
- }
- });
- }
- }
- else
- {
- m_notification.update(summary, message, AboutInfo.iconName);
- }
-
- m_notification.show();
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("Notification: send - " + e.message);
+ GLib.Application.get_default().send_notification("feedreader_default", notification);
}
}
diff --git a/src/Password.vala b/src/Password.vala
new file mode 100644
index 00000000..ab88b388
--- /dev/null
+++ b/src/Password.vala
@@ -0,0 +1,110 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.Password : GLib.Object {
+
+ public delegate HashTable<string, string> GetAttributesFunc();
+
+ private Secret.Collection m_secrets;
+ private Secret.Schema m_schema;
+ private GetAttributesFunc m_get_attributes;
+ private string m_label;
+
+ public Password(Secret.Collection secrets, Secret.Schema schema, string label, owned GetAttributesFunc get_attributes)
+ {
+ m_secrets = secrets;
+ m_schema = schema;
+ m_label = label;
+ m_get_attributes = (owned)get_attributes;
+ }
+
+ public string get_password(Cancellable? cancellable = null)
+ {
+ var attributes = m_get_attributes();
+ try
+ {
+ var secrets = m_secrets.search_sync(m_schema, attributes, Secret.SearchFlags.NONE, cancellable);
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return "";
+
+ if(secrets.length() != 0)
+ {
+ var item = secrets.data;
+ item.load_secret_sync(cancellable);
+ if(cancellable != null && cancellable.is_cancelled())
+ return "";
+
+ var secret = item.get_secret();
+ if(secret == null)
+ {
+ Logger.error("Password.get_password: Got NULL secret");
+ return "";
+ }
+ var password = secret.get_text();
+ if(password == null)
+ {
+ Logger.error("Password.get_password: Got NULL password in non-NULL secret (secret isn't a text?)");
+ return "";
+ }
+ return password;
+ }
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Password.get_password: " + e.message);
+ }
+ return "";
+ }
+
+ public void set_password(string password, Cancellable? cancellable = null)
+ {
+ var attributes = m_get_attributes();
+ try
+ {
+ var value = new Secret.Value(password, password.length, "text/plain");
+ Secret.Item.create_sync(m_secrets, m_schema, attributes, m_label, value, Secret.ItemCreateFlags.REPLACE, cancellable);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Password.setPassword: " + e.message);
+ }
+ }
+
+ public bool delete_password(Cancellable? cancellable = null)
+ {
+ var attributes = m_get_attributes();
+ try
+ {
+ var secrets = m_secrets.search_sync(m_schema, attributes, Secret.SearchFlags.NONE, cancellable);
+
+ if(cancellable != null && cancellable.is_cancelled())
+ return false;
+
+ if(secrets.length() != 0)
+ {
+ var item = secrets.data;
+ item.delete_sync(cancellable);
+ return true;
+ }
+ return false;
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Password.delete_password: " + e.message);
+ return false;
+ }
+ }
+}
diff --git a/src/QueryBuilder.vala b/src/QueryBuilder.vala
index dea027b0..7e625f29 100644
--- a/src/QueryBuilder.vala
+++ b/src/QueryBuilder.vala
@@ -15,329 +15,343 @@
public class FeedReader.QueryBuilder : GLib.Object {
- private GLib.StringBuilder m_query;
- private QueryType m_type;
- private string m_table;
- private bool m_noError;
- private Gee.ArrayList<string> m_fields;
- private Gee.ArrayList<string> m_values;
- private Gee.ArrayList<string> m_conditions;
- private GLib.StringBuilder m_insert_fields;
- private GLib.StringBuilder m_insert_values;
- private string m_orderBy;
- private string m_limit;
- private string m_offset;
-
- public QueryBuilder(QueryType type, string table)
- {
- m_query = new GLib.StringBuilder();
- m_fields = new Gee.ArrayList<string>();
- m_values = new Gee.ArrayList<string>();
- m_conditions = new Gee.ArrayList<string>();
- m_type = type;
- m_table = table;
- m_noError = true;
- m_orderBy = "";
- m_limit = "";
- m_offset = "";
- m_insert_fields = new GLib.StringBuilder();
- m_insert_values = new GLib.StringBuilder();
- }
-
- public bool insertValuePair(string field, string value)
- {
- switch(m_type)
- {
- case QueryType.INSERT:
- case QueryType.INSERT_OR_IGNORE:
- case QueryType.INSERT_OR_REPLACE:
- m_fields.add(field);
- m_values.add(value);
- return true;
- }
- Logger.error("insertValuePair");
- return false;
- }
-
- public bool selectField(string field)
- {
- if(m_type == QueryType.SELECT)
- {
- m_fields.add(field);
- return true;
- }
- Logger.error("selectField");
- return false;
- }
-
- public bool updateValuePair(string field, string value, bool isString = false)
- {
- if(m_type == QueryType.UPDATE)
- {
- m_fields.add(field);
- if(isString)
- m_values.add("'%s'".printf(value));
- else
- m_values.add(value);
- return true;
- }
- Logger.error("updateValuePair");
-
- return false;
- }
-
- public bool addEqualsCondition(string field, string value, bool positive = true, bool isString = false)
- {
- if(m_type == QueryType.UPDATE
- || m_type == QueryType.SELECT
- || m_type == QueryType.DELETE)
- {
- string condition = "%s = %s";
-
- if(isString)
- condition = "%s = \"%s\"";
-
- if(!positive)
- condition = "NOT " + condition;
-
- m_conditions.add(condition.printf(field, value));
- return true;
- }
- Logger.error("addEqualsConditionString");
- return false;
- }
-
- public bool addCustomCondition(string condition)
- {
- if(m_type == QueryType.UPDATE
- || m_type == QueryType.SELECT
- || m_type == QueryType.DELETE)
- {
- m_conditions.add(condition);
- return true;
- }
- Logger.error("addCustomCondition");
- return false;
- }
-
- public bool addRangeConditionString(string field, Gee.ArrayList<string> values, bool instr = false)
- {
- if(!instr)
- {
- if(m_type == QueryType.UPDATE
- || m_type == QueryType.SELECT
- || m_type == QueryType.DELETE)
- {
- var compound_values = new GLib.StringBuilder();
- foreach(string value in values)
- {
- compound_values.append("\"");
- compound_values.append(value);
- compound_values.append("\",");
- }
- compound_values.erase(compound_values.len-1);
- m_conditions.add("%s IN (%s)".printf(field, compound_values.str));
- return true;
- }
- }
- else
- {
- if(m_type == QueryType.UPDATE
- || m_type == QueryType.SELECT
- || m_type == QueryType.DELETE)
- {
- foreach(string value in values)
- {
- this.addCustomCondition("instr(field, \"%s\") > 0".printf(value));
- }
- }
- return true;
- }
-
- Logger.error("addRangeConditionString");
- return false;
- }
-
- public bool addRangeConditionInt(string field, Gee.ArrayList<int> values)
- {
- if(m_type == QueryType.UPDATE
- || m_type == QueryType.SELECT
- || m_type == QueryType.DELETE)
- {
- var compound_values = new GLib.StringBuilder();
- foreach(int value in values)
- {
- compound_values.append(value.to_string());
- compound_values.append(",");
- }
- compound_values.erase(compound_values.len-1);
- m_conditions.add("%s IN (%s)".printf(field, compound_values.str));
- return true;
- }
- Logger.error("addRangeConditionInt");
- return false;
- }
-
- public bool orderBy(string field, bool desc)
- {
- if(m_type == QueryType.SELECT)
- {
- m_orderBy = " ORDER BY ";
- m_orderBy += field;
- m_orderBy += " COLLATE NOCASE";
-
- if(desc)
- m_orderBy += " DESC";
- else
- m_orderBy += " ASC";
-
- return true;
- }
- Logger.error("orderBy");
- return false;
- }
-
- public bool limit(uint limit)
- {
- if(m_type == QueryType.SELECT)
- {
- m_limit = " LIMIT %u".printf(limit);
- return true;
- }
- Logger.error("limit");
- return false;
- }
-
- public bool offset(uint offset)
- {
- if(m_type == QueryType.SELECT)
- {
- m_offset = " OFFSET %u".printf(offset);
- return true;
- }
- Logger.error("offset");
- return false;
- }
-
- public string build()
- {
- if(!m_noError)
- {
- Logger.error("build query");
- return "error setting up the query";
- }
-
- switch(m_type)
- {
- case QueryType.INSERT:
- case QueryType.INSERT_OR_IGNORE:
- case QueryType.INSERT_OR_REPLACE:
- m_query.append("INSERT ");
-
- if(m_type == QueryType.INSERT_OR_IGNORE)
- m_query.append("OR IGNORE ");
- else if(m_type == QueryType.INSERT_OR_REPLACE)
- m_query.append("OR REPLACE ");
-
- m_query.append("INTO ");
- m_query.append(m_table);
- m_query.append(" ");
-
- foreach(string field in m_fields)
- {
- m_insert_fields.append(",");
- m_insert_fields.append(field);
- }
- m_insert_fields.overwrite(0, "(").append(")");
- m_query.append(m_insert_fields.str);
-
- m_query.append(" VALUES ");
-
- foreach(string value in m_values)
- {
- m_insert_values.append(",");
- m_insert_values.append(value);
- }
- m_insert_values.overwrite(0, "(").append(")");
- m_query.append(m_insert_values.str);
- break;
-
-
- case QueryType.UPDATE:
- m_query.append("UPDATE ");
- m_query.append(m_table);
- m_query.append(" SET ");
-
- for(int i = 0; i < m_fields.size; i++)
- {
- m_query.append(m_fields.get(i));
- m_query.append(" = ");
- m_query.append(m_values.get(i));
- m_query.append(", ");
- }
-
- m_query.erase(m_query.len-2);
- m_query.append(buildConditions());
- break;
-
-
- case QueryType.DELETE:
- m_query.append("DELETE FROM ");
- m_query.append(m_table);
- m_query.append(buildConditions());
- break;
-
-
- case QueryType.SELECT:
- m_query.append("SELECT ");
- foreach(string field in m_fields)
- {
- m_query.append(field);
- m_query.append(", ");
- }
- m_query.erase(m_query.len-2);
- m_query.append(" FROM ");
- m_query.append(m_table);
- m_query.append(buildConditions());
- m_query.append(m_orderBy);
- m_query.append(m_limit);
- m_query.append(m_offset);
- break;
- }
-
- //print();
- return m_query.str;
- }
-
- private string buildConditions()
- {
- if(m_conditions.size == 0)
- return "";
-
- var conditions = new GLib.StringBuilder();
- conditions.append(" WHERE ");
-
- foreach(string condition in m_conditions)
- {
- conditions.append(condition);
- conditions.append(" AND ");
- }
- conditions.erase(conditions.len-4);
- return conditions.str;
- }
-
- public new string get()
- {
- return m_query.str;
- }
-
- public void reset()
- {
- m_query.str = "";
- }
-
- public void print()
- {
- Logger.debug(m_query.str);
- }
+ private GLib.StringBuilder m_query;
+ private QueryType m_type;
+ private string m_table;
+ private bool m_noError;
+ private Gee.List<string> m_fields;
+ private Gee.List<string> m_values;
+ private Gee.List<string> m_conditions;
+ private GLib.StringBuilder m_insert_fields;
+ private GLib.StringBuilder m_insert_values;
+ private string m_orderBy;
+ private string m_limit;
+ private string m_offset;
+
+ public QueryBuilder(QueryType type, string table)
+ {
+ m_query = new GLib.StringBuilder();
+ m_fields = new Gee.ArrayList<string>();
+ m_values = new Gee.ArrayList<string>();
+ m_conditions = new Gee.ArrayList<string>();
+ m_type = type;
+ m_table = table;
+ m_noError = true;
+ m_orderBy = "";
+ m_limit = "";
+ m_offset = "";
+ m_insert_fields = new GLib.StringBuilder();
+ m_insert_values = new GLib.StringBuilder();
+ }
+
+ public bool insertValuePair(string field, string value)
+ {
+ switch(m_type)
+ {
+ case QueryType.INSERT:
+ case QueryType.INSERT_OR_IGNORE:
+ case QueryType.INSERT_OR_REPLACE:
+ m_fields.add(field);
+ m_values.add(value);
+ return true;
+ }
+ Logger.error("insertValuePair");
+ return false;
+ }
+
+ public bool selectField(string field)
+ {
+ if(m_type == QueryType.SELECT)
+ {
+ m_fields.add(field);
+ return true;
+ }
+ Logger.error("selectField");
+ return false;
+ }
+
+ public bool updateValuePair(string field, string value, bool isString = false)
+ {
+ if(m_type == QueryType.UPDATE)
+ {
+ m_fields.add(field);
+ if(isString)
+ m_values.add("'%s'".printf(value));
+ else
+ m_values.add(value);
+ return true;
+ }
+ Logger.error("updateValuePair");
+
+ return false;
+ }
+
+ public bool addEqualsCondition(string field, string value, bool positive = true, bool isString = false)
+ {
+ if(m_type == QueryType.UPDATE
+ || m_type == QueryType.SELECT
+ || m_type == QueryType.DELETE)
+ {
+ string condition = "%s = %s";
+
+ if(isString)
+ condition = "%s = \"%s\"";
+
+ if(!positive)
+ condition = "NOT " + condition;
+
+ m_conditions.add(condition.printf(field, value));
+ return true;
+ }
+ Logger.error("addEqualsConditionString");
+ return false;
+ }
+
+ public bool addCustomCondition(string condition)
+ {
+ if(m_type == QueryType.UPDATE
+ || m_type == QueryType.SELECT
+ || m_type == QueryType.DELETE)
+ {
+ m_conditions.add(condition);
+ return true;
+ }
+ Logger.error("addCustomCondition");
+ return false;
+ }
+
+ public bool addRangeConditionString(string field, Gee.List<string> values, bool instr = false)
+ {
+ if(!instr)
+ {
+ if(m_type == QueryType.UPDATE
+ || m_type == QueryType.SELECT
+ || m_type == QueryType.DELETE)
+ {
+ if (values.size == 0)
+ {
+ m_conditions.add("1 <> 1");
+ }
+ else {
+ var compound_values = new GLib.StringBuilder();
+ foreach(string value in values)
+ {
+ compound_values.append("\"");
+ compound_values.append(value);
+ compound_values.append("\",");
+ }
+ compound_values.erase(compound_values.len - 1);
+ m_conditions.add("%s IN (%s)".printf(field, compound_values.str));
+ }
+ return true;
+ }
+ }
+ else
+ {
+ if(m_type == QueryType.UPDATE
+ || m_type == QueryType.SELECT
+ || m_type == QueryType.DELETE)
+ {
+ foreach(string value in values)
+ {
+ this.addCustomCondition("instr(field, \"%s\") > 0".printf(value));
+ }
+ }
+ return true;
+ }
+
+ Logger.error("addRangeConditionString");
+ return false;
+ }
+
+ public bool addRangeConditionInt(string field, Gee.List<int> values)
+ {
+ if(m_type == QueryType.UPDATE
+ || m_type == QueryType.SELECT
+ || m_type == QueryType.DELETE)
+ {
+ if (values.size == 0)
+ {
+ m_conditions.add("1 <> 1");
+ }
+ else {
+ var compound_values = new GLib.StringBuilder();
+ foreach(int value in values)
+ {
+ compound_values.append(value.to_string());
+ compound_values.append(",");
+ }
+ compound_values.erase(compound_values.len - 1);
+ m_conditions.add("%s IN (%s)".printf(field, compound_values.str));
+ }
+ return true;
+ }
+ Logger.error("addRangeConditionInt");
+ return false;
+ }
+
+ public bool orderBy(string field, bool desc)
+ {
+ if(m_type == QueryType.SELECT)
+ {
+ m_orderBy = " ORDER BY ";
+ m_orderBy += field;
+ m_orderBy += " COLLATE NOCASE";
+
+ if(desc)
+ m_orderBy += " DESC";
+ else
+ m_orderBy += " ASC";
+
+ return true;
+ }
+ Logger.error("orderBy");
+ return false;
+ }
+
+ public bool limit(uint limit)
+ {
+ if(m_type == QueryType.SELECT)
+ {
+ m_limit = " LIMIT %u".printf(limit);
+ return true;
+ }
+ Logger.error("limit");
+ return false;
+ }
+
+ public bool offset(uint offset)
+ {
+ if(m_type == QueryType.SELECT)
+ {
+ m_offset = " OFFSET %u".printf(offset);
+ return true;
+ }
+ Logger.error("offset");
+ return false;
+ }
+
+ public string build()
+ {
+ if(!m_noError)
+ {
+ Logger.error("build query");
+ return "error setting up the query";
+ }
+
+ switch(m_type)
+ {
+ case QueryType.INSERT:
+ case QueryType.INSERT_OR_IGNORE:
+ case QueryType.INSERT_OR_REPLACE:
+ m_query.append("INSERT ");
+
+ if(m_type == QueryType.INSERT_OR_IGNORE)
+ m_query.append("OR IGNORE ");
+ else if(m_type == QueryType.INSERT_OR_REPLACE)
+ m_query.append("OR REPLACE ");
+
+ m_query.append("INTO ");
+ m_query.append(m_table);
+ m_query.append(" ");
+
+ foreach(string field in m_fields)
+ {
+ m_insert_fields.append(",");
+ m_insert_fields.append(field);
+ }
+ m_insert_fields.overwrite(0, "(").append(")");
+ m_query.append(m_insert_fields.str);
+
+ m_query.append(" VALUES ");
+
+ foreach(string value in m_values)
+ {
+ m_insert_values.append(",");
+ m_insert_values.append(value);
+ }
+ m_insert_values.overwrite(0, "(").append(")");
+ m_query.append(m_insert_values.str);
+ break;
+
+
+ case QueryType.UPDATE:
+ m_query.append("UPDATE ");
+ m_query.append(m_table);
+ m_query.append(" SET ");
+
+ assert(m_fields.size > 0);
+ for(int i = 0; i < m_fields.size; i++)
+ {
+ m_query.append(m_fields.get(i));
+ m_query.append(" = ");
+ m_query.append(m_values.get(i));
+ m_query.append(", ");
+ }
+
+ m_query.erase(m_query.len-2);
+ m_query.append(buildConditions());
+ break;
+
+
+ case QueryType.DELETE:
+ m_query.append("DELETE FROM ");
+ m_query.append(m_table);
+ m_query.append(buildConditions());
+ break;
+
+
+ case QueryType.SELECT:
+ m_query.append("SELECT ");
+ assert(m_fields.size > 0);
+ foreach(string field in m_fields)
+ {
+ m_query.append(field);
+ m_query.append(", ");
+ }
+ m_query.erase(m_query.len-2);
+ m_query.append(" FROM ");
+ m_query.append(m_table);
+ m_query.append(buildConditions());
+ m_query.append(m_orderBy);
+ m_query.append(m_limit);
+ m_query.append(m_offset);
+ break;
+ }
+
+ //print();
+ return m_query.str;
+ }
+
+ private string buildConditions()
+ {
+ if(m_conditions.size == 0)
+ return "";
+
+ var conditions = new GLib.StringBuilder();
+ conditions.append(" WHERE ");
+
+ foreach(string condition in m_conditions)
+ {
+ conditions.append(condition);
+ conditions.append(" AND ");
+ }
+ conditions.erase(conditions.len-4);
+ return conditions.str;
+ }
+
+ public new string get()
+ {
+ return m_query.str;
+ }
+
+ public void reset()
+ {
+ m_query.str = "";
+ }
+
+ public void print()
+ {
+ Logger.debug(m_query.str);
+ }
}
diff --git a/src/SQLite.vala b/src/SQLite.vala
new file mode 100644
index 00000000..246ae404
--- /dev/null
+++ b/src/SQLite.vala
@@ -0,0 +1,142 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+/* A wrapper around the low-level SQLite API */
+public class FeedReader.SQLite : GLib.Object {
+ private Sqlite.Database m_db;
+
+ public SQLite(string db_path, int busy_timeout = 1000)
+ {
+ var path = GLib.File.new_for_path(db_path);
+ var parent = path.get_parent();
+ if(!parent.query_exists())
+ {
+ try
+ {
+ parent.make_directory_with_parents();
+ }
+ catch(IOError.EXISTS e)
+ {
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("SQLite: " + e.message);
+ }
+ }
+
+ int rc = Sqlite.Database.open_v2(db_path, out m_db);
+ if(rc != Sqlite.OK)
+ {
+ error("Can't open database: %d: %s".printf(m_db.errcode(), m_db.errmsg()));
+ }
+
+ m_db.busy_timeout(busy_timeout);
+ }
+
+ // Backwards compatibility interface
+ public Sqlite.Statement prepare(string query)
+ {
+ Sqlite.Statement stmt;
+ int rc = m_db.prepare_v2(query, query.length, out stmt);
+ if(rc != Sqlite.OK)
+ error("Can't prepare statement: %d: %s\nSQL is %s".printf(m_db.errcode(), m_db.errmsg(), query));
+ return stmt;
+ }
+
+ public string errmsg()
+ {
+ return m_db.errmsg();
+ }
+
+ public void checkpoint()
+ {
+ m_db.wal_checkpoint("");
+ }
+
+ public void simple_query(string query)
+ {
+ string errmsg;
+ int ec = m_db.exec(query, null, out errmsg);
+ if (ec != Sqlite.OK)
+ {
+ error("Failed to execute simple query: %d: %s\nSQL is: %s".printf(ec, errmsg, query));
+ }
+ }
+
+ public Gee.List<Gee.List<Sqlite.Value?>> execute(string query, GLib.Value?[]? params = null)
+ {
+ Sqlite.Statement stmt;
+ int rc = m_db.prepare_v2(query, query.length, out stmt);
+ if (rc != Sqlite.OK)
+ {
+ error("Can't prepare statement: %d: %s\nSQL is: %s".printf(m_db.errcode(), m_db.errmsg(), query));
+ }
+
+ if(params != null)
+ {
+ int i = 1;
+ foreach(var param in params)
+ {
+ if(param == null)
+ stmt.bind_null(i);
+ else
+ {
+ // The order of operations matters here because floats and doubles
+ // are transformable to int, and anything is transformable to
+ // string
+ if(param.holds(typeof(float)) || param.holds(typeof(double)))
+ {
+ var as_double = GLib.Value(typeof(double));
+ param.transform(ref as_double);
+ stmt.bind_double(i, (double)as_double);
+ }
+ else if(GLib.Value.type_transformable(param.type(), typeof(int64)))
+ {
+ var as_int = GLib.Value(typeof(int64));
+ param.transform(ref as_int);
+ stmt.bind_int64(i, (int64)as_int);
+ }
+ else
+ {
+ var as_string = GLib.Value(typeof(string));
+ param.transform(ref as_string);
+ stmt.bind_text(i, (string)as_string);
+ }
+ }
+ ++i;
+ }
+ }
+
+ var rows = new Gee.ArrayList<Gee.List<Sqlite.Value?>>();
+ while(stmt.step() == Sqlite.ROW)
+ {
+ var row = new Gee.ArrayList<Sqlite.Value?>();
+ for(int i = 0; i < stmt.column_count(); ++i)
+ {
+ row.add(stmt.column_value(i).copy());
+ }
+ rows.add(row);
+ }
+ stmt.reset ();
+
+ return rows;
+ }
+
+ public static string quote_string(string str)
+ {
+ var escaped = str.replace("'", "''");
+ return @"'$(escaped)'";
+ }
+}
diff --git a/src/Share/ServiceSetup.vala b/src/Share/ServiceSetup.vala
index c3f91b7d..8c074088 100644
--- a/src/Share/ServiceSetup.vala
+++ b/src/Share/ServiceSetup.vala
@@ -16,13 +16,13 @@
public class FeedReader.ServiceSetup : Gtk.ListBoxRow {
protected string m_name;
- protected Gtk.Revealer m_revealer;
- protected Gtk.Label m_label;
- protected Gtk.Box m_box;
+ protected Gtk.Revealer m_revealer;
+ protected Gtk.Label m_label;
+ protected Gtk.Box m_box;
protected Gtk.Box m_labelBox;
protected Gtk.Stack m_iconStack;
protected Gtk.Stack m_labelStack;
- protected Gtk.Button m_login_button;
+ protected Gtk.Button m_login_button;
protected Gtk.Button m_logout_button;
protected Gtk.Spinner m_spinner;
protected Gtk.EventBox m_eventbox;
@@ -54,8 +54,8 @@ public class FeedReader.ServiceSetup : Gtk.ListBoxRow {
m_eventbox.add(m_iconStack);
m_login_button = new Gtk.Button.with_label(_("Login"));
- m_login_button.hexpand = false;
- m_login_button.margin = 10;
+ m_login_button.hexpand = false;
+ m_login_button.margin = 10;
m_login_button.clicked.connect(login);
m_logout_button = new Gtk.Button.with_label(_("Logout"));
@@ -97,7 +97,7 @@ public class FeedReader.ServiceSetup : Gtk.ListBoxRow {
m_box.pack_start(icon, false, false, 0);
m_box.pack_start(m_labelStack, true, true, 0);
- m_box.pack_end(m_eventbox, false, false, 0);
+ m_box.pack_end(m_eventbox, false, false, 0);
m_seperator_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
var separator = new Gtk.Separator(Gtk.Orientation.HORIZONTAL);
diff --git a/src/Share/ShareAccountInterface.vala b/src/Share/ShareAccountInterface.vala
index 749e2fbb..a179ec36 100644
--- a/src/Share/ShareAccountInterface.vala
+++ b/src/Share/ShareAccountInterface.vala
@@ -19,7 +19,7 @@ public interface FeedReader.ShareAccountInterface : GLib.Object {
public signal void deleteAccount(string id);
- public abstract void setupSystemAccounts(Gee.ArrayList<ShareAccount> accounts);
+ public abstract void setupSystemAccounts(Gee.List<ShareAccount> accounts);
public abstract bool useSystemAccounts();
diff --git a/src/Share/share.vala b/src/Share/share.vala
index 7336a136..cbb52159 100644
--- a/src/Share/share.vala
+++ b/src/Share/share.vala
@@ -15,7 +15,7 @@
public class FeedReader.Share : GLib.Object {
- private Gee.ArrayList<ShareAccount> m_accounts;
+ private Gee.List<ShareAccount> m_accounts;
private Peas.ExtensionSet m_plugins;
private static Share? m_share = null;
private Goa.Client? m_client = null;
@@ -31,7 +31,7 @@ public class FeedReader.Share : GLib.Object {
private Share()
{
var engine = Peas.Engine.get_default();
- engine.add_search_path(Constants.INSTALL_PREFIX + "/" + Constants.INSTALL_LIBDIR + "/pluginsShare/", null);
+ engine.add_search_path(Constants.INSTALL_LIBDIR + "/pluginsShare/", null);
engine.enable_loader("python3");
m_plugins = new Peas.ExtensionSet(engine, typeof(ShareAccountInterface));
@@ -115,7 +115,7 @@ public class FeedReader.Share : GLib.Object {
return plug;
}
- public Gee.ArrayList<ShareAccount> getAccountTypes()
+ public Gee.List<ShareAccount> getAccountTypes()
{
var accounts = new Gee.ArrayList<ShareAccount>();
@@ -142,7 +142,7 @@ public class FeedReader.Share : GLib.Object {
}
- public Gee.ArrayList<ShareAccount> getAccounts()
+ public Gee.List<ShareAccount> getAccounts()
{
return m_accounts;
}
diff --git a/src/StringUtils.vala b/src/StringUtils.vala
new file mode 100644
index 00000000..7f91a712
--- /dev/null
+++ b/src/StringUtils.vala
@@ -0,0 +1,49 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.StringUtils {
+ public static Gee.List<string> split(string s, string sep, bool ignore_empty=false)
+ {
+ var items = s.split(sep);
+ if (!ignore_empty)
+ return new Gee.ArrayList<string>.wrap(items);
+
+ var res = new Gee.ArrayList<string>();
+ foreach(string item in items)
+ {
+ if(!ignore_empty || item.strip() != "")
+ {
+ res.add(item);
+ }
+
+ }
+ return res;
+ }
+
+ public static string join(Gee.Collection<string> l, string sep)
+ {
+ return string.joinv(sep, l.to_array());
+ }
+
+ public static Gee.List<string> sql_quote(Gee.List<string> l)
+ {
+ for(int i = 0; i < l.size; i++)
+ {
+ l[i] = SQLite.quote_string(l[i]);
+ }
+
+ return l;
+ }
+}
diff --git a/src/Structs.vala b/src/Structs.vala
new file mode 100644
index 00000000..8b06abbc
--- /dev/null
+++ b/src/Structs.vala
@@ -0,0 +1,147 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+namespace FeedReader {
+
+ public struct BackendInfo {
+ string ID;
+ string name;
+ BackendFlags flags;
+ string website;
+ string iconName;
+ }
+
+ public struct Response {
+ uint status;
+ string data;
+ Soup.MessageHeaders headers;
+
+ public bool is_ok()
+ {
+ return status >= 200 && status < 400;
+ }
+ }
+
+ public struct ResourceMetadata
+ {
+ private const string CACHE_GROUP = "cache";
+ private const string ETAG_KEY = "etag";
+ private const string LAST_MODIFIED_KEY = "last_modified";
+ private const string EXPIRES_KEY = "last_checked";
+
+ string? etag;
+ string? last_modified;
+ DateTime? expires;
+
+ public ResourceMetadata()
+ {
+ }
+
+ public ResourceMetadata.from_data(string data)
+ {
+ try
+ {
+ var config = new KeyFile();
+ config.load_from_data(data, data.length, KeyFileFlags.NONE);
+ try { this.etag = config.get_string(CACHE_GROUP, ETAG_KEY); }
+ catch (KeyFileError.KEY_NOT_FOUND e) {}
+ catch (KeyFileError.GROUP_NOT_FOUND e) {}
+ try { this.last_modified = config.get_string(CACHE_GROUP, LAST_MODIFIED_KEY); }
+ catch (KeyFileError.KEY_NOT_FOUND e) {}
+ catch (KeyFileError.GROUP_NOT_FOUND e) {}
+
+ int64? expires = null;
+ try { expires = config.get_int64(CACHE_GROUP, EXPIRES_KEY); }
+ catch (KeyFileError.KEY_NOT_FOUND e) {}
+ catch (KeyFileError.GROUP_NOT_FOUND e) {}
+ if(expires != null)
+ this.expires = new DateTime.from_unix_utc(expires);
+ }
+ catch (KeyFileError e)
+ {
+ Logger.warning(@"FaviconMetadata.from_file: Failed to load from $data");
+ }
+ }
+
+ public static async ResourceMetadata from_file_async(string filename)
+ {
+ try
+ {
+ var file = File.new_for_path(filename);
+ uint8[] contents;
+ yield file.load_contents_async(null, out contents, null);
+ return ResourceMetadata.from_data((string)contents);
+ }
+ catch (IOError.NOT_FOUND e)
+ {
+ }
+ catch (Error e)
+ {
+ Logger.warning(@"FaviconMetadata.from_file: Failed to load $filename: " + e.message);
+ }
+ return ResourceMetadata();
+ }
+
+ public async void save_to_file_async(string filename)
+ {
+ var file = File.new_for_path(filename);
+ if(this.etag == null && this.last_modified == null && this.expires == null)
+ {
+ try
+ {
+ yield file.delete_async();
+ }
+ catch (IOError.NOT_FOUND e)
+ {
+ }
+ catch (Error e)
+ {
+ Logger.warning(@"FaviconMetadata.save_to_file: Error deleting metadata file $filename: " + e.message);
+ }
+ }
+ else
+ {
+ var config = new KeyFile();
+ if(this.etag != null)
+ config.set_string(CACHE_GROUP, ETAG_KEY, this.etag);
+ if(this.last_modified != null)
+ config.set_string(CACHE_GROUP, LAST_MODIFIED_KEY, this.last_modified);
+ if(this.expires != null)
+ config.set_int64(CACHE_GROUP, EXPIRES_KEY, this.expires.to_unix());
+ var data = config.to_data();
+ try
+ {
+ yield file.replace_contents_async(data.data, null, false, FileCreateFlags.NONE, null, null);
+ }
+ catch (Error e)
+ {
+ Logger.warning(@"FaviconMetadata.save_to_file: Failed to save metadata file $filename, $data:\n" + e.message);
+ }
+ }
+ }
+
+ public bool is_expired()
+ {
+ if(expires == null)
+ return true;
+
+ if(expires.compare(new DateTime.now_utc()) == 1)
+ return false;
+
+ return true;
+ }
+ }
+
+}
diff --git a/src/Utils.vala b/src/Utils.vala
index 8838a914..426c3bb4 100644
--- a/src/Utils.vala
+++ b/src/Utils.vala
@@ -15,6 +15,91 @@
public class FeedReader.Utils : GLib.Object {
+ private static Soup.Session? m_session;
+
+ public static Soup.Session getSession()
+ {
+ if(m_session == null)
+ {
+ m_session = new Soup.Session();
+ m_session.user_agent = Constants.USER_AGENT;
+ m_session.ssl_strict = false;
+ m_session.timeout = 5;
+ }
+
+ return m_session;
+ }
+
+ public static void generatePreviews(Gee.List<Article> articles)
+ {
+ string noPreview = _("No Preview Available");
+ foreach(var Article in articles)
+ {
+ if(!DataBase.readOnly().article_exists(Article.getArticleID()))
+ {
+ if(Article.getPreview() != null && Article.getPreview() != "")
+ {
+ continue;
+ }
+ if(!DataBase.readOnly().preview_empty(Article.getArticleID()))
+ {
+ continue;
+ }
+ else if(Article.getHTML() != "" && Article.getHTML() != null)
+ {
+ Logger.debug("Utils: generate preview for article: " + Article.getArticleID());
+ string output = libVilistextum.parse(Article.getHTML(), 1);
+ if(output != null)
+ output = output.strip();
+
+ if(output == "" || output == null)
+ {
+ Logger.info("generatePreviews: no Preview");
+ Article.setPreview(noPreview);
+ Article.setTitle(Utils.UTF8fix(Article.getTitle(), true));
+ continue;
+ }
+
+ string xml = "<?xml";
+
+ while(output.has_prefix(xml))
+ {
+ int end = output.index_of_char('>');
+ output = output.slice(end+1, output.length).chug();
+ output = output.strip();
+ }
+
+ output = output.replace("\n"," ");
+ output = output.replace("_"," ");
+
+ Article.setPreview(output.chug());
+ }
+ else
+ {
+ Logger.debug("no html to create preview from");
+ Article.setPreview(noPreview);
+ }
+ Article.setTitle(Utils.UTF8fix(Article.getTitle(), true));
+ }
+ }
+ }
+
+ public static void checkHTML(Gee.List<Article> articles)
+ {
+ foreach(var Article in articles)
+ {
+ if(!DataBase.readOnly().article_exists(Article.getArticleID()))
+ {
+ string modified_html = _("No Text available for this article :(");
+ if(Article.getHTML() != "")
+ {
+ modified_html = Article.getHTML().replace("src=\"//","src=\"http://");
+ }
+ Article.setHTML(modified_html);
+ }
+ }
+ }
+
public static string UTF8fix(string? old_string, bool removeHTML = false)
{
if(old_string == null)
@@ -28,6 +113,7 @@ public class FeedReader.Utils : GLib.Object {
rm_html = 1;
string? output = old_string.replace("\n"," ").strip();
+
output = libVilistextum.parse(old_string, rm_html);
if(output != null)
@@ -46,7 +132,7 @@ public class FeedReader.Utils : GLib.Object {
return {CategoryID.MASTER.to_string(), CategoryID.TAGS.to_string()};
}
- public static GLib.DateTime convertStringToDate(string date)
+ /*public static GLib.DateTime convertStringToDate(string date)
{
return new GLib.DateTime(
new TimeZone.local(),
@@ -57,7 +143,7 @@ public class FeedReader.Utils : GLib.Object {
int.parse(date.substring(date.index_of_nth_char(14), date.index_of_nth_char(16) - date.index_of_nth_char(14))), // min
int.parse(date.substring(date.index_of_nth_char(17), date.index_of_nth_char(19) - date.index_of_nth_char(17))) // sec
);
- }
+ }*/
public static bool springCleaningNecessary()
{
@@ -105,13 +191,15 @@ public class FeedReader.Utils : GLib.Object {
public static void copyAutostart()
{
- string filename = GLib.Environment.get_user_data_dir() + "/feedreader-autostart.desktop";
+ string desktop = "org.gnome.FeedReader-autostart.desktop";
+ string filename = GLib.Environment.get_user_data_dir() + "/" + desktop;
+
if(Settings.tweaks().get_boolean("feedreader-autostart") && !FileUtils.test(filename, GLib.FileTest.EXISTS))
{
try
{
- var origin = File.new_for_path(Constants.INSTALL_PREFIX + "/share/FeedReader/feedreader-autostart.desktop");
+ var origin = File.new_for_path(Constants.INSTALL_PREFIX + "/share/FeedReader/" + desktop);
var destination = File.new_for_path(filename);
origin.copy(destination, FileCopyFlags.NONE);
}
@@ -179,26 +267,29 @@ public class FeedReader.Utils : GLib.Object {
if(uri == null)
{
- Logger.error("Ping failed: can't parse url! Seems to be not valid.");
+ Logger.error(@"Ping failed: can't parse url $link! Seems to be not valid.");
return false;
}
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- session.ssl_strict = false;
-
var message = new Soup.Message.from_uri("HEAD", uri);
- var status = session.send_message(message);
+
+ if(message == null)
+ {
+ Logger.error(@"Ping failed: can't send message to $link! Seems to be not valid.");
+ return false;
+ }
+
+ var status = getSession().send_message(message);
Logger.debug(@"Ping: status $status");
if(status >= 200 && status <= 208)
{
- Logger.debug("Ping successfull");
+ Logger.debug("Ping successful");
return true;
}
- Logger.error(@"Ping: failed - %s".printf(Soup.Status.get_phrase(status)));
+ Logger.error(@"Ping: failed %u - %s".printf(status, Soup.Status.get_phrase(status)));
return false;
}
@@ -234,6 +325,9 @@ public class FeedReader.Utils : GLib.Object {
directory.delete();
}
}
+ catch (IOError.NOT_FOUND e)
+ {
+ }
catch(GLib.Error e)
{
Logger.error("Utils - remove_directory: " + e.message);
@@ -245,92 +339,92 @@ public class FeedReader.Utils : GLib.Object {
public static string shortenURL(string url)
- {
- string longURL = url;
- if(longURL.has_prefix("https://"))
- {
- longURL = longURL.substring(8);
- }
- else if(longURL.has_prefix("http://"))
- {
- longURL = longURL.substring(7);
- }
-
- if(longURL.has_prefix("www."))
- {
- longURL = longURL.substring(4);
- }
-
- if(longURL.has_suffix("api/"))
- {
- longURL = longURL.substring(0, longURL.length - 4);
- }
-
- return longURL;
- }
+ {
+ string longURL = url;
+ if(longURL.has_prefix("https://"))
+ {
+ longURL = longURL.substring(8);
+ }
+ else if(longURL.has_prefix("http://"))
+ {
+ longURL = longURL.substring(7);
+ }
+
+ if(longURL.has_prefix("www."))
+ {
+ longURL = longURL.substring(4);
+ }
+
+ if(longURL.has_suffix("api/"))
+ {
+ longURL = longURL.substring(0, longURL.length - 4);
+ }
+
+ return longURL;
+ }
// thx to geary :)
public static string prepareSearchQuery(string raw_query)
{
- // Two goals here:
- // 1) append an * after every term so it becomes a prefix search
- // (see <https://www.sqlite.org/fts3.html#section_3>), and
- // 2) strip out common words/operators that might get interpreted as
- // search operators.
- // We ignore everything inside quotes to give the user a way to
- // override our algorithm here. The idea is to offer one search query
- // syntax for Geary that we can use locally and via IMAP, etc.
-
- string quote_balanced = parseSearchTerm(raw_query).replace("'", " ");
- if(countChar(raw_query, '"') % 2 != 0)
- {
- // Remove the last quote if it's not balanced. This has the
- // benefit of showing decent results as you type a quoted phrase.
- int last_quote = raw_query.last_index_of_char('"');
- assert(last_quote >= 0);
- quote_balanced = raw_query.splice(last_quote, last_quote + 1, " ");
- }
-
- string[] words = quote_balanced.split_set(" \t\r\n:()%*\\");
- bool in_quote = false;
- StringBuilder prepared_query = new StringBuilder();
- foreach(string s in words)
- {
- s = s.strip();
-
- int quotes = countChar(s, '"');
- if(!in_quote && quotes > 0)
+ // Two goals here:
+ // 1) append an * after every term so it becomes a prefix search
+ // (see <https://www.sqlite.org/fts3.html#section_3>), and
+ // 2) strip out common words/operators that might get interpreted as
+ // search operators.
+ // We ignore everything inside quotes to give the user a way to
+ // override our algorithm here. The idea is to offer one search query
+ // syntax for Geary that we can use locally and via IMAP, etc.
+
+ string quote_balanced = parseSearchTerm(raw_query).replace("'", " ");
+ if(countChar(raw_query, '"') % 2 != 0)
+ {
+ // Remove the last quote if it's not balanced. This has the
+ // benefit of showing decent results as you type a quoted phrase.
+ int last_quote = raw_query.last_index_of_char('"');
+ assert(last_quote >= 0);
+ quote_balanced = raw_query.splice(last_quote, last_quote + 1, " ");
+ }
+
+ string[] words = quote_balanced.split_set(" \t\r\n:()%*\\");
+ bool in_quote = false;
+ StringBuilder prepared_query = new StringBuilder();
+ foreach(string s in words)
+ {
+ s = s.strip();
+
+ int quotes = countChar(s, '"');
+ if(!in_quote && quotes > 0)
{
- in_quote = true;
- --quotes;
- }
+ in_quote = true;
+ --quotes;
+ }
- if(!in_quote)
+ if(!in_quote)
{
- string lower = s.down();
- if(lower == "" || lower == "and" || lower == "or" || lower == "not" || lower == "near" || lower.has_prefix("near/"))
- continue;
+ string lower = s.down();
+ if(lower == "" || lower == "and" || lower == "or" || lower == "not" || lower == "near" || lower.has_prefix("near/"))
+ continue;
- if(s.has_prefix("-"))
- s = s.substring(1);
+ if(s.has_prefix("-"))
+ s = s.substring(1);
- if(s == "")
- continue;
+ if(s == "")
+ continue;
- s = "\"" + s + "*\"";
- }
+ s = "\"" + s + "*\"";
+ }
- if(in_quote && quotes % 2 != 0)
- in_quote = false;
+ if(in_quote && quotes % 2 != 0)
+ in_quote = false;
- prepared_query.append(s);
- prepared_query.append(" ");
- }
+ prepared_query.append(s);
+ prepared_query.append(" ");
+ }
- assert(!in_quote);
+ assert(!in_quote);
- return prepared_query.str.strip();
- }
+ return prepared_query.str.strip();
+ }
public static int countChar(string s, unichar c)
{
@@ -360,11 +454,11 @@ public class FeedReader.Utils : GLib.Object {
return searchTerm;
}
- public static bool categoryIsPopulated(string catID, Gee.ArrayList<feed> feeds)
+ public static bool categoryIsPopulated(string catID, Gee.List<Feed> feeds)
{
- foreach(feed Feed in feeds)
+ foreach(Feed feed in feeds)
{
- var ids = Feed.getCatIDs();
+ var ids = feed.getCatIDs();
foreach(string id in ids)
{
if(id == catID)
@@ -377,18 +471,18 @@ public class FeedReader.Utils : GLib.Object {
return false;
}
- public static uint categoryGetUnread(string catID, Gee.ArrayList<feed> feeds)
+ public static uint categoryGetUnread(string catID, Gee.List<Feed> feeds)
{
uint unread = 0;
- foreach(feed Feed in feeds)
+ foreach(Feed feed in feeds)
{
- var ids = Feed.getCatIDs();
+ var ids = feed.getCatIDs();
foreach(string id in ids)
{
if(id == catID)
{
- unread += Feed.getUnread();
+ unread += feed.getUnread();
break;
}
}
@@ -399,6 +493,7 @@ public class FeedReader.Utils : GLib.Object {
public static void resetSettings(GLib.Settings settings)
{
+ Logger.warning("Resetting setting " + settings.schema_id);
var keys = settings.list_keys();
foreach(string key in keys)
{
@@ -406,8 +501,11 @@ public class FeedReader.Utils : GLib.Object {
}
}
- public static string URLtoFeedName(string url)
+ public static string URLtoFeedName(string? url)
{
+ if(url == null)
+ return "";
+
var feedname = new GLib.StringBuilder(url);
if(feedname.str.has_suffix("/"))
@@ -425,47 +523,421 @@ public class FeedReader.Utils : GLib.Object {
return feedname.str;
}
- public static bool downloadIcon(string feed_id, string feed_url, string icon_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/feed_icons/")
+ public static async bool file_exists(string path_str, FileType expected_type)
{
- var path = GLib.File.new_for_path(icon_path);
- try{path.make_directory_with_parents();}catch(GLib.Error e){}
- string local_filename = icon_path + feed_id.replace("/", "_").replace(".", "_") + ".ico";
+ var path = GLib.File.new_for_path(path_str);
+ try
+ {
+ var info = yield path.query_info_async("standard::type", FileQueryInfoFlags.NONE);
+ return info.get_file_type () == expected_type;
+ }
+ catch(Error e)
+ {
+ return false;
+ }
+ }
- string url = feed_url;
- if(feed_url.has_prefix("http://"))
- url.replace("http://", "");
- else if(feed_url.has_prefix("https://"))
- url.replace("https://", "");
+ public static async bool ensure_path(string path_str)
+ {
+ var path = GLib.File.new_for_path(path_str);
+ if(yield file_exists(path_str, FileType.DIRECTORY))
+ return true;
- if(!FileUtils.test(local_filename, GLib.FileTest.EXISTS))
+ try
+ {
+ path.make_directory_with_parents();
+ return true;
+ }
+ catch(IOError.EXISTS e)
+ {
+ return true;
+ }
+ catch(Error e)
{
- Logger.debug("Utils: downloadIcon() url = \"%s\"".printf(url));
+ Logger.error(@"ensure_path: Failed to create folder $path_str: " + e.message);
+ return false;
+ }
+ }
- Soup.Message message_dlIcon;
- message_dlIcon = new Soup.Message ("GET", "http://f1.allesedv.com/32/%s".printf(url));
+ public static string gsettingReadString(GLib.Settings setting, string key)
+ {
+ string val = setting.get_string(key);
+ if(val == "")
+ Logger.warning("Utils.gsettingReadString: failed to read %s %s".printf(setting.schema_id, key));
- if(Settings.tweaks().get_boolean("do-not-track"))
- message_dlIcon.request_headers.append("DNT", "1");
+ return val;
+ }
- var session = new Soup.Session();
- session.user_agent = Constants.USER_AGENT;
- var status = session.send_message(message_dlIcon);
- if (status == 200)
- {
- try
- {
- FileUtils.set_contents(local_filename, (string)message_dlIcon.response_body.flatten().data, (long)message_dlIcon.response_body.length);
- }
- catch(GLib.FileError e)
+ public static void gsettingWriteString(GLib.Settings setting, string key, string val)
+ {
+ if(val == "" || val == null)
+ Logger.warning("Utils.gsettingWriteString: resetting %s %s".printf(setting.schema_id, key));
+
+ if(!setting.set_string(key, val))
+ Logger.error("Utils.gsettingWriteString: writing %s %s failed".printf(setting.schema_id, key));
+ }
+
+ public static async uint8[] inputStreamToArray(InputStream stream, Cancellable? cancellable=null) throws Error
+ {
+ Array<uint8> result = new Array<uint8>();
+ uint8[] buffer = new uint8[1024];
+ while(true)
+ {
+ size_t bytesRead = 0;
+ yield stream.read_all_async(buffer, Priority.DEFAULT_IDLE, cancellable, out bytesRead);
+ if (bytesRead == 0)
+ break;
+ result.append_vals(buffer, (uint)bytesRead);
+ }
+
+ return result.data;
+ }
+
+ public static string buildArticle(string html, string title, string url, string? author, string date, string feedID)
+ {
+ var article = new GLib.StringBuilder();
+ string author_date = "";
+ if(author != null)
+ author_date += _("posted by: %s, ").printf(author);
+
+ author_date += date;
+
+ try
+ {
+ uint8[] contents;
+ var file = File.new_for_uri("resource:///org/gnome/FeedReader/ArticleView/article.html");
+ file.load_contents(null, out contents, null);
+ article.assign((string)contents);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Utils.buildArticle: %s".printf(e.message));
+ }
+
+ string html_id = "$HTML";
+ int html_pos = article.str.index_of(html_id);
+ article.erase(html_pos, html_id.length);
+ article.insert(html_pos, html);
+
+ string author_id = "$AUTHOR";
+ int author_pos = article.str.index_of(author_id);
+ article.erase(author_pos, author_id.length);
+ article.insert(author_pos, author_date);
+
+ string title_id = "$TITLE";
+ int title_pos = article.str.index_of(title_id);
+ article.erase(title_pos, title_id.length);
+ article.insert(title_pos, title);
+
+ string url_id = "$URL";
+ int url_pos = article.str.index_of(url_id);
+ article.erase(url_pos, url_id.length);
+ article.insert(url_pos, url);
+
+ string feed_id = "$FEED";
+ int feed_pos = article.str.index_of(feed_id);
+ article.erase(feed_pos, feed_id.length);
+ var feed = DataBase.readOnly().read_feed(feedID);
+ article.insert(feed_pos, feed != null ? feed.getTitle() : "");
+
+
+ string theme = "theme ";
+ switch(Settings.general().get_enum("article-theme"))
+ {
+ case ArticleTheme.DEFAULT:
+ theme += "default";
+ break;
+
+ case ArticleTheme.SPRING:
+ theme += "spring";
+ break;
+
+ case ArticleTheme.MIDNIGHT:
+ theme += "midnight";
+ break;
+
+ case ArticleTheme.PARCHMENT:
+ theme += "parchment";
+ break;
+ }
+
+ string theme_id = "$THEME";
+ int theme_pos = article.str.index_of(theme_id);
+ article.erase(theme_pos, theme_id.length);
+ article.insert(theme_pos, theme);
+
+ string select_id = "$UNSELECTABLE";
+ int select_pos = article.str.index_of(select_id);
+
+ if(Settings.tweaks().get_boolean("article-select-text"))
+ {
+ article.erase(select_pos-1, select_id.length+1);
+ }
+ else
+ {
+ article.erase(select_pos, select_id.length);
+ article.insert(select_pos, "unselectable");
+ }
+
+ string font = Settings.general().get_string("font");
+ var desc = Pango.FontDescription.from_string(font);
+ string fontfamilly = desc.get_family();
+ uint fontsize = (uint)GLib.Math.roundf(desc.get_size()/Pango.SCALE);
+ string small_size = (fontsize - 2).to_string();
+ string large_size = (fontsize * 2).to_string();
+ string normal_size = fontsize.to_string();
+
+ string fontfamily_id = "$FONTFAMILY";
+ int fontfamilly_pos = article.str.index_of(fontfamily_id);
+ article.erase(fontfamilly_pos, fontfamily_id.length);
+ article.insert(fontfamilly_pos, fontfamilly);
+
+ string fontsize_id = "$FONTSIZE";
+ string sourcefontsize_id = "$SMALLSIZE";
+ int fontsize_pos = article.str.index_of(fontsize_id);
+ article.erase(fontsize_pos, fontsize_id.length);
+ article.insert(fontsize_pos, normal_size);
+
+ string largesize_id = "$LARGESIZE";
+ int largesize_pos = article.str.index_of(largesize_id);
+ article.erase(largesize_pos, largesize_id.length);
+ article.insert(largesize_pos, large_size);
+
+ for(int i = article.str.index_of(sourcefontsize_id, 0); i != -1; i = article.str.index_of(sourcefontsize_id, i))
+ {
+ article.erase(i, sourcefontsize_id.length);
+ article.insert(i, small_size);
+ }
+
+
+ try
+ {
+ uint8[] contents;
+ var file = File.new_for_uri("resource:///org/gnome/FeedReader/ArticleView/style.css");
+ file.load_contents(null, out contents, null);
+ string css_id = "$CSS";
+ int css_pos = article.str.index_of(css_id);
+ article.erase(css_pos, css_id.length);
+ article.insert(css_pos, (string)contents);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Utils.buildArticle: load CSS: " + e.message);
+ }
+
+ return article.str;
+ }
+
+ public static bool canManipulateContent(bool? online = null)
+ {
+ // if backend = local RSS -> return true;
+ if(Settings.general().get_string("plugin") == "local")
+ return true;
+
+ if(!FeedReaderBackend.get_default().supportFeedManipulation())
+ return false;
+
+ // when we already know wheather feedreader is online or offline
+ if(online != null)
+ {
+ if(online)
+ return true;
+ else
+ return false;
+ }
+
+ // otherwise check if online
+ return FeedReaderBackend.get_default().isOnline();
+ }
+
+ public static GLib.Menu getMenu()
+ {
+ var urlMenu = new GLib.Menu();
+ urlMenu.append(Menu.bugs, "win.bugs");
+ urlMenu.append(Menu.bounty, "win.bounty");
+
+ var aboutMenu = new GLib.Menu();
+ aboutMenu.append(Menu.shortcuts, "win.shortcuts");
+ aboutMenu.append(Menu.about, "win.about");
+ aboutMenu.append(Menu.quit, "app.quit");
+
+ var menu = new GLib.Menu();
+ menu.append(Menu.settings, "win.settings");
+ menu.append(Menu.reset, "win.reset");
+ menu.append_section("", urlMenu);
+
+ if(GLib.Environment.get_variable("XDG_CURRENT_DESKTOP").down() != "pantheon")
+ {
+ menu.append_section("", aboutMenu);
+ }
+
+ return menu;
+ }
+
+ public static bool onlyShowFeeds()
+ {
+ if(Settings.general().get_boolean("only-feeds"))
+ return true;
+
+ if(!DataBase.readOnly().haveCategories()
+ && !FeedReaderBackend.get_default().supportTags()
+ && !DataBase.readOnly().haveFeedsWithoutCat())
+ return true;
+
+ return false;
+ }
+
+ public static void saveImageDialog(string imagePath)
+ {
+
+ try
+ {
+ string articleName = "Article.pdf";
+ string? articleID = ColumnView.get_default().displayedArticle();
+ if(articleID != null)
+ articleName = DataBase.readOnly().read_article(articleID).getTitle();
+
+ var file = GLib.File.new_for_path(imagePath);
+ var mimeType = file.query_info("standard::content-type", 0, null).get_content_type();
+ var filter = new Gtk.FileFilter();
+ filter.add_mime_type(mimeType);
+
+ var map = new Gee.HashMap<string, string>();
+ map.set("image/gif", ".gif");
+ map.set("image/jpeg", ".jpeg");
+ map.set("image/png", ".png");
+ map.set("image/x-icon", ".ico");
+
+ var save_dialog = new Gtk.FileChooserDialog("Save Image",
+ MainWindow.get_default(),
+ Gtk.FileChooserAction.SAVE,
+ _("Cancel"),
+ Gtk.ResponseType.CANCEL,
+ _("Save"),
+ Gtk.ResponseType.ACCEPT);
+ save_dialog.set_do_overwrite_confirmation(true);
+ save_dialog.set_modal(true);
+ save_dialog.set_current_folder(GLib.Environment.get_user_data_dir());
+ save_dialog.set_current_name(articleName + map.get(mimeType));
+ save_dialog.set_filter(filter);
+ save_dialog.response.connect((dialog, response_id) => {
+ switch(response_id)
{
- Logger.error("Error writing icon: %s".printf(e.message));
+ case Gtk.ResponseType.ACCEPT:
+ try
+ {
+ var savefile = save_dialog.get_file();
+ uint8[] data;
+ string etag;
+ file.load_contents(null, out data, out etag);
+ savefile.replace_contents(data, null, false, GLib.FileCreateFlags.REPLACE_DESTINATION, null, null);
+ }
+ catch(Error e)
+ {
+ Logger.debug("imagePopup: save file: " + e.message);
+ }
+ break;
+
+ case Gtk.ResponseType.CANCEL:
+ default:
+ break;
}
- return true;
- }
- Logger.error("Error downloading icon for feed: %s".printf(feed_id));
- return false;
+ save_dialog.destroy();
+ });
+ save_dialog.show();
}
- // file already exists
- return true;
+ catch(GLib.Error e)
+ {
+ Logger.error("Utils.saveImageDialog: %s".printf(e.message));
+ }
+ }
+
+ public static void playMedia(string[] args, string url)
+ {
+ Gtk.init(ref args);
+ Gst.init(ref args);
+ Logger.init(true);
+
+ var window = new Gtk.Window();
+ window.set_size_request(800, 600);
+ window.destroy.connect(Gtk.main_quit);
+ var header = new Gtk.HeaderBar();
+ header.show_close_button = true;
+
+ Gtk.CssProvider provider = new Gtk.CssProvider();
+ provider.load_from_resource("/org/gnome/FeedReader/gtk-css/basics.css");
+ weak Gdk.Display display = Gdk.Display.get_default();
+ weak Gdk.Screen screen = display.get_default_screen();
+ Gtk.StyleContext.add_provider_for_screen(screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_USER);
+
+ var player = new FeedReader.MediaPlayer(url);
+
+ window.add(player);
+ window.set_titlebar(header);
+ window.show_all();
+
+ Gtk.main();
+ }
+
+ public static Gtk.Image checkIcon(string name, string fallback, Gtk.IconSize size)
+ {
+ Gtk.Image icon = null;
+ if(Gtk.IconTheme.get_default().lookup_icon(name, 0, Gtk.IconLookupFlags.FORCE_SVG) != null)
+ icon = new Gtk.Image.from_icon_name(name, size);
+ else
+ icon = new Gtk.Image.from_icon_name(fallback, size);
+
+ return icon;
+ }
+
+ public static void openInGedit(string text)
+ {
+ try
+ {
+ string filename = "file:///tmp/FeedReader_crashed_html.txt";
+ FileUtils.set_contents(filename, text);
+ Gtk.show_uri_on_window(MainWindow.get_default(), filename, Gdk.CURRENT_TIME);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.error("Utils.openInGedit(): %s".printf(e.message));
+ }
+ }
+
+ public static uint getRelevantArticles()
+ {
+ var interfacestate = MainWindow.get_default().getInterfaceState();
+ string[] selectedRow = interfacestate.getFeedListSelectedRow().split(" ", 2);
+ ArticleListState state = interfacestate.getArticleListState();
+ string searchTerm = interfacestate.getSearchTerm();
+ string? topRow = interfacestate.getArticleListTopRow();
+
+ FeedListType IDtype = FeedListType.FEED;
+
+ Logger.debug("selectedRow 0: %s".printf(selectedRow[0]));
+ Logger.debug("selectedRow 1: %s".printf(selectedRow[1]));
+
+ switch(selectedRow[0])
+ {
+ case "feed":
+ IDtype = FeedListType.FEED;
+ break;
+
+ case "cat":
+ IDtype = FeedListType.CATEGORY;
+ break;
+
+ case "tag":
+ IDtype = FeedListType.TAG;
+ break;
+ }
+
+ int count = 0;
+
+ if(topRow != null)
+ count = DataBase.readOnly().getArticleCountNewerThanID(topRow, selectedRow[1], IDtype, state, searchTerm);
+
+ Logger.debug(@"getRelevantArticles: $count");
+ return count;
}
}
diff --git a/src/UtilsDaemon.vala b/src/UtilsDaemon.vala
deleted file mode 100644
index 497cbb57..00000000
--- a/src/UtilsDaemon.vala
+++ /dev/null
@@ -1,130 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.UtilsDaemon : GLib.Object {
-
- public static void generatePreviews(Gee.LinkedList<article> articles)
- {
- string noPreview = _("No Preview Available");
- foreach(var Article in articles)
- {
- if(!dbDaemon.get_default().article_exists(Article.getArticleID()))
- {
- if(Article.getPreview() != null && Article.getPreview() != "")
- {
- continue;
- }
- if(!dbDaemon.get_default().preview_empty(Article.getArticleID()))
- {
- continue;
- }
- else if(Article.getHTML() != "" && Article.getHTML() != null)
- {
- Logger.debug("Utils: generate preview for article: " + Article.getArticleID());
- string output = libVilistextum.parse(Article.getHTML(), 1);
- output = output.strip();
-
- if(output == "" || output == null)
- {
- Logger.error("generatePreviews: no Preview");
- Article.setPreview(noPreview);
- Article.setTitle(Utils.UTF8fix(Article.getTitle(), true));
- continue;
- }
-
- string xml = "<?xml";
-
- while(output.has_prefix(xml))
- {
- int end = output.index_of_char('>');
- output = output.slice(end+1, output.length).chug();
- output = output.strip();
- }
-
- output = output.replace("\n"," ");
- output = output.replace("_"," ");
-
- Article.setPreview(output.chug());
- }
- else
- {
- Logger.debug("no html to create preview from");
- Article.setPreview(noPreview);
- }
- Article.setTitle(Utils.UTF8fix(Article.getTitle(), true));
- }
- }
- }
-
- public static void checkHTML(Gee.LinkedList<article> articles)
- {
- foreach(var Article in articles)
- {
- if(!dbDaemon.get_default().article_exists(Article.getArticleID()))
- {
- string modified_html = _("No Text available for this article :(");
- if(Article.getHTML() != "")
- {
- modified_html = Article.getHTML().replace("src=\"//","src=\"http://");
- }
- Article.setHTML(modified_html);
- }
- }
- }
-
- public static uint getRelevantArticles(int newArticlesCount)
- {
- string[] selectedRow = {};
- ArticleListState state = ArticleListState.ALL;
- string searchTerm = "";
- selectedRow = Settings.state().get_string("feedlist-selected-row").split(" ", 2);
- state = (ArticleListState)Settings.state().get_enum("show-articles");
- if(Settings.tweaks().get_boolean("restore-searchterm"))
- searchTerm = Settings.state().get_string("search-term");
-
- FeedListType IDtype = FeedListType.FEED;
-
- Logger.debug("selectedRow 0: %s".printf(selectedRow[0]));
- Logger.debug("selectedRow 1: %s".printf(selectedRow[1]));
-
- switch(selectedRow[0])
- {
- case "feed":
- IDtype = FeedListType.FEED;
- break;
-
- case "cat":
- IDtype = FeedListType.CATEGORY;
- break;
-
- case "tag":
- IDtype = FeedListType.TAG;
- break;
- }
-
- var articles = dbDaemon.get_default().read_articles(
- selectedRow[1],
- IDtype,
- state,
- searchTerm,
- newArticlesCount,
- 0,
- newArticlesCount);
-
- Logger.debug("getRelevantArticles: %u".printf(articles.size));
- return articles.size;
- }
-
-}
diff --git a/src/UtilsUI.vala b/src/UtilsUI.vala
deleted file mode 100644
index 752871dc..00000000
--- a/src/UtilsUI.vala
+++ /dev/null
@@ -1,452 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.UtilsUI : GLib.Object {
-
-
- public static uint getRelevantArticles(int newArticlesCount)
- {
- string[] selectedRow = {};
- ArticleListState state = ArticleListState.ALL;
- string searchTerm = "";
- var interfacestate = MainWindow.get_default().getInterfaceState();
- selectedRow = interfacestate.getFeedListSelectedRow().split(" ", 2);
- state = interfacestate.getArticleListState();
- searchTerm = interfacestate.getSearchTerm();
-
- FeedListType IDtype = FeedListType.FEED;
-
- Logger.debug("selectedRow 0: %s".printf(selectedRow[0]));
- Logger.debug("selectedRow 1: %s".printf(selectedRow[1]));
-
- switch(selectedRow[0])
- {
- case "feed":
- IDtype = FeedListType.FEED;
- break;
-
- case "cat":
- IDtype = FeedListType.CATEGORY;
- break;
-
- case "tag":
- IDtype = FeedListType.TAG;
- break;
- }
-
- var articles = dbUI.get_default().read_articles(
- selectedRow[1],
- IDtype,
- state,
- searchTerm,
- newArticlesCount,
- 0,
- newArticlesCount);
-
- return articles.size;
- }
-
- public static string buildArticle(string html, string title, string url, string? author, string date, string feedID)
- {
- var article = new GLib.StringBuilder();
- string author_date = "";
- if(author != null)
- author_date += _("posted by: %s, ").printf(author);
-
- author_date += date;
-
- try
- {
- uint8[] contents;
- var file = File.new_for_uri("resource:///org/gnome/FeedReader/ArticleView/article.html");
- file.load_contents(null, out contents, null);
- article.assign((string)contents);
- }
- catch(GLib.Error e)
- {
- Logger.error("Utils.buildArticle: %s".printf(e.message));
- }
-
- string html_id = "$HTML";
- int html_pos = article.str.index_of(html_id);
- article.erase(html_pos, html_id.length);
- article.insert(html_pos, html);
-
- string author_id = "$AUTHOR";
- int author_pos = article.str.index_of(author_id);
- article.erase(author_pos, author_id.length);
- article.insert(author_pos, author_date);
-
- string title_id = "$TITLE";
- int title_pos = article.str.index_of(title_id);
- article.erase(title_pos, title_id.length);
- article.insert(title_pos, title);
-
- string url_id = "$URL";
- int url_pos = article.str.index_of(url_id);
- article.erase(url_pos, url_id.length);
- article.insert(url_pos, url);
-
- string feed_id = "$FEED";
- int feed_pos = article.str.index_of(feed_id);
- article.erase(feed_pos, feed_id.length);
- article.insert(feed_pos, dbUI.get_default().getFeedName(feedID));
-
-
- string theme = "theme ";
- switch(Settings.general().get_enum("article-theme"))
- {
- case ArticleTheme.DEFAULT:
- theme += "default";
- break;
-
- case ArticleTheme.SPRING:
- theme += "spring";
- break;
-
- case ArticleTheme.MIDNIGHT:
- theme += "midnight";
- break;
-
- case ArticleTheme.PARCHMENT:
- theme += "parchment";
- break;
- }
-
- string theme_id = "$THEME";
- int theme_pos = article.str.index_of(theme_id);
- article.erase(theme_pos, theme_id.length);
- article.insert(theme_pos, theme);
-
- string select_id = "$UNSELECTABLE";
- int select_pos = article.str.index_of(select_id);
-
- if(Settings.tweaks().get_boolean("article-select-text"))
- {
- article.erase(select_pos-1, select_id.length+1);
- }
- else
- {
- article.erase(select_pos, select_id.length);
- article.insert(select_pos, "unselectable");
- }
-
-
- string fontsize = "intial";
- string sourcefontsize = "0.75rem";
- switch(Settings.general().get_enum("fontsize"))
- {
- case FontSize.SMALL:
- fontsize = "smaller";
- sourcefontsize = "0.5rem";
- break;
-
- case FontSize.NORMAL:
- fontsize = "medium";
- sourcefontsize = "0.75rem";
- break;
-
- case FontSize.LARGE:
- fontsize = "large";
- sourcefontsize = "1.0rem";
- break;
-
- case FontSize.HUGE:
- fontsize = "xx-large";
- sourcefontsize = "1.2rem";
- break;
- }
-
- string fontsize_id = "$FONTSIZE";
- string sourcefontsize_id = "$SOURCEFONTSIZE";
- int fontsize_pos = article.str.index_of(fontsize_id);
- article.erase(fontsize_pos, fontsize_id.length);
- article.insert(fontsize_pos, fontsize);
-
- for(int i = article.str.index_of(sourcefontsize_id, 0); i != -1; i = article.str.index_of(sourcefontsize_id, i))
- {
- article.erase(i, sourcefontsize_id.length);
- article.insert(i, sourcefontsize);
- }
-
-
- try
- {
- uint8[] contents;
- var file = File.new_for_uri("resource:///org/gnome/FeedReader/ArticleView/style.css");
- file.load_contents(null, out contents, null);
- string css_id = "$CSS";
- int css_pos = article.str.index_of(css_id);
- article.erase(css_pos, css_id.length);
- article.insert(css_pos, (string)contents);
- }
- catch(GLib.Error e)
- {
- Logger.error("Utils.buildArticle: load CSS: " + e.message);
- }
-
-
- return article.str;
- }
-
- public static bool canManipulateContent(bool? online = null)
- {
- try
- {
- // if backend = local RSS -> return true;
- if(Settings.general().get_string("plugin") == "local")
- return true;
-
- if(!DBusConnection.get_default().supportFeedManipulation())
- return false;
-
- // when we already know wheather feedreader is online or offline
- if(online != null)
- {
- if(online)
- return true;
- else
- return false;
- }
-
- // otherwise check if online
- return DBusConnection.get_default().isOnline();
- }
- catch(GLib.Error e)
- {
- Logger.error("UtilsUI.canManipulateContent: %s".printf(e.message));
- }
-
- return false;
- }
-
- public static GLib.Menu getMenu()
- {
- var urlMenu = new GLib.Menu();
- urlMenu.append(Menu.bugs, "win.bugs");
- urlMenu.append(Menu.bounty, "win.bounty");
-
- var aboutMenu = new GLib.Menu();
- aboutMenu.append(Menu.shortcuts, "win.shortcuts");
- aboutMenu.append(Menu.about, "win.about");
- aboutMenu.append(Menu.quit, "app.quit");
-
- var menu = new GLib.Menu();
- menu.append(Menu.settings, "win.settings");
- menu.append(Menu.reset, "win.reset");
- menu.append_section("", urlMenu);
-
- if(GLib.Environment.get_variable("XDG_CURRENT_DESKTOP").down() != "pantheon")
- {
- menu.append_section("", aboutMenu);
- }
-
- return menu;
- }
-
- public static bool onlyShowFeeds()
- {
- if(Settings.general().get_boolean("only-feeds"))
- return true;
-
- try
- {
- if(!dbUI.get_default().haveCategories()
- && !DBusConnection.get_default().supportTags()
- && !dbUI.get_default().haveFeedsWithoutCat())
- return true;
- }
- catch(GLib.Error e)
- {
- Logger.error("UtilsUI.onlyShowFeeds: %s".printf(e.message));
- }
-
- return false;
- }
-
- public static void saveImageDialog(string imagePath)
- {
-
- try
- {
- string articleName = "Article.pdf";
- string? articleID = ColumnView.get_default().displayedArticle();
- if(articleID != null)
- articleName = dbUI.get_default().read_article(articleID).getTitle();
-
- var file = GLib.File.new_for_path(imagePath);
- var mimeType = file.query_info("standard::content-type", 0, null).get_content_type();
- var filter = new Gtk.FileFilter();
- filter.add_mime_type(mimeType);
-
- var map = new Gee.HashMap<string, string>();
- map.set("image/gif", ".gif");
- map.set("image/jpeg", ".jpeg");
- map.set("image/png", ".png");
- map.set("image/x-icon", ".ico");
-
- var save_dialog = new Gtk.FileChooserDialog("Save Image",
- MainWindow.get_default(),
- Gtk.FileChooserAction.SAVE,
- _("Cancel"),
- Gtk.ResponseType.CANCEL,
- _("Save"),
- Gtk.ResponseType.ACCEPT);
- save_dialog.set_do_overwrite_confirmation(true);
- save_dialog.set_modal(true);
- save_dialog.set_current_folder(GLib.Environment.get_user_data_dir());
- save_dialog.set_current_name(articleName + map.get(mimeType));
- save_dialog.set_filter(filter);
- save_dialog.response.connect((dialog, response_id) => {
- switch(response_id)
- {
- case Gtk.ResponseType.ACCEPT:
- try
- {
- var savefile = save_dialog.get_file();
- uint8[] data;
- string etag;
- file.load_contents(null, out data, out etag);
- savefile.replace_contents(data, null, false, GLib.FileCreateFlags.REPLACE_DESTINATION, null, null);
- }
- catch(Error e)
- {
- Logger.debug("imagePopup: save file: " + e.message);
- }
- break;
-
- case Gtk.ResponseType.CANCEL:
- default:
- break;
- }
- save_dialog.destroy();
- });
- save_dialog.show();
- }
- catch(GLib.Error e)
- {
- Logger.error("UtilsUI.saveImageDialog: %s".printf(e.message));
- }
- }
-
- public static void playMedia(string[] args, string url)
- {
- Gtk.init(ref args);
- Gst.init(ref args);
- Logger.init("mediaPlayer");
-
- var window = new Gtk.Window();
- window.set_size_request(800, 600);
- window.destroy.connect(Gtk.main_quit);
- var header = new Gtk.HeaderBar();
- header.show_close_button = true;
-
- Gtk.CssProvider provider = new Gtk.CssProvider();
- provider.load_from_resource("/org/gnome/FeedReader/gtk-css/basics.css");
- weak Gdk.Display display = Gdk.Display.get_default();
- weak Gdk.Screen screen = display.get_default_screen();
- Gtk.StyleContext.add_provider_for_screen(screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_USER);
-
- var player = new FeedReader.MediaPlayer(url);
-
- window.add(player);
- window.set_titlebar(header);
- window.show_all();
-
- Gtk.main();
- }
-
- public static Gtk.Image checkIcon(string name, string fallback, Gtk.IconSize size)
- {
- Gtk.Image icon = null;
- if(Gtk.IconTheme.get_default().lookup_icon(name, 0, Gtk.IconLookupFlags.FORCE_SVG) != null)
- icon = new Gtk.Image.from_icon_name(name, size);
- else
- icon = new Gtk.Image.from_icon_name(fallback, size);
-
- return icon;
- }
-
- public static void openInGedit(string text)
- {
- try
- {
- string filename = "file:///tmp/FeedReader_crashed_html.txt";
- FileUtils.set_contents(filename, text);
- Gtk.show_uri_on_window(MainWindow.get_default(), filename, Gdk.CURRENT_TIME);
- }
- catch(GLib.Error e)
- {
- Logger.error("Utils.openInGedit(): %s".printf(e.message));
- }
- }
-
- /*public static void testGOA()
- {
- try
- {
- Goa.Client? client = new Goa.Client.sync();
-
- if(client != null)
- {
- var accounts = client.get_accounts();
- foreach(var object in accounts)
- {
- stdout.printf("account type: %s\n", object.account.provider_type);
- stdout.printf("account name: %s\n", object.account.provider_name);
- stdout.printf("account identity: %s\n", object.account.identity);
- stdout.printf("account id: %s\n", object.account.id);
-
- if(object.oauth2_based != null)
- {
- string access_token = "";
- int expires = -1;
- object.oauth2_based.call_get_access_token_sync(out access_token, out expires);
- stdout.printf("access token 2: %s\n", access_token);
- stdout.printf("expires in: %i\n", expires);
- stdout.printf("client id: %s\n", object.oauth2_based.client_id);
- stdout.printf("client secret: %s\n", object.oauth2_based.client_secret);
- }
- else if(object.oauth_based != null)
- {
- string access_token = "";
- string access_token_secret = "";
- int expires = -1;
- object.oauth_based.call_get_access_token_sync(out access_token, out access_token_secret, out expires);
- stdout.printf("access token: %s\n", access_token);
- stdout.printf("access token secret: %s\n", access_token_secret);
- stdout.printf("expires in: %i\n", expires);
- }
- else if(object.password_based != null)
- {
- string password = "";
- object.password_based.call_get_password_sync ("abc", out password);
- stdout.printf("password: %s\n", password);
- stdout.printf("presentation identity: %s\n", object.account.presentation_identity);
- }
- stdout.printf("\n");
- }
- }
- else
- {
- stdout.printf("goa not available");
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("UtilsUI.testGOA: %s".printf(e.message));
- }
- }*/
-}
diff --git a/src/Widgets/AddPopover.vala b/src/Widgets/AddPopover.vala
index 0afac609..b1ccd555 100644
--- a/src/Widgets/AddPopover.vala
+++ b/src/Widgets/AddPopover.vala
@@ -23,7 +23,7 @@ public class FeedReader.AddPopover : Gtk.Popover {
private Gtk.Entry m_catEntry;
private Gtk.FileChooserButton m_chooser;
private Gtk.EntryCompletion m_complete;
- private Gee.ArrayList<category> m_cats;
+ private Gee.List<Category> m_cats;
public AddPopover(Gtk.Widget parent)
{
@@ -62,9 +62,9 @@ public class FeedReader.AddPopover : Gtk.Popover {
m_feedGrid.attach(m_catEntry, 1, 1, 1, 1);
m_feedGrid.attach(addButton, 0, 2, 2, 1);
- var opmlLabel = new Gtk.Label(_("OPML-File:"));
+ var opmlLabel = new Gtk.Label(_("OPML File:"));
opmlLabel.expand = true;
- m_chooser = new Gtk.FileChooserButton(_("Select OPML-file"), Gtk.FileChooserAction.OPEN);
+ m_chooser = new Gtk.FileChooserButton(_("Select OPML File"), Gtk.FileChooserAction.OPEN);
var filter = new Gtk.FileFilter();
filter.add_mime_type("text/x-opml");
m_chooser.set_filter(filter);
@@ -108,7 +108,7 @@ public class FeedReader.AddPopover : Gtk.Popover {
GLib.Idle.add(() => {
Gtk.ListStore list_store = new Gtk.ListStore(1, typeof (string));
Gtk.TreeIter iter;
- m_cats = dbUI.get_default().read_categories();
+ m_cats = DataBase.readOnly().read_categories();
foreach(var cat in m_cats)
{
@@ -125,13 +125,14 @@ public class FeedReader.AddPopover : Gtk.Popover {
private void addFeed()
{
- if(m_urlEntry.text == "" || GLib.Uri.parse_scheme(m_urlEntry.text) == null)
+ if(m_urlEntry.text == ""
+ || GLib.Uri.parse_scheme(m_urlEntry.text) == null)
{
m_urlEntry.grab_focus();
return;
}
- string? catID = dbUI.get_default().getCategoryID(m_catEntry.text);
+ string? catID = DataBase.readOnly().getCategoryID(m_catEntry.text);
bool isID = true;
if(catID == null)
@@ -141,14 +142,7 @@ public class FeedReader.AddPopover : Gtk.Popover {
}
Logger.debug("addFeed: %s, %s".printf(m_urlEntry.text, (catID == "") ? "null" : catID));
- try
- {
- DBusConnection.get_default().addFeed(m_urlEntry.text, catID, isID);
- }
- catch(Error e)
- {
- Logger.error("AddPopover.addFeed: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().addFeed(m_urlEntry.text, catID, isID, true);
setBusy();
}
@@ -162,7 +156,7 @@ public class FeedReader.AddPopover : Gtk.Popover {
uint8[] contents;
file.load_contents (null, out contents, null);
Logger.debug((string)contents);
- DBusConnection.get_default().importOPML((string)contents);
+ FeedReaderBackend.get_default().importOPML((string)contents);
}
catch(GLib.Error e)
{
diff --git a/src/Widgets/ArticleList/ArticleList.vala b/src/Widgets/ArticleList/ArticleList.vala
index a6fb620a..8e174ccb 100644
--- a/src/Widgets/ArticleList/ArticleList.vala
+++ b/src/Widgets/ArticleList/ArticleList.vala
@@ -39,7 +39,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
private ulong m_handlerID2 = 0;
private ulong m_handlerID3 = 0;
- public signal void row_activated(articleRow? row);
+ public signal void row_activated(ArticleRow? row);
public ArticleList()
{
@@ -113,7 +113,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
}
m_height = allocation.height;
}
- });
+ });
}
public async void newList(Gtk.StackTransitionType transition = Gtk.StackTransitionType.CROSSFADE)
@@ -128,11 +128,8 @@ public class FeedReader.ArticleList : Gtk.Overlay {
Logger.debug("ArticleList: disallow signals from scroll");
m_currentScroll.allowSignals(false);
- var articles = new Gee.LinkedList<article>();
+ Gee.List<Article> articles = new Gee.LinkedList<Article>();
uint offset = 0;
- bool newArticles = false;
- if(Settings.state().get_int("articlelist-new-rows") > 0 && m_state == ArticleListState.ALL)
- newArticles = true;
SourceFunc callback = newList.callback;
//-----------------------------------------------------------------------------------------------------------------------------------------------------
ThreadFunc<void*> run = () => {
@@ -141,7 +138,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
offset = getListOffset();
Logger.debug("load articles from db");
- articles = dbUI.get_default().read_articles(m_selectedFeedListID,
+ articles = DataBase.readOnly().read_articles(m_selectedFeedListID,
m_selectedFeedListType,
m_state,
m_searchTerm,
@@ -159,6 +156,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
if(articles.size == 0)
{
+ m_currentList.emptyList();
Logger.debug("ArticleList: no content, so allow signals from scroll again");
m_currentScroll.allowSignals(true);
if(offset == 0)
@@ -205,8 +203,6 @@ public class FeedReader.ArticleList : Gtk.Overlay {
restoreScrollPos();
Logger.debug("ArticleList: allow signals from scroll");
m_currentScroll.allowSignals(true);
- if(newArticles)
- showNotification();
if(m_handlerID1 != 0)
{
@@ -243,14 +239,14 @@ public class FeedReader.ArticleList : Gtk.Overlay {
if(m_loadThread != null)
m_loadThread.join();
- var articles = new Gee.LinkedList<article>();
+ Gee.List<Article> articles = new Gee.LinkedList<Article>();
SourceFunc callback = loadMore.callback;
//-----------------------------------------------------------------------------------------------------------------------------------------------------
ThreadFunc<void*> run = () => {
Logger.debug("load articles from db");
- uint offset = m_currentList.getSize() + determineNewRowCount(null, null);
+ uint offset = m_currentList.getSizeForState() + determineNewRowCount(null, null);
- articles = dbUI.get_default().read_articles(m_selectedFeedListID,
+ articles = DataBase.readOnly().read_articles(m_selectedFeedListID,
m_selectedFeedListType,
m_state,
m_searchTerm,
@@ -268,10 +264,11 @@ public class FeedReader.ArticleList : Gtk.Overlay {
if(articles.size > 0)
{
- m_scroll2.valueChanged.disconnect(updateVisibleRows);
+ m_currentScroll.valueChanged.disconnect(updateVisibleRows);
m_currentList.addBottom(articles);
m_handlerID2 = m_currentList.loadDone.connect(() => {
- m_scroll2.valueChanged.connect(updateVisibleRows);
+ m_currentScroll.startScrolledDownCooldown();
+ m_currentScroll.valueChanged.connect(updateVisibleRows);
if(m_handlerID2 != 0)
{
@@ -280,6 +277,10 @@ public class FeedReader.ArticleList : Gtk.Overlay {
}
});
}
+ else
+ {
+ m_currentScroll.startScrolledDownCooldown();
+ }
}
private async void loadNewer(int newCount, int offset)
@@ -288,12 +289,12 @@ public class FeedReader.ArticleList : Gtk.Overlay {
if(m_loadThread != null)
m_loadThread.join();
- var articles = new Gee.LinkedList<article>();
+ Gee.List<Article> articles = new Gee.LinkedList<Article>();
SourceFunc callback = loadNewer.callback;
//-----------------------------------------------------------------------------------------------------------------------------------------------------
ThreadFunc<void*> run = () => {
Logger.debug("load articles from db");
- articles = dbUI.get_default().read_articles(m_selectedFeedListID,
+ articles = DataBase.readOnly().read_articles(m_selectedFeedListID,
m_selectedFeedListType,
m_state,
m_searchTerm,
@@ -319,10 +320,10 @@ public class FeedReader.ArticleList : Gtk.Overlay {
m_stack.set_visible_child_full("list2", Gtk.StackTransitionType.CROSSFADE);
}
- m_scroll2.valueChanged.disconnect(updateVisibleRows);
+ m_currentScroll.valueChanged.disconnect(updateVisibleRows);
m_currentList.addTop(articles);
m_handlerID3 = m_currentList.loadDone.connect(() => {
- m_scroll2.valueChanged.connect(updateVisibleRows);
+ m_currentScroll.valueChanged.connect(updateVisibleRows);
if(m_handlerID3 != 0)
{
@@ -355,80 +356,65 @@ public class FeedReader.ArticleList : Gtk.Overlay {
if(m_loadThread != null)
m_loadThread.join();
+ m_currentList.setAllUpdated(false);
+ var articles = DataBase.readOnly().read_article_stats(m_currentList.getIDs());
var children = m_currentList.get_children();
- uint listSize = children.length();
- string? firstRowID = m_currentList.getFirstRowID();
- int newCount = 0;
- if(firstRowID == null)
- return;
-
- var articles = new Gee.LinkedList<article>();
- SourceFunc callback = updateArticleList.callback;
- //-----------------------------------------------------------------------------------------------------------------------------------------------------
- ThreadFunc<void*> run = () => {
- Logger.debug("load articles from db");
- newCount = dbUI.get_default().getArticleCountNewerThanID(
- firstRowID,
- m_selectedFeedListID,
- m_selectedFeedListType,
- m_state,
- m_searchTerm);
- articles = dbUI.get_default().read_articles(m_selectedFeedListID,
- m_selectedFeedListType,
- m_state,
- m_searchTerm,
- listSize,
- newCount);
- Logger.debug("actual articles loaded: " + articles.size.to_string());
+ foreach(var row in children)
+ {
+ var tmpRow = row as ArticleRow;
+ if(tmpRow != null && articles.has_key(tmpRow.getID()))
+ {
+ var a = articles.get(tmpRow.getID());
+ tmpRow.updateUnread(a.getUnread());
+ tmpRow.updateMarked(a.getMarked());
+ tmpRow.setUpdated(true);
+ }
+ }
- Idle.add((owned) callback, GLib.Priority.HIGH_IDLE);
- return null;
- };
- //-----------------------------------------------------------------------------------------------------------------------------------------------------
+ m_currentList.removeObsoleteRows();
+ int length = (int)m_currentList.get_children().length();
- m_loadThread = new GLib.Thread<void*>("create", run);
- yield;
-
- if(articles.size != 0)
+ for(int i = 1; i < length; i++)
{
- var iterator = articles.list_iterator();
-
- foreach(var row in children)
+ ArticleRow? first = m_currentList.get_row_at_index(i-1) as ArticleRow;
+ ArticleRow? second = m_currentList.get_row_at_index(i) as ArticleRow;
+
+ if(first == null
+ || second == null)
+ continue;
+
+ var insertArticles = DataBase.readOnly().read_article_between( m_selectedFeedListID,
+ m_selectedFeedListType,
+ m_state,
+ m_searchTerm,
+ first.getID(),
+ first.getDate(),
+ second.getID(),
+ second.getDate());
+
+ foreach(Article a in insertArticles)
{
- iterator.next();
- var articleRow = row as articleRow;
- var article = iterator.get();
-
- if(articleRow.getID() == article.getArticleID())
+ if(m_currentList.insertArticle(a, i))
{
- articleRow.updateUnread(article.getUnread());
- articleRow.updateMarked(article.getMarked());
- }
- else
- {
- Logger.error("ArticleList.updateArticleList: id mismatch");
+ i++;
+ length++;
}
}
}
-
-
- Logger.debug(@"ArticleList.updateArticleList: newCount $newCount");
-
- if(newCount > 0)
- checkForNewRows();
+ checkForNewRows();
}
private int determineNewRowCount(int? newCount, out int? offset)
{
int count = 0;
- string? firstRowID = m_currentList.getFirstRowID();
+ ArticleRow? firstRow = m_currentList.getFirstRow();
- if(firstRowID != null)
+ if(firstRow != null)
{
- count = dbUI.get_default().getArticleCountNewerThanID(
- firstRowID,
+ count = DataBase.readOnly().getArticleCountNewerThanID(
+ firstRow.getArticle().getArticleID(),
m_selectedFeedListID,
m_selectedFeedListType,
m_state,
@@ -456,7 +442,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
m_scrollChangedTimeout = 0;
}
- // remove lower articleRows only after scrolling up
+ // remove lower ArticleRows only after scrolling up
if(direction == ScrollDirection.UP)
{
m_scrollChangedTimeout = GLib.Timeout.add(500, () => {
@@ -466,7 +452,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
foreach(var r in children)
{
- var row = r as articleRow;
+ var row = r as ArticleRow;
if(row != null)
{
if(m_currentScroll.isVisible(row, m_dynamicRowThreshold) == 1)
@@ -495,7 +481,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
foreach(var r in children)
{
- var row = r as articleRow;
+ var row = r as ArticleRow;
if(row != null)
{
int visible = m_currentScroll.isVisible(row);
@@ -562,7 +548,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
return;
m_overlay = new InAppNotification.withIcon(
- _("New Articles"),
+ _("New articles"),
"feed-arrow-up-symbolic",
_("scroll up"));
m_overlay.action.connect(() => {
@@ -581,21 +567,30 @@ public class FeedReader.ArticleList : Gtk.Overlay {
m_overlay.dismiss();
}
- public string getSelectedArticle()
+ public Article? getSelectedArticle()
{
if(m_stack.get_visible_child_name() == "empty"
|| m_stack.get_visible_child_name() == "syncing")
- return "empty";
+ return null;
return m_currentList.getSelectedArticle();
}
- public bool toggleReadSelected()
+ public Article? getFirstArticle()
+ {
+ ArticleRow? selectedRow = m_currentList.getFirstRow();
+ if(selectedRow == null)
+ return null;
+
+ return selectedRow.getArticle();
+ }
+
+ public ArticleStatus toggleReadSelected()
{
return m_currentList.toggleReadSelected();
}
- public bool toggleMarkedSelected()
+ public ArticleStatus toggleMarkedSelected()
{
return m_currentList.toggleMarkedSelected();
}
@@ -615,7 +610,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
var children = m_currentList.get_children();
foreach(var row in children)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null)
{
var height = tmpRow.get_allocated_height();
@@ -640,11 +635,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
private uint getListOffset()
{
uint offset = (uint)Settings.state().get_int("articlelist-row-offset");
- Logger.debug("ArticleList: new-rows %i".printf(Settings.state().get_int("articlelist-new-rows")));
- if(m_state == ArticleListState.ALL)
- offset += (uint)Settings.state().get_int("articlelist-new-rows");
Settings.state().set_int("articlelist-row-offset", 0);
- Settings.state().set_int("articlelist-new-rows", 0);
return offset;
}
@@ -737,26 +728,19 @@ public class FeedReader.ArticleList : Gtk.Overlay {
m_currentList.markAllAsRead();
}
- public ArticleStatus getSelectedArticleMarked()
- {
- return m_currentList.getSelectedArticleMarked();
- }
-
- public ArticleStatus getSelectedArticleRead()
- {
- return m_currentList.getSelectedArticleRead();
- }
-
public void openSelected()
{
- string selectedURL = m_currentList.selectedURL();
- try
+ Article? selectedArticle = m_currentList.getSelectedArticle();
+ if(selectedArticle != null)
{
- Gtk.show_uri_on_window(MainWindow.get_default(), selectedURL, Gdk.CURRENT_TIME);
- }
- catch(GLib.Error e)
- {
- Logger.debug("could not open the link in an external browser: %s".printf(e.message));
+ try
+ {
+ Gtk.show_uri_on_window(MainWindow.get_default(), selectedArticle.getURL(), Gdk.CURRENT_TIME);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.debug("could not open the link in an external browser: %s".printf(e.message));
+ }
}
}
@@ -780,7 +764,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
public void syncFinished()
{
m_syncing = false;
- if(m_stack.get_visible_child_name() == "syncing" && UtilsUI.getRelevantArticles(20) == 0)
+ if(m_stack.get_visible_child_name() == "syncing" && Utils.getRelevantArticles() == 0)
{
m_stack.set_visible_child_full("empty", Gtk.StackTransitionType.CROSSFADE);
}
@@ -788,7 +772,7 @@ public class FeedReader.ArticleList : Gtk.Overlay {
private void rowActivated(Gtk.ListBoxRow row)
{
- row_activated((articleRow)row);
+ row_activated((ArticleRow)row);
}
public void clear()
diff --git a/src/Widgets/ArticleList/ArticleListBox.vala b/src/Widgets/ArticleList/ArticleListBox.vala
index b1d90f9b..041a429f 100644
--- a/src/Widgets/ArticleList/ArticleListBox.vala
+++ b/src/Widgets/ArticleList/ArticleListBox.vala
@@ -15,7 +15,7 @@
public class FeedReader.ArticleListBox : Gtk.ListBox {
- private Gee.LinkedList<article> m_lazyQeue;
+ private Gee.List<Article> m_lazyQeue;
private uint m_idleID = 0;
private string m_name;
private uint m_selectSourceID = 0;
@@ -23,7 +23,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
private FeedListType m_selectedFeedListType = FeedListType.FEED;
private string m_selectedFeedListID = FeedID.ALL.to_string();
private string m_selectedArticle = "";
- private Gee.HashSet<string> m_articles;
+ private Gee.HashMap<string, ArticleRow> m_articles;
private Gee.HashSet<string> m_visibleArticles;
public signal void balanceNextScroll(ArticleListBalance mode);
@@ -32,45 +32,59 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
public ArticleListBox(string name)
{
m_name = name;
- m_lazyQeue = new Gee.LinkedList<article>();
- m_articles = new Gee.HashSet<string>();
+ m_lazyQeue = new Gee.LinkedList<Article>();
+ m_articles = new Gee.HashMap<string, ArticleRow>();
m_visibleArticles = new Gee.HashSet<string>();
this.set_selection_mode(Gtk.SelectionMode.BROWSE);
this.row_activated.connect(rowActivated);
}
- public void newList(Gee.LinkedList<article> articles)
+ public void newList(Gee.List<Article> articles)
{
stopLoading();
emptyList();
+ setPos(articles, -1);
m_lazyQeue = articles;
addRow(ArticleListBalance.NONE);
}
- public void addTop(Gee.LinkedList<article> articles)
+ public void addTop(Gee.List<Article> articles)
{
stopLoading();
+ setPos(articles, 0);
m_lazyQeue = articles;
- addRow(ArticleListBalance.TOP, 0, true);
+ addRow(ArticleListBalance.TOP, true);
}
- public void addBottom(Gee.LinkedList<article> articles)
+ public void addBottom(Gee.List<Article> articles)
{
stopLoading();
+ setPos(articles, -1);
m_lazyQeue = articles;
addRow(ArticleListBalance.NONE);
}
- private void stopLoading()
+ private bool stopLoading()
{
if(m_idleID > 0)
{
GLib.Source.remove(m_idleID);
m_idleID = 0;
+ return true;
}
+
+ return false;
}
- private void addRow(ArticleListBalance balance, int pos = -1, bool reverse = false, bool animate = false)
+ private void setPos(Gee.List<Article> articles, int pos)
+ {
+ foreach(Article a in articles)
+ {
+ a.setPos(pos);
+ }
+ }
+
+ private void addRow(ArticleListBalance balance, bool reverse = false, bool animate = false)
{
if(m_lazyQeue.size == 0)
{
@@ -88,7 +102,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
if(m_lazyQeue == null || m_lazyQeue.size == 0)
return false;
- article item;
+ Article item;
if(reverse)
item = m_lazyQeue.last();
@@ -96,20 +110,19 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
item = m_lazyQeue.first();
// check if row is already there
- if(m_articles.contains(item.getArticleID()))
+ if(m_articles.has_key(item.getArticleID()))
{
- Logger.warning(@"ArticleListbox$m_name: row with ID %s is already present".printf(item.getArticleID()));
- checkQueue(item, balance, pos, reverse, animate);
+ Logger.debug(@"ArticleListbox$m_name: row with ID %s is already present".printf(item.getArticleID()));
+ checkQueue(item, balance, reverse, animate);
return false;
}
- m_articles.add(item.getArticleID());
balanceNextScroll(balance);
- var newRow = new articleRow(item);
+ var newRow = new ArticleRow(item);
newRow.rowStateChanged.connect(rowStateChanged);
newRow.drag_begin.connect((widget, context) => {
- highlightRow((widget as articleRow).getID());
+ highlightRow((widget as ArticleRow).getID());
drag_begin(context);
});
newRow.drag_end.connect((widget, context) => {
@@ -122,10 +135,12 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
});
newRow.realize.connect(() => {
- checkQueue(item, balance, pos, reverse, animate);
+ checkQueue(item, balance, reverse, animate);
});
- this.insert(newRow, pos);
+ m_articles.set(item.getArticleID(), newRow);
+
+ this.insert(newRow, item.getPos());
if(animate)
newRow.reveal(true, 150);
@@ -136,17 +151,17 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
}, priority);
}
- private void checkQueue(article item, ArticleListBalance balance, int pos = -1, bool reverse = false, bool animate = false)
+ private void checkQueue(Article item, ArticleListBalance balance, bool reverse = false, bool animate = false)
{
if(m_lazyQeue.size > 1)
{
m_lazyQeue.remove(item);
- addRow(balance, pos, reverse, animate);
+ addRow(balance, reverse, animate);
}
else
{
Logger.debug(@"ArticleListbox$m_name: all articles added to the list");
- m_lazyQeue = new Gee.LinkedList<article>();
+ m_lazyQeue = new Gee.LinkedList<Article>();
GLib.Timeout.add(150, () => {
Logger.debug(@"ArticleListbox$m_name: loadDone()");
loadDone();
@@ -177,109 +192,71 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
m_selectedFeedListType = type;
}
- private void selectAfter(articleRow row, int time)
+ private void selectAfter(ArticleRow row, int time)
{
this.select_row(row);
setRead(row);
if(m_selectSourceID > 0)
{
- GLib.Source.remove(m_selectSourceID);
- m_selectSourceID = 0;
- }
+ GLib.Source.remove(m_selectSourceID);
+ m_selectSourceID = 0;
+ }
- m_selectSourceID = Timeout.add(time, () => {
+ m_selectSourceID = Timeout.add(time, () => {
if(!ColumnView.get_default().searchFocused())
- row.activate();
+ row.activate();
m_selectSourceID = 0;
- return false;
- });
+ return false;
+ });
}
- private void setRead(articleRow row)
+ private void setRead(ArticleRow row)
{
- try
+ if(row.getArticle().getUnread() == ArticleStatus.UNREAD)
{
- if(row.isUnread())
- {
- row.updateUnread(ArticleStatus.READ);
- DBusConnection.get_default().changeArticle(row.getID(), ArticleStatus.READ);
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("ArticleListBox.setRead: %s".printf(e.message));
+ row.updateUnread(ArticleStatus.READ);
+ FeedReaderBackend.get_default().updateArticleRead(row.getArticle());
}
}
- public bool toggleReadSelected()
+ public ArticleStatus toggleReadSelected()
{
- articleRow selectedRow = this.get_selected_row() as articleRow;
+ ArticleRow selectedRow = this.get_selected_row() as ArticleRow;
if(selectedRow == null)
- return false;
+ return ArticleStatus.READ;
return selectedRow.toggleUnread();
}
- public bool toggleMarkedSelected()
+ public ArticleStatus toggleMarkedSelected()
{
- articleRow selectedRow = this.get_selected_row() as articleRow;
+ ArticleRow selectedRow = this.get_selected_row() as ArticleRow;
if(selectedRow == null)
- return false;
+ return ArticleStatus.UNMARKED;
return selectedRow.toggleMarked();
}
- public string selectedURL()
- {
- articleRow selectedRow = this.get_selected_row() as articleRow;
-
- if(selectedRow == null)
- return "";
-
- return selectedRow.getURL();
- }
-
public void setState(ArticleListState state)
{
m_state = state;
}
- public string getSelectedArticle()
- {
- articleRow selectedRow = this.get_selected_row() as articleRow;
- if(selectedRow != null)
- return selectedRow.getID();
-
- if(this.get_children().length() == 0)
- return "empty";
-
- return "";
- }
-
- public ArticleStatus getSelectedArticleMarked()
- {
- articleRow selectedRow = this.get_selected_row() as articleRow;
- if(selectedRow != null)
- return selectedRow.getMarked();
-
- return ArticleStatus.UNMARKED;
- }
-
- public ArticleStatus getSelectedArticleRead()
+ public Article? getSelectedArticle()
{
- articleRow selectedRow = this.get_selected_row() as articleRow;
+ ArticleRow selectedRow = this.get_selected_row() as ArticleRow;
if(selectedRow != null)
- return selectedRow.getUnread();
+ return selectedRow.getArticle();
- return ArticleStatus.READ;
+ return null;
}
public string getSelectedURL()
{
- articleRow selectedRow = this.get_selected_row() as articleRow;
+ ArticleRow selectedRow = this.get_selected_row() as ArticleRow;
if(selectedRow != null)
return selectedRow.getURL();
@@ -292,16 +269,10 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
public int move(bool down)
{
int time = 300;
- var sel = getSelectedArticle();
- if(sel == "empty")
- {
- Logger.debug("ArticleListBox is empty -> do nothing");
- return 0;
- }
- else if(sel == "")
+ Article? sel = getSelectedArticle();
+ if(sel == null)
{
- Logger.debug("ArticleListBox: no row selected -> select first");
- var firstRow = getFirstRow();
+ ArticleRow? firstRow = getFirstRow();
if(firstRow == null)
return 0;
else
@@ -311,9 +282,9 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
}
}
- var selectedRow = this.get_selected_row() as articleRow;
+ var selectedRow = this.get_selected_row() as ArticleRow;
var height = selectedRow.get_allocated_height();
- articleRow nextRow = null;
+ ArticleRow nextRow = null;
var rows = this.get_children();
@@ -329,7 +300,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
if(current >= length)
return 0;
- nextRow = rows.nth_data(current) as articleRow;
+ nextRow = rows.nth_data(current) as ArticleRow;
}
while(!nextRow.isBeingRevealed());
@@ -343,20 +314,21 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
return -height;
}
- public void removeRow(articleRow row, int animateDuration = 700)
+ public void removeRow(ArticleRow row, int animateDuration = 700)
{
var id = row.getID();
row.reveal(false, animateDuration);
- m_articles.remove(id);
+ m_articles.unset(id);
GLib.Timeout.add(animateDuration + 50, () => {
- this.remove(row);
+ if(row.get_parent() != null)
+ this.remove(row);
return false;
});
}
private void rowActivated(Gtk.ListBoxRow row)
{
- var selectedRow = (articleRow)row;
+ var selectedRow = (ArticleRow)row;
string selectedID = selectedRow.getID();
setRead(selectedRow);
@@ -367,11 +339,11 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
var articleChildList = this.get_children();
foreach(Gtk.Widget r in articleChildList)
{
- var tmpRow = r as articleRow;
+ var tmpRow = r as ArticleRow;
if(tmpRow != null && tmpRow.isBeingRevealed())
{
- if((!tmpRow.isUnread() && m_state == ArticleListState.UNREAD)
- || (!tmpRow.isMarked() && m_state == ArticleListState.MARKED)
+ if((tmpRow.getArticle().getUnread() == ArticleStatus.READ && m_state == ArticleListState.UNREAD)
+ || (tmpRow.getArticle().getMarked() == ArticleStatus.UNMARKED && m_state == ArticleListState.MARKED)
|| (m_selectedFeedListType == FeedListType.TAG && !tmpRow.hasTag(m_selectedFeedListID)))
{
if(tmpRow.getID() != selectedID)
@@ -397,20 +369,20 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
return;
case ArticleStatus.READ:
case ArticleStatus.UNMARKED:
- var selectedRow = this.get_selected_row() as articleRow;
+ var selectedRow = this.get_selected_row() as ArticleRow;
var articleChildList = this.get_children();
foreach(Gtk.Widget row in articleChildList)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null)
{
if((selectedRow != null && tmpRow.getID() != selectedRow.getID())
|| selectedRow == null)
{
- if(m_articles.contains(tmpRow.getID()))
+ if(m_articles.has_key(tmpRow.getID()))
{
- if((m_state == ArticleListState.UNREAD && !tmpRow.isUnread())
- || (m_state == ArticleListState.MARKED && !tmpRow.isMarked()))
+ if((m_state == ArticleListState.UNREAD && tmpRow.getArticle().getUnread() == ArticleStatus.READ)
+ || (m_state == ArticleListState.MARKED && tmpRow.getArticle().getMarked() == ArticleStatus.UNMARKED))
{
removeRow(tmpRow);
break;
@@ -438,23 +410,22 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
var children = this.get_children();
foreach(var row in children)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null && invisibleRows.contains(tmpRow.getID()))
{
setRead(tmpRow);
- if(m_state == ArticleListState.UNREAD && !tmpRow.isUnread())
+ if(m_state == ArticleListState.UNREAD && tmpRow.getArticle().getUnread() == ArticleStatus.READ)
{
balanceNextScroll(ArticleListBalance.BOTTOM);
removeRow(tmpRow, 0);
}
}
-
}
}
public void removeTagFromSelectedRow(string tagID)
{
- articleRow selectedRow = this.get_selected_row() as articleRow;
+ ArticleRow selectedRow = this.get_selected_row() as ArticleRow;
if(selectedRow == null)
return;
@@ -462,29 +433,14 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
selectedRow.removeTag(tagID);
}
- public string? getFirstRowID()
- {
- var children = this.get_children();
-
- if(children == null)
- return null;
-
- var firstRow = children.first().data as articleRow;
-
- if(firstRow == null)
- return null;
-
- return firstRow.getID();
- }
-
- private articleRow? getFirstRow()
+ public ArticleRow? getFirstRow()
{
var children = this.get_children();
if(children == null)
return null;
- var firstRow = children.first().data as articleRow;
+ var firstRow = children.first().data as ArticleRow;
if(firstRow == null)
return null;
@@ -492,27 +448,27 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
return firstRow;
}
- public string? getLastRowID()
+ public ArticleRow? getLastRow()
{
var children = this.get_children();
if(children == null)
return null;
- var lastRow = children.last().data as articleRow;
+ var lastRow = children.last().data as ArticleRow;
- if(lastRow != null)
- return lastRow.getID();
+ if(lastRow == null)
+ return null;
- return null;
+ return lastRow;
}
public bool selectedIsFirst()
{
- var selectedRow = this.get_selected_row() as articleRow;
+ var selectedRow = this.get_selected_row() as ArticleRow;
var children = this.get_children();
int n = children.index(selectedRow);
- var lastRow = children.first().data as articleRow;
+ var lastRow = children.first().data as ArticleRow;
if(n == 0)
return true;
@@ -524,11 +480,11 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
public bool selectedIsLast()
{
- var selectedRow = this.get_selected_row() as articleRow;
+ var selectedRow = this.get_selected_row() as ArticleRow;
var children = this.get_children();
int n = children.index(selectedRow);
uint length = children.length();
- var lastRow = children.last().data as articleRow;
+ var lastRow = children.last().data as ArticleRow;
if(n + 1 == length)
return true;
@@ -544,7 +500,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
foreach(var row in children)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null)
tmpRow.updateUnread(ArticleStatus.READ);
}
@@ -552,7 +508,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
public int selectedRowPosition()
{
- articleRow selectedRow = this.get_selected_row() as articleRow;
+ ArticleRow selectedRow = this.get_selected_row() as ArticleRow;
int scroll = 0;
if(selectedRow == null)
@@ -561,7 +517,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
var FeedChildList = this.get_children();
foreach(Gtk.Widget row in FeedChildList)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null)
{
if(tmpRow.getID() == selectedRow.getID())
@@ -582,14 +538,9 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
public void selectRow(string articleID, int time = 10)
{
- var children = this.get_children();
- foreach(var row in children)
+ if(m_articles.has_key(articleID))
{
- var tmpRow = row as articleRow;
- if(tmpRow != null && tmpRow.getID() == articleID)
- {
- selectAfter(tmpRow, time);
- }
+ selectAfter(m_articles.get(articleID), time);
}
}
@@ -598,7 +549,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
var children = this.get_children();
foreach(var row in children)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null && tmpRow.getID() != articleID)
tmpRow.opacity = 0.5;
}
@@ -609,7 +560,7 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
var children = this.get_children();
foreach(var row in children)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null)
tmpRow.opacity = 1.0;
}
@@ -620,14 +571,32 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
return m_articles.size;
}
+ public int getSizeForState()
+ {
+ if(m_state == ArticleListState.UNREAD)
+ {
+ int unread = 0;
+ var children = this.get_children();
+ foreach(var row in children)
+ {
+ var tmpRow = row as ArticleRow;
+ if(tmpRow != null && tmpRow.getArticle().getUnread() == ArticleStatus.UNREAD)
+ unread += 1;
+ }
+ return unread;
+ }
+
+ return getSize();
+ }
+
public bool needLoadMore(int height)
{
int rowHeight = 0;
- var FeedChildList = this.get_children();
- foreach(Gtk.Widget row in FeedChildList)
+ var children = this.get_children();
+ foreach(var row in children)
{
- var tmpRow = row as articleRow;
+ var tmpRow = row as ArticleRow;
if(tmpRow != null && tmpRow.isRevealed())
rowHeight += tmpRow.get_allocated_height();
}
@@ -637,4 +606,55 @@ public class FeedReader.ArticleListBox : Gtk.ListBox {
return false;
}
+
+ public Gee.List<string> getIDs()
+ {
+ var tmp = new Gee.LinkedList<string>();
+ m_articles.foreach((entry) => {
+ tmp.add(entry.key);
+ return true;
+ });
+ return tmp;
+ }
+
+ public void setAllUpdated(bool updated = false)
+ {
+ var children = this.get_children();
+ foreach(var row in children)
+ {
+ var tmpRow = row as ArticleRow;
+ if(tmpRow != null)
+ tmpRow.setUpdated(updated);
+ }
+ }
+
+ public void removeObsoleteRows()
+ {
+ var children = this.get_children();
+ foreach(var row in children)
+ {
+ var tmpRow = row as ArticleRow;
+ if(tmpRow != null && !tmpRow.getUpdated())
+ {
+ removeRow(tmpRow, 50);
+ }
+ }
+ }
+
+ public bool insertArticle(Article a, int pos)
+ {
+ if(m_articles.has_key(a.getArticleID()))
+ {
+ Logger.debug(@"ArticleListbox$m_name: row with ID %s is already present".printf(a.getArticleID()));
+ return false;
+ }
+
+ a.setPos(pos);
+ stopLoading();
+ var list = new Gee.LinkedList<Article>();
+ list.add(a);
+ m_lazyQeue = list;
+ addRow(ArticleListBalance.NONE, false, false);
+ return true;
+ }
}
diff --git a/src/Widgets/ArticleList/ArticleListEmptyLabel.vala b/src/Widgets/ArticleList/ArticleListEmptyLabel.vala
index 96e77bbf..c5b49934 100644
--- a/src/Widgets/ArticleList/ArticleListEmptyLabel.vala
+++ b/src/Widgets/ArticleList/ArticleListEmptyLabel.vala
@@ -29,17 +29,18 @@ public class FeedReader.ArticleListEmptyLabel : Gtk.Label {
this.show_all();
}
- public void build(string selectedFeed, FeedListType type, ArticleListState state, string searchTerm)
+ public void build(string selectedID, FeedListType type, ArticleListState state, string searchTerm)
{
string message = "";
string name = "";
string search = Utils.parseSearchTerm(searchTerm);
- if(selectedFeed != FeedID.ALL.to_string() && selectedFeed != FeedID.CATEGORIES.to_string())
+ if(selectedID != FeedID.ALL.to_string() && selectedID != FeedID.CATEGORIES.to_string())
{
switch(type)
{
case FeedListType.FEED:
- name = dbUI.get_default().getFeedName(selectedFeed);
+ var feed = DataBase.readOnly().read_feed(selectedID);
+ name = feed != null ? feed.getTitle() : "";
if(state == ArticleListState.UNREAD)
{
if(searchTerm != "")
@@ -63,7 +64,7 @@ public class FeedReader.ArticleListEmptyLabel : Gtk.Label {
}
break;
case FeedListType.TAG:
- name = dbUI.get_default().getTagName(selectedFeed);
+ name = DataBase.readOnly().getTagName(selectedID);
if(state == ArticleListState.UNREAD)
{
if(searchTerm != "")
@@ -87,7 +88,7 @@ public class FeedReader.ArticleListEmptyLabel : Gtk.Label {
}
break;
case FeedListType.CATEGORY:
- name = dbUI.get_default().getCategoryName(selectedFeed);
+ name = DataBase.readOnly().getCategoryName(selectedID);
if(state == ArticleListState.UNREAD)
{
if(searchTerm != "")
diff --git a/src/Widgets/ArticleList/ArticleListScroll.vala b/src/Widgets/ArticleList/ArticleListScroll.vala
index ad633768..7f2d7784 100644
--- a/src/Widgets/ArticleList/ArticleListScroll.vala
+++ b/src/Widgets/ArticleList/ArticleListScroll.vala
@@ -31,12 +31,15 @@ public class FeedReader.ArticleListScroll : Gtk.ScrolledWindow {
private int m_scrollCooldown = 500; // cooldown in ms
//Transition times
- private int64 m_startTime = 0;
- private int64 m_endTime = 0;
- private double m_transitionDiff = 0.0;
- private double m_transitionStartValue = 0.0;
+ private int64 m_startTime = 0;
+ private int64 m_endTime = 0;
+ private double m_transitionDiff = 0.0;
+ private double m_transitionStartValue = 0.0;
private int m_transitionDuration = 500 * 1000;
private uint m_scrollCallbackID = 0;
+ private uint m_savetyFallbackID = 0;
+ private uint m_scrollCooldownID = 0;
+
public ArticleListScroll()
@@ -44,7 +47,7 @@ public class FeedReader.ArticleListScroll : Gtk.ScrolledWindow {
vadjustment.notify["upper"].connect(trackUpper);
vadjustment.notify["value"].connect(trackValue);
this.set_size_request(250, 0);
- }
+ }
private void trackUpper()
{
@@ -69,7 +72,7 @@ public class FeedReader.ArticleListScroll : Gtk.ScrolledWindow {
m_upperCache = vadjustment.upper;
m_valueCache = vadjustment.value;
- }
+ }
private void trackValue()
{
@@ -113,20 +116,47 @@ public class FeedReader.ArticleListScroll : Gtk.ScrolledWindow {
Logger.debug("ArticleListScroll: scrolled down");
m_scrolledBottomOnCooldown = true;
scrolledBottom();
- GLib.Timeout.add(m_scrollCooldown, () => {
- Logger.debug("ArticleListScroll: scrolled down off cooldown");
+ // reset cooldown after 5s if something went wrong
+ m_savetyFallbackID = GLib.Timeout.add_seconds(5, () => {
+ m_savetyFallbackID = 0;
m_scrolledBottomOnCooldown = false;
- if(vadjustment.value >= max - 5)
- scrolledBottom();
- return false;
+ return GLib.Source.REMOVE;
});
}
}
+ public void startScrolledDownCooldown()
+ {
+ if(m_scrollCooldownID != 0)
+ {
+ GLib.Source.remove(m_scrollCooldownID);
+ m_scrollCooldownID = 0;
+ }
+
+ m_scrollCooldownID = GLib.Timeout.add(m_scrollCooldown, () => {
+ Logger.debug("ArticleListScroll: scrolled down off cooldown");
+ m_scrollCooldownID = 0;
+ m_scrolledBottomOnCooldown = false;
+ if(m_savetyFallbackID != 0)
+ {
+ GLib.Source.remove(m_savetyFallbackID);
+ m_savetyFallbackID = 0;
+ }
+ double max = vadjustment.upper - vadjustment.page_size;
+ if(vadjustment.value >= max - 5)
+ {
+ Logger.debug("ArticleListScroll: trigger scrolledBottom()");
+ scrolledBottom();
+ }
+
+ return GLib.Source.REMOVE;
+ });
+ }
+
public void balanceNextScroll(ArticleListBalance mode)
{
m_balance = mode;
- }
+ }
public void scrollDiff(double diff, bool animate = true)
{
diff --git a/src/Widgets/ArticleRow.vala b/src/Widgets/ArticleRow.vala
index fe5a4d68..865286d0 100644
--- a/src/Widgets/ArticleRow.vala
+++ b/src/Widgets/ArticleRow.vala
@@ -13,11 +13,13 @@
// You should have received a copy of the GNU General Public License
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-public class FeedReader.articleRow : Gtk.ListBoxRow {
+public class FeedReader.ArticleRow : Gtk.ListBoxRow {
- private article m_article;
+ private Article m_article;
private Gtk.Label m_label;
+ private Gtk.Image m_icon;
private Gtk.Revealer m_revealer;
+ private Gtk.EventBox m_eventBox;
private Gtk.EventBox m_unread_eventbox;
private Gtk.EventBox m_marked_eventbox;
private Gtk.Stack m_unread_stack;
@@ -28,18 +30,14 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
private bool m_hovering_row = false;
private bool m_populated = false;
public signal void rowStateChanged(ArticleStatus status);
- public signal void child_revealed();
- public articleRow(article Article)
+ public ArticleRow(Article article)
{
- m_article = Article;
+ m_article = article;
m_revealer = new Gtk.Revealer();
m_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
m_revealer.set_reveal_child(false);
- m_revealer.notify["child_revealed"].connect(() => {
- child_revealed();
- });
this.set_size_request(0, 100);
this.add(m_revealer);
this.show_all();
@@ -47,6 +45,34 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
GLib.Idle.add(populate, GLib.Priority.HIGH_IDLE);
}
+ ~ArticleRow()
+ {
+ if(m_unread_eventbox != null)
+ {
+ m_unread_eventbox.enter_notify_event.disconnect(unreadIconEnter);
+ m_unread_eventbox.leave_notify_event.disconnect(unreadIconLeave);
+ m_unread_eventbox.button_press_event.disconnect(unreadIconClicked);
+ }
+
+ if(m_marked_eventbox != null)
+ {
+ m_marked_eventbox.enter_notify_event.disconnect(markedIconEnter);
+ m_marked_eventbox.leave_notify_event.disconnect(markedIconLeave);
+ m_marked_eventbox.button_press_event.disconnect(markedIconClicked);
+ }
+
+ if(m_eventBox != null)
+ {
+ m_eventBox.enter_notify_event.disconnect(rowEnter);
+ m_eventBox.leave_notify_event.disconnect(rowLeave);
+ m_eventBox.button_press_event.disconnect(rowClick);
+ }
+
+ this.drag_begin.disconnect(onDragBegin);
+ this.drag_data_get.disconnect(onDragDataGet);
+ this.drag_failed.disconnect(onDragFailed);
+ }
+
private bool populate()
{
m_unread_stack = new Gtk.Stack();
@@ -120,7 +146,9 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
m_marked_eventbox.leave_notify_event.connect(markedIconLeave);
m_marked_eventbox.button_press_event.connect(markedIconClicked);
- icon_box.pack_start(getFeedIcon(), true, true, 0);
+ m_icon = createFavIcon();
+
+ icon_box.pack_start(m_icon, true, true, 0);
icon_box.pack_end(m_unread_eventbox, false, false, 10);
icon_box.pack_end(m_marked_eventbox, false, false, 0);
@@ -148,7 +176,8 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
body_label.set_line_wrap(true);
body_label.set_lines(2);
- var feedLabel = new Gtk.Label(dbUI.get_default().getFeedName(m_article.getFeedID()));
+ var feed = DataBase.readOnly().read_feed(m_article.getFeedID());
+ var feedLabel = new Gtk.Label(feed != null ? feed.getTitle() : "");
feedLabel.get_style_context().add_class("preview");
feedLabel.opacity = 0.6;
feedLabel.set_alignment(0.0f, 0.5f);
@@ -174,45 +203,38 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
box.pack_start(icon_box, false, false, 8);
box.pack_start(text_box, true, true, 0);
- var eventbox = new Gtk.EventBox();
- eventbox.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
- eventbox.set_events(Gdk.EventMask.LEAVE_NOTIFY_MASK);
- eventbox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK);
- eventbox.enter_notify_event.connect(rowEnter);
- eventbox.leave_notify_event.connect(rowLeave);
- eventbox.button_press_event.connect(rowClick);
- eventbox.add(box);
- eventbox.show_all();
-
- try
- {
- // Make the this widget a DnD source.
- if(!Settings.general().get_boolean("only-feeds")
- && DBusConnection.get_default().isOnline()
- && DBusConnection.get_default().supportTags())
- {
- const Gtk.TargetEntry[] provided_targets = {
- { "STRING", 0, DragTarget.TAG }
- };
-
- Gtk.drag_source_set (
- this,
- Gdk.ModifierType.BUTTON1_MASK,
- provided_targets,
- Gdk.DragAction.COPY
- );
-
- this.drag_begin.connect(onDragBegin);
- this.drag_data_get.connect(onDragDataGet);
- this.drag_failed.connect(onDragFailed);
- }
- }
- catch(GLib.Error e)
+ m_eventBox = new Gtk.EventBox();
+ m_eventBox.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
+ m_eventBox.set_events(Gdk.EventMask.LEAVE_NOTIFY_MASK);
+ m_eventBox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK);
+ m_eventBox.enter_notify_event.connect(rowEnter);
+ m_eventBox.leave_notify_event.connect(rowLeave);
+ m_eventBox.button_press_event.connect(rowClick);
+ m_eventBox.add(box);
+ m_eventBox.show_all();
+
+ // Make the this widget a DnD source.
+ if(!Settings.general().get_boolean("only-feeds")
+ && FeedReaderBackend.get_default().isOnline()
+ && FeedReaderBackend.get_default().supportTags())
{
- Logger.error("ArticleRow.constructor: %s".printf(e.message));
+ const Gtk.TargetEntry[] provided_targets = {
+ { "STRING", 0, DragTarget.TAG }
+ };
+
+ Gtk.drag_source_set(
+ this,
+ Gdk.ModifierType.BUTTON1_MASK,
+ provided_targets,
+ Gdk.DragAction.COPY
+ );
+
+ this.drag_begin.connect(onDragBegin);
+ this.drag_data_get.connect(onDragDataGet);
+ this.drag_failed.connect(onDragFailed);
}
- m_revealer.add(eventbox);
+ m_revealer.add(m_eventBox);
m_populated = true;
return false;
}
@@ -243,23 +265,35 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
return false;
}
- private Gtk.Image getFeedIcon()
+ private Gtk.Image createFavIcon()
{
- var icon = FavIconCache.get_default().getIcon(m_article.getFeedID());
- if(icon != null)
- return new Gtk.Image.from_pixbuf(icon);
+ var icon = new Gtk.Image.from_icon_name("feed-rss-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
- return new Gtk.Image.from_icon_name("feed-rss-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
- }
+ Feed? feed = DataBase.readOnly().read_feed(m_article.getFeedID());
+ var favicon = FavIcon.for_feed(feed);
+ favicon.get_surface.begin((obj, res) => {
+ var surface = favicon.get_surface.end(res);
+ if(surface != null)
+ icon.surface = surface;
+ });
+ ulong handler_id = favicon.surface_changed.connect((feed, surface) => {
+ icon.surface = surface;
+ });
+ icon.destroy.connect(() => {
+ favicon.disconnect(handler_id);
+ });
+ return icon;
+ }
private Gtk.Window getFeedIconWindow()
{
+ var icon = createFavIcon();
var window = new Gtk.Window(Gtk.WindowType.POPUP);
var visual = window.get_screen().get_rgba_visual();
window.set_visual(visual);
window.get_style_context().add_class("transparentBG");
- window.add(getFeedIcon());
+ window.add(icon);
window.show_all();
return window;
}
@@ -360,42 +394,29 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
return true;
}
- public bool toggleUnread()
+ public ArticleStatus toggleUnread()
{
- bool unread = false;
var view = ColumnView.get_default();
- string articleID = ColumnView.get_default().getSelectedArticle();
+ Article? selectedArticle = ColumnView.get_default().getSelectedArticle();
switch(m_article.getUnread())
{
case ArticleStatus.READ:
updateUnread(ArticleStatus.UNREAD);
- unread = true;
- if(articleID != "" && articleID == m_article.getArticleID())
- {
- view.getHeader().setRead(true);
- }
break;
case ArticleStatus.UNREAD:
updateUnread(ArticleStatus.READ);
- unread = false;
- if(articleID != "" && articleID == m_article.getArticleID())
- {
- view.getHeader().setRead(false);
- }
break;
}
- try
+ if(selectedArticle != null && selectedArticle.getArticleID() == m_article.getArticleID())
{
- DBusConnection.get_default().changeArticle(m_article.getArticleID(), m_article.getUnread());
- }
- catch(GLib.Error e)
- {
- Logger.error("ArticleRow.toggleUnread: %s".printf(e.message));
+ view.getHeader().setRead(m_article.getUnread());
}
+
+ FeedReaderBackend.get_default().updateArticleRead(m_article);
show_all();
- return unread;
+ return m_article.getUnread();
}
public void updateUnread(ArticleStatus unread)
@@ -469,43 +490,29 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
return true;
}
- public bool toggleMarked()
+ public ArticleStatus toggleMarked()
{
- bool marked = false;
var view = ColumnView.get_default();
- string articleID = ColumnView.get_default().getSelectedArticle();
+ Article? selectedArticle = ColumnView.get_default().getSelectedArticle();
switch(m_article.getMarked())
{
case ArticleStatus.MARKED:
updateMarked(ArticleStatus.UNMARKED);
- marked = false;
- if(articleID != "" && articleID == m_article.getArticleID())
- {
- view.getHeader().setMarked(false);
- }
break;
-
case ArticleStatus.UNMARKED:
updateMarked(ArticleStatus.MARKED);
- marked = true;
- if(articleID != "" && articleID == m_article.getArticleID())
- {
- view.getHeader().setMarked(true);
- }
break;
}
- try
- {
- DBusConnection.get_default().changeArticle(m_article.getArticleID(), m_article.getMarked());
- }
- catch(GLib.Error e)
+ if(selectedArticle != null && selectedArticle.getArticleID() == m_article.getArticleID())
{
- Logger.error("ArticleRow.toggleMarked: %s".printf(e.message));
+ view.getHeader().setMarked(m_article.getMarked());
}
+
+ FeedReaderBackend.get_default().updateArticleMarked(m_article);
this.show_all();
- return marked;
+ return m_article.getMarked();
}
public void updateMarked(ArticleStatus marked)
@@ -560,30 +567,9 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
return true;
}
- public bool isUnread()
- {
- if(m_article.getUnread() == ArticleStatus.UNREAD)
- return true;
-
- return false;
- }
-
- public bool isMarked()
+ public Article getArticle()
{
- if(m_article.getMarked() == ArticleStatus.MARKED)
- return true;
-
- return false;
- }
-
- public ArticleStatus getUnread()
- {
- return m_article.getUnread();
- }
-
- public ArticleStatus getMarked()
- {
- return m_article.getMarked();
+ return m_article;
}
public string getName()
@@ -651,7 +637,7 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
public bool hasTag(string tagID)
{
- foreach(string tag in m_article.getTags())
+ foreach(string tag in m_article.getTagIDs())
{
if(tag == tagID)
return true;
@@ -662,7 +648,7 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
public void removeTag(string tagID)
{
- m_article.getTags().remove(tagID);
+ m_article.getTagIDs().remove(tagID);
}
public int getSortID()
@@ -674,5 +660,4 @@ public class FeedReader.articleRow : Gtk.ListBoxRow {
{
return m_article.haveMedia();
}
-
}
diff --git a/src/Widgets/ArticleView.vala b/src/Widgets/ArticleView.vala
index da8fce36..57a249d4 100644
--- a/src/Widgets/ArticleView.vala
+++ b/src/Widgets/ArticleView.vala
@@ -17,7 +17,7 @@
interface FeedReaderWebExtension : Object
{
public abstract void recalculate() throws IOError;
- public signal void onClick(string path, int width, int height, string url);
+ public signal void onClick(string path, int width, int height, string url);
public signal void message(string message);
}
@@ -75,8 +75,8 @@ public class FeedReader.ArticleView : Gtk.Overlay {
crashButton.set_relief(Gtk.ReliefStyle.NONE);
crashButton.set_focus_on_click(false);
crashButton.clicked.connect(() => {
- var Article = dbUI.get_default().read_article(m_currentArticle);
- UtilsUI.openInGedit(Article.getHTML());
+ var Article = DataBase.readOnly().read_article(m_currentArticle);
+ Utils.openInGedit(Article.getHTML());
});
var crashView = new Gtk.Box(Gtk.Orientation.VERTICAL, 10);
crashView.set_halign(Gtk.Align.CENTER);
@@ -106,12 +106,17 @@ public class FeedReader.ArticleView : Gtk.Overlay {
recalculate.end(res);
});
}
- });
+ });
m_fsHead = new FullscreenHeader();
+ m_progress = new ArticleViewLoadProgress();
+ var progressOverlay = new Gtk.Overlay();
+ progressOverlay.add(m_stack);
+ progressOverlay.add_overlay(m_progress);
+
var fullscreenHeaderOverlay = new Gtk.Overlay();
- fullscreenHeaderOverlay.add(m_stack);
+ fullscreenHeaderOverlay.add(progressOverlay);
fullscreenHeaderOverlay.add_overlay(m_fsHead);
m_prevButton = new fullscreenButton("go-previous-symbolic", Gtk.Align.START);
@@ -130,15 +135,8 @@ public class FeedReader.ArticleView : Gtk.Overlay {
nextOverlay.add(prevOverlay);
nextOverlay.add_overlay(m_nextButton);
-
- m_progress = new ArticleViewLoadProgress();
-
- var progressOverlay = new Gtk.Overlay();
- progressOverlay.add(nextOverlay);
- progressOverlay.add_overlay(m_progress);
-
m_videoOverlay = new Gtk.Overlay();
- m_videoOverlay.add(progressOverlay);
+ m_videoOverlay.add(nextOverlay);
this.add(m_videoOverlay);
this.add_overlay(m_UrlOverlay);
@@ -167,6 +165,7 @@ public class FeedReader.ArticleView : Gtk.Overlay {
settings.set_enable_page_cache(false);
settings.set_enable_plugins(false);
settings.set_enable_smooth_scrolling(smoothScroll);
+ settings.set_enable_javascript(Settings.tweaks().get_boolean("allow-javascript"));
settings.set_javascript_can_access_clipboard(false);
settings.set_javascript_can_open_windows_automatically(false);
settings.set_media_playback_requires_user_gesture(true);
@@ -189,7 +188,7 @@ public class FeedReader.ArticleView : Gtk.Overlay {
view.leave_fullscreen.connect(leaveFullscreenVideo);
view.scroll_event.connect(onScroll);
view.key_press_event.connect(onKeyPress);
- view.web_process_crashed.connect(onCrash);
+ view.web_process_terminated.connect(onCrash);
view.notify["estimated-load-progress"].connect(printProgress);
//view.load_failed.connect(loadFailed);
view.decide_policy.connect(decidePolicy);
@@ -215,15 +214,15 @@ public class FeedReader.ArticleView : Gtk.Overlay {
if(m_OngoingScrollID > 0)
{
- GLib.Source.remove(m_OngoingScrollID);
- m_OngoingScrollID = 0;
- }
+ GLib.Source.remove(m_OngoingScrollID);
+ m_OngoingScrollID = 0;
+ }
- article Article = null;
+ Article article = null;
SourceFunc callback = fillContent.callback;
ThreadFunc<void*> run = () => {
- Article = dbUI.get_default().read_article(articleID);
+ article = DataBase.readOnly().read_article(articleID);
Idle.add((owned) callback, GLib.Priority.HIGH_IDLE);
return null;
};
@@ -240,22 +239,22 @@ public class FeedReader.ArticleView : Gtk.Overlay {
else
m_currentView.zoom_level = 1.0;
- m_fsHead.setTitle(Article.getTitle());
- m_fsHead.setMarked( (Article.getMarked() == ArticleStatus.MARKED) ? true : false);
- m_fsHead.setUnread( (Article.getUnread() == ArticleStatus.UNREAD) ? true : false);
+ m_fsHead.setTitle(article.getTitle());
+ m_fsHead.setMarked(article.getMarked());
+ m_fsHead.setRead(article.getUnread());
m_progress.reset();
m_progress.setPercentage(0);
m_progress.reveal(true);
m_currentView.load_html(
- UtilsUI.buildArticle(
- Article.getHTML(),
- Article.getTitle(),
- Article.getURL(),
- Article.getAuthor(),
- Article.getDateNice(),
- Article.getFeedID()
+ Utils.buildArticle(
+ article.getHTML(),
+ article.getTitle(),
+ article.getURL(),
+ article.getAuthor(),
+ article.getDateNice(true),
+ article.getFeedID()
)
, "file://" + GLib.Environment.get_user_data_dir() + "/feedreader/data/images/");
this.show_all();
@@ -266,8 +265,15 @@ public class FeedReader.ArticleView : Gtk.Overlay {
private void switchViews()
{
m_busy = true;
+ string? visible = m_stack.get_visible_child_name();
+
+ if(visible == null)
+ {
+ Logger.error("ArticleView: ");
+ return;
+ }
- switch(m_stack.get_visible_child_name())
+ switch(visible)
{
case "empty":
case "crash":
@@ -282,13 +288,11 @@ public class FeedReader.ArticleView : Gtk.Overlay {
case "view1":
Logger.debug("ArticleView: view1 -> view2");
m_currentView = getNewView();
+ removeFromStack("view2");
m_stack.add_named(m_currentView, "view2");
m_stack.set_visible_child_name("view2");
GLib.Timeout.add((uint)(1.2*m_animationDuration), () => {
- var oldView = m_stack.get_child_by_name("view1");
- if(oldView != null)
- m_stack.remove(oldView);
-
+ removeFromStack("view1");
checkQueue();
return false;
}, GLib.Priority.HIGH);
@@ -297,13 +301,11 @@ public class FeedReader.ArticleView : Gtk.Overlay {
case "view2":
Logger.debug("ArticleView: view2 -> view1");
m_currentView = getNewView();
+ removeFromStack("view1");
m_stack.add_named(m_currentView, "view1");
m_stack.set_visible_child_name("view1");
GLib.Timeout.add((uint)(1.2*m_animationDuration), () => {
- var oldView = m_stack.get_child_by_name("view2");
- if(oldView != null)
- m_stack.remove(oldView);
-
+ removeFromStack("view2");
checkQueue();
return false;
}, GLib.Priority.HIGH);
@@ -324,6 +326,13 @@ public class FeedReader.ArticleView : Gtk.Overlay {
}
}
+ private void removeFromStack(string childName)
+ {
+ Gtk.Widget? widget = m_stack.get_child_by_name(childName);
+ if(widget != null)
+ m_stack.remove(widget);
+ }
+
private void checkQueue()
{
m_busy = false;
@@ -365,6 +374,20 @@ public class FeedReader.ArticleView : Gtk.Overlay {
{
case WebKit.LoadEvent.STARTED:
Logger.debug("ArticleView: load STARTED");
+ string url = m_currentView.get_uri();
+ if(url != "file://" + GLib.Environment.get_user_data_dir() + "/feedreader/data/images/")
+ {
+ Logger.debug(@"ArticleView: open external url: $url");
+ try
+ {
+ Gtk.show_uri(Gdk.Screen.get_default(), url, Gdk.CURRENT_TIME);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.debug("could not open the link in an external browser: %s".printf(e.message));
+ }
+ m_currentView.stop_loading();
+ }
break;
case WebKit.LoadEvent.COMMITTED:
Logger.debug("ArticleView: load COMMITTED");
@@ -503,9 +526,9 @@ public class FeedReader.ArticleView : Gtk.Overlay {
private void on_extension_appeared(GLib.DBusConnection connection, string name, string owner)
- {
- try
- {
+ {
+ try
+ {
m_connected = true;
m_messenger = connection.get_proxy_sync("org.gnome.FeedReader.ArticleView", "/org/gnome/FeedReader/ArticleView", GLib.DBusProxyFlags.DO_NOT_AUTO_START, null);
m_messenger.onClick.connect((path, width, height, url) => {
@@ -513,7 +536,7 @@ public class FeedReader.ArticleView : Gtk.Overlay {
new imagePopup(path, url, window, height, width);
});
m_messenger.message.connect((message) => {
- Logger.info("ArticleView: webextension-message: " + message);
+ Logger.debug(@"ArticleView: webextension-message: $message");
});
recalculate.begin((obj, res) => {
recalculate.end(res);
@@ -523,30 +546,30 @@ public class FeedReader.ArticleView : Gtk.Overlay {
{
Logger.error("ArticleView.on_extension_appeared: " + e.message);
}
- }
+ }
private async void recalculate()
- {
+ {
SourceFunc callback = recalculate.callback;
ThreadFunc<void*> run = () => {
try
- {
- if(m_connected
+ {
+ if(m_connected
&& m_stack.get_visible_child_name() != "empty"
&& m_stack.get_visible_child_name() != "crash"
&& m_currentView != null)
- m_messenger.recalculate();
- }
- catch(GLib.IOError e)
- {
- Logger.warning("ArticleView: recalculate " + e.message);
- }
+ m_messenger.recalculate();
+ }
+ catch(GLib.IOError e)
+ {
+ Logger.warning("ArticleView: recalculate " + e.message);
+ }
Idle.add((owned) callback, GLib.Priority.HIGH_IDLE);
return null;
};
new GLib.Thread<void*>("recalculate", run);
yield;
- }
+ }
private bool onClick(Gdk.EventButton event)
{
@@ -613,10 +636,21 @@ public class FeedReader.ArticleView : Gtk.Overlay {
{
if((event.state & Gdk.ModifierType.CONTROL_MASK) == Gdk.ModifierType.CONTROL_MASK)
{
- if(event.delta_y > 0)
- m_currentView.zoom_level -= 0.25;
- else if(event.delta_y < 0)
- m_currentView.zoom_level += 0.25;
+ switch(event.direction)
+ {
+ case Gdk.ScrollDirection.UP:
+ m_currentView.zoom_level -= 0.25;
+ break;
+
+ case Gdk.ScrollDirection.DOWN:
+ m_currentView.zoom_level += 0.25;
+ break;
+
+ case Gdk.ScrollDirection.SMOOTH:
+ m_currentView.zoom_level -= 10 * (event.delta_y / event.y_root);
+ break;
+ }
+
return true;
}
@@ -719,11 +753,11 @@ public class FeedReader.ArticleView : Gtk.Overlay {
{
Logger.debug("ArticleView.setBackgroundColor()");
var background = ColumnView.get_default().getBackgroundColor();
- if(background.alpha == 1.0)
- {
+ if(background.alpha == 1.0)
+ {
// Don't set a background color that is transparent.
m_color = background;
- }
+ }
}
private bool onContextMenu(WebKit.ContextMenu menu, Gdk.Event event, WebKit.HitTestResult hitTest)
@@ -731,16 +765,16 @@ public class FeedReader.ArticleView : Gtk.Overlay {
var menuItems = menu.get_items().copy();
foreach(var menuItem in menuItems)
{
- if(menuItem.get_action() == null)
+ if(menuItem.get_gaction() == null)
{
menu.remove(menuItem);
continue;
}
- if((menuItem.get_action().name != "context-menu-action-3") // copy link location
- && (menuItem.get_action().name != "context-menu-action-9") // copy text
- && (menuItem.get_action().name != "context-menu-action-6") // copy image
- && (menuItem.get_action().name != "context-menu-action-7")) // copy image address
+ if((menuItem.get_gaction().name != "context-menu-action-3") // copy link location
+ && (menuItem.get_gaction().name != "context-menu-action-9") // copy text
+ && (menuItem.get_gaction().name != "context-menu-action-6") // copy image
+ && (menuItem.get_gaction().name != "context-menu-action-7")) // copy image address
{
menu.remove(menuItem);
}
@@ -749,11 +783,11 @@ public class FeedReader.ArticleView : Gtk.Overlay {
if(hitTest.context_is_image())
{
var uri = hitTest.get_image_uri().substring("file://".length);
- var action = new Gtk.Action("save", _("Save image as"), null, null);
+ var action = new GLib.SimpleAction ("save", null);
action.activate.connect(() => {
- UtilsUI.saveImageDialog(uri);
+ Utils.saveImageDialog(uri);
});
- menu.append(new WebKit.ContextMenuItem(action));
+ menu.append(new WebKit.ContextMenuItem.from_gaction(action, _("Save image as"), null));
}
if(menu.first() == null)
@@ -865,14 +899,14 @@ public class FeedReader.ArticleView : Gtk.Overlay {
m_progress.reveal(false);
}
- public void setMarked(bool marked)
+ public void setMarked(ArticleStatus marked)
{
m_fsHead.setMarked(marked);
}
- public void setUnread(bool unread)
+ public void setRead(ArticleStatus read)
{
- m_fsHead.setUnread(unread);
+ m_fsHead.setRead(read);
}
public void nextButtonVisible(bool vis)
@@ -885,7 +919,7 @@ public class FeedReader.ArticleView : Gtk.Overlay {
m_prevButton.reveal(vis);
}
- private bool onCrash()
+ private void onCrash(WebKit.WebProcessTerminationReason reason)
{
m_busy = true;
m_progress.setPercentage(0);
@@ -905,7 +939,6 @@ public class FeedReader.ArticleView : Gtk.Overlay {
uint minor = WebKit.get_minor_version();
uint micro = WebKit.get_micro_version();
Logger.debug(@"Running WebKit $major.$minor.$micro");
- return false;
}
public void addMedia(MediaPlayer media)
@@ -936,7 +969,7 @@ public class FeedReader.ArticleView : Gtk.Overlay {
if(m_currentView == null)
return;
- string articleName = dbUI.get_default().read_article(m_currentArticle).getTitle() + ".pdf";
+ string articleName = DataBase.readOnly().read_article(m_currentArticle).getTitle() + ".pdf";
var settings = new Gtk.PrintSettings();
settings.set_printer("Print to File");
diff --git a/src/Widgets/ArticleViewHeader.vala b/src/Widgets/ArticleViewHeader.vala
index 9c4c0ddb..5429c81d 100644
--- a/src/Widgets/ArticleViewHeader.vala
+++ b/src/Widgets/ArticleViewHeader.vala
@@ -16,23 +16,23 @@
public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
- private Gtk.Button m_share_button;
+ private Gtk.Button m_share_button;
private Gtk.Button m_tag_button;
private Gtk.Button m_print_button;
- private UpdateButton m_media_button;
+ private AttachedMediaButton m_media_button;
private HoverButton m_mark_button;
private HoverButton m_read_button;
private Gtk.Button m_fullscreen_button;
- private SharePopover? m_sharePopover = null;
- public signal void toggledMarked();
+ private SharePopover? m_sharePopover = null;
+ public signal void toggledMarked();
public signal void toggledRead();
- public signal void fsClick();
- public signal void popClosed();
- public signal void popOpened();
+ public signal void fsClick();
+ public signal void popClosed();
+ public signal void popOpened();
- public ArticleViewHeader(string fsIcon, string fsTooltip)
- {
- var share_icon = UtilsUI.checkIcon("emblem-shared-symbolic", "feed-share-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
+ public ArticleViewHeader(string fsIcon, string fsTooltip)
+ {
+ var share_icon = Utils.checkIcon("emblem-shared-symbolic", "feed-share-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
var tag_icon = new Gtk.Image.from_icon_name("feed-tag-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
var marked_icon = new Gtk.Image.from_icon_name("feed-marked-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
var unmarked_icon = new Gtk.Image.from_icon_name("feed-unmarked-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
@@ -40,7 +40,7 @@ public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
var unread_icon = new Gtk.Image.from_icon_name("feed-unread-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
var fs_icon = new Gtk.Image.from_icon_name(fsIcon, Gtk.IconSize.SMALL_TOOLBAR);
- m_mark_button = new HoverButton(unmarked_icon, marked_icon, false);
+ m_mark_button = new HoverButton(unmarked_icon, marked_icon, false);
m_mark_button.sensitive = false;
m_mark_button.clicked.connect(() => {
toggledMarked();
@@ -58,21 +58,21 @@ public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
m_fullscreen_button.set_tooltip_text(fsTooltip);
m_fullscreen_button.sensitive = false;
m_fullscreen_button.clicked.connect(() => {
- fsClick();
+ fsClick();
});
- m_tag_button = new Gtk.Button();
+ m_tag_button = new Gtk.Button();
m_tag_button.add(tag_icon);
m_tag_button.set_relief(Gtk.ReliefStyle.NONE);
m_tag_button.set_focus_on_click(false);
m_tag_button.set_tooltip_text(_("Tag article"));
m_tag_button.sensitive = false;
m_tag_button.clicked.connect(() => {
- popOpened();
+ popOpened();
var pop = new TagPopover(m_tag_button);
- pop.closed.connect(() => {
- popClosed();
- });
+ pop.closed.connect(() => {
+ popClosed();
+ });
});
@@ -102,7 +102,7 @@ public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
shareStack.set_visible_child_name("button");
m_share_button.clicked.connect(() => {
- popOpened();
+ popOpened();
m_sharePopover = new SharePopover(m_share_button);
m_sharePopover.startShare.connect(() => {
shareStack.set_visible_child_name("spinner");
@@ -114,65 +114,55 @@ public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
});
m_sharePopover.closed.connect(() => {
m_sharePopover = null;
- popClosed();
+ popClosed();
});
});
- m_media_button = new UpdateButton.from_icon_name("mail-attachment-symbolic", _("Attachments"));
- m_media_button.updating(false);
- m_media_button.no_show_all = true;
- m_media_button.clicked.connect(() => {
- popOpened();
- var pop = new MediaPopover(m_media_button);
- pop.play.connect((url) => {
- m_media_button.updating(true);
- var media = new MediaPlayer(url);
- media.loaded.connect(() => {
- m_media_button.updating(false);
- });
- ColumnView.get_default().ArticleViewAddMedia(media);
- });
- pop.closed.connect(() => {
- popClosed();
- });
+ m_media_button = new AttachedMediaButton();
+ m_media_button.popOpened.connect(() => {
+ popOpened();
+ });
+ m_media_button.popClosed.connect(() => {
+ popClosed();
});
- this.pack_start(m_fullscreen_button);
+ this.pack_start(m_fullscreen_button);
this.pack_start(m_mark_button);
this.pack_start(m_read_button);
this.pack_end(shareStack);
this.pack_end(m_tag_button);
this.pack_end(m_print_button);
this.pack_end(m_media_button);
- }
+ }
- public void showArticleButtons(bool show)
+ public void showArticleButtons(bool show)
{
Logger.debug("HeaderBar: showArticleButtons %s".printf(sensitive ? "true" : "false"));
m_mark_button.sensitive = show;
m_read_button.sensitive = show;
m_fullscreen_button.sensitive = show;
- m_media_button.visible = show;
m_share_button.sensitive = (show && FeedReaderApp.get_default().isOnline());
m_print_button.sensitive = show;
- try
- {
- if(DBusConnection.get_default().supportTags()
- && UtilsUI.canManipulateContent())
- {
- m_tag_button.sensitive = (show && FeedReaderApp.get_default().isOnline());
- }
- }
- catch(GLib.Error e)
+ if(FeedReaderBackend.get_default().supportTags()
+ && Utils.canManipulateContent())
{
- Logger.error("ColumnViewHeader.showArticleButtons: %s".printf(e.message));
+ m_tag_button.sensitive = (show && FeedReaderApp.get_default().isOnline());
}
}
- public void setMarked(bool marked)
+ public void setMarked(ArticleStatus marked)
{
- m_mark_button.setActive(marked);
+ switch(marked)
+ {
+ case ArticleStatus.MARKED:
+ m_mark_button.setActive(true);
+ break;
+ case ArticleStatus.UNMARKED:
+ default:
+ m_read_button.setActive(false);
+ break;
+ }
}
public void toggleMarked()
@@ -180,9 +170,18 @@ public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
m_mark_button.toggle();
}
- public void setRead(bool read)
+ public void setRead(ArticleStatus read)
{
- m_read_button.setActive(read);
+ switch(read)
+ {
+ case ArticleStatus.UNREAD:
+ m_read_button.setActive(true);
+ break;
+ case ArticleStatus.READ:
+ default:
+ m_read_button.setActive(false);
+ break;
+ }
}
public void toggleRead()
@@ -190,46 +189,32 @@ public class FeedReader.ArticleViewHeader : Gtk.HeaderBar {
m_read_button.toggle();
}
- public void setOffline()
+ public void setOffline()
{
- try
- {
- m_share_button.sensitive = false;
- if(UtilsUI.canManipulateContent()
- && DBusConnection.get_default().supportTags())
- m_tag_button.sensitive = false;
- }
- catch(GLib.Error e)
- {
- Logger.error("Headerbar.setOffline: %s".printf(e.message));
- }
+ m_share_button.sensitive = false;
+ if(Utils.canManipulateContent()
+ && FeedReaderBackend.get_default().supportTags())
+ m_tag_button.sensitive = false;
}
public void setOnline()
{
- try
+ if(m_mark_button.sensitive)
{
- if(m_mark_button.sensitive)
- {
- m_share_button.sensitive = true;
- if(UtilsUI.canManipulateContent()
- && DBusConnection.get_default().supportTags())
- m_tag_button.sensitive = true;
- }
+ m_share_button.sensitive = true;
+ if(Utils.canManipulateContent()
+ && FeedReaderBackend.get_default().supportTags())
+ m_tag_button.sensitive = true;
}
- catch(GLib.Error e)
- {
- Logger.error("Headerbar.setOnline: %s".printf(e.message));
- }
-
}
public void showMediaButton(bool show)
{
+ m_media_button.update();
m_media_button.visible = show;
}
- public void refreshSahrePopover()
+ public void refreshSahrePopover()
{
if(m_sharePopover == null)
return;
diff --git a/src/Widgets/ArticleViewLoadProgress.vala b/src/Widgets/ArticleViewLoadProgress.vala
index 50a2e860..e741afab 100644
--- a/src/Widgets/ArticleViewLoadProgress.vala
+++ b/src/Widgets/ArticleViewLoadProgress.vala
@@ -15,75 +15,58 @@
public class FeedReader.ArticleViewLoadProgress : Gtk.Revealer {
- private Gtk.Label m_label;
- private Gtk.Spinner m_spinner;
- private Gtk.Box m_box;
- private uint m_timeout_source_id = 0;
+ private Gtk.ProgressBar m_progress;
+ private uint m_timeout_source_id = 0;
- public ArticleViewLoadProgress()
- {
- m_label = new Gtk.Label("0%");
- m_label.get_style_context().add_class("h2");
- m_spinner = new Gtk.Spinner();
- m_spinner.set_size_request(24, 24);
- m_spinner.margin = 10;
- m_label.margin_end = 10;
-
- m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
- m_box.get_style_context().add_class("osd");
- m_box.pack_start(m_spinner);
- m_box.pack_start(m_label);
-
- this.valign = Gtk.Align.CENTER;
- this.halign = Gtk.Align.CENTER;
- this.set_transition_type(Gtk.RevealerTransitionType.CROSSFADE);
- this.set_transition_duration(300);
+ public ArticleViewLoadProgress()
+ {
+ m_progress = new Gtk.ProgressBar();
+ m_progress.set_show_text(false);
+ this.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
+ this.set_transition_duration(100);
+ this.valign = Gtk.Align.START;
this.no_show_all = true;
- this.add(m_box);
- }
+ this.add(m_progress);
+ }
- public void setPercentage(uint percentage)
- {
- m_label.set_text("%u %%".printf(percentage));
- }
+ public void setPercentage(uint percentage)
+ {
+ m_progress.set_fraction(percentage);
+ }
- public void setPercentageF(double percentage)
- {
- m_label.set_text("%u %%".printf((uint)(percentage*100)));
- }
+ public void setPercentageF(double percentage)
+ {
+ m_progress.set_fraction(percentage);
+ }
- public void reveal(bool show)
+ public void reveal(bool show)
{
- if(m_timeout_source_id > 0)
+ if(m_timeout_source_id > 0)
{
- GLib.Source.remove(m_timeout_source_id);
- m_timeout_source_id = 0;
- }
+ GLib.Source.remove(m_timeout_source_id);
+ m_timeout_source_id = 0;
+ }
if(show)
{
this.visible = true;
- m_timeout_source_id = Timeout.add(300, () => {
- m_spinner.show();
- m_label.show();
- m_box.show();
- m_spinner.start();
- this.set_reveal_child(true);
- m_timeout_source_id = 0;
- return false;
- });
+ m_progress.show();
+ m_timeout_source_id = Timeout.add(300, () => {
+ this.set_reveal_child(true);
+ m_timeout_source_id = 0;
+ return false;
+ });
+ }
+ else
+ {
+ this.set_reveal_child(false);
}
- else
- {
- m_spinner.stop();
- this.set_reveal_child(false);
- }
}
- public void reset()
- {
- reveal(false);
- }
+ public void reset()
+ {
+ reveal(false);
+ }
}
diff --git a/src/Widgets/ArticleViewUrlOverlay.vala b/src/Widgets/ArticleViewUrlOverlay.vala
index 1a8657f3..18fa68fd 100644
--- a/src/Widgets/ArticleViewUrlOverlay.vala
+++ b/src/Widgets/ArticleViewUrlOverlay.vala
@@ -15,44 +15,44 @@
public class FeedReader.ArticleViewUrlOverlay : Gtk.Revealer {
- private Gtk.Label m_label;
+ private Gtk.Label m_label;
- public ArticleViewUrlOverlay()
- {
- m_label = new Gtk.Label("dummy");
- m_label.get_style_context().add_class("osd");
- m_label.height_request = 30;
+ public ArticleViewUrlOverlay()
+ {
+ m_label = new Gtk.Label("dummy");
+ m_label.get_style_context().add_class("osd");
+ m_label.height_request = 30;
- this.valign = Gtk.Align.END;
- this.halign = Gtk.Align.START;
- this.margin = 10;
- this.set_transition_type(Gtk.RevealerTransitionType.CROSSFADE);
+ this.valign = Gtk.Align.END;
+ this.halign = Gtk.Align.START;
+ this.margin = 10;
+ this.set_transition_type(Gtk.RevealerTransitionType.CROSSFADE);
this.set_transition_duration(300);
this.no_show_all = true;
- this.add(m_label);
- }
+ this.add(m_label);
+ }
- public void setURL(string uri, Gtk.Align align)
- {
- int length = 45;
- string url = uri;
- if(url.length >= length)
- {
- url = url.substring(0, length-3) + "...";
- }
- m_label.label = url;
- m_label.width_chars = url.length;
- this.halign = align;
- }
+ public void setURL(string uri, Gtk.Align align)
+ {
+ int length = 45;
+ string url = uri;
+ if(url.length >= length)
+ {
+ url = url.substring(0, length-3) + "...";
+ }
+ m_label.label = url;
+ m_label.width_chars = url.length;
+ this.halign = align;
+ }
- public void reveal(bool show)
+ public void reveal(bool show)
{
if(show)
- {
- this.visible = true;
- m_label.show();
- }
+ {
+ this.visible = true;
+ m_label.show();
+ }
- this.set_reveal_child(show);
+ this.set_reveal_child(show);
}
}
diff --git a/src/Widgets/BackendInfoPopover.vala b/src/Widgets/BackendInfoPopover.vala
index b5e34f0e..6c3819c7 100644
--- a/src/Widgets/BackendInfoPopover.vala
+++ b/src/Widgets/BackendInfoPopover.vala
@@ -15,12 +15,11 @@
public class FeedReader.BackendInfoPopover : Gtk.Popover {
- private LoginInterface m_ext;
+ private BackendInfo m_info;
- public BackendInfoPopover(Gtk.Widget widget, LoginInterface ext)
+ public BackendInfoPopover(Gtk.Widget widget, BackendInfo info)
{
- m_ext = ext;
- var flags = m_ext.getFlags();
+ m_info = info;
int space = 25;
@@ -52,19 +51,19 @@ public class FeedReader.BackendInfoPopover : Gtk.Popover {
- if(BackendFlags.LOCAL in flags)
+ if(BackendFlags.LOCAL in m_info.flags)
{
var icon = getIcon("feed-local-symbolic", "Local Files only");
grid.attach(icon, 1, 0, 1, 1);
}
else
{
- if(BackendFlags.HOSTED in flags)
+ if(BackendFlags.HOSTED in m_info.flags)
{
var icon = getIcon("feed-cloud-symbolic", "Synced with Service");
grid.attach(icon, 1, 0, 1, 1);
}
- else if(BackendFlags.SELF_HOSTED in flags)
+ else if(BackendFlags.SELF_HOSTED in m_info.flags)
{
var box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 5);
box.pack_start(getIcon("feed-cloud-symbolic", "Synced with Service"), true, false, 0);
@@ -75,35 +74,35 @@ public class FeedReader.BackendInfoPopover : Gtk.Popover {
}
- if(BackendFlags.FREE_SOFTWARE in flags)
+ if(BackendFlags.FREE_SOFTWARE in m_info.flags)
{
var icon = getIcon("feed-gpl-symbolic", "Free Software");
grid.attach(icon, 1, 1, 1, 1);
}
- else if(BackendFlags.PROPRIETARY in flags)
+ else if(BackendFlags.PROPRIETARY in m_info.flags)
{
var icon = getIcon("feed-copyright-symbolic", "Proprietary Software");
grid.attach(icon, 1, 1, 1, 1);
}
- if(BackendFlags.FREE in flags)
+ if(BackendFlags.FREE in m_info.flags)
{
var icon = getIcon("feed-free-symbolic", "Free Service");
grid.attach(icon, 1, 2, 1, 1);
}
- else if(BackendFlags.PAID in flags)
+ else if(BackendFlags.PAID in m_info.flags)
{
var icon = getIcon("feed-nonfree-symbolic", "Paid Service");
grid.attach(icon, 1, 2, 1, 1);
}
- else if(BackendFlags.PAID_PREMIUM in flags)
+ else if(BackendFlags.PAID_PREMIUM in m_info.flags)
{
var icon = getIcon("feed-nonfree-symbolic", "Free basic usage with paid Premium");
grid.attach(icon, 1, 2, 1, 1);
}
- var nameLabel = new Gtk.Label(m_ext.serviceName());
+ var nameLabel = new Gtk.Label(m_info.name);
nameLabel.get_style_context().add_class("h2");
nameLabel.set_alignment(0.0f, 0.5f);
@@ -111,7 +110,7 @@ public class FeedReader.BackendInfoPopover : Gtk.Popover {
eventbox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK);
eventbox.button_press_event.connect(websiteClicked);
- eventbox.add(getIcon("feed-website-symbolic", m_ext.getWebsite()));
+ eventbox.add(getIcon("feed-website-symbolic", m_info.website));
var nameBox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, space);
nameBox.pack_start(nameLabel, true, false, 0);
nameBox.pack_end(eventbox, false, false, 0);
@@ -151,7 +150,7 @@ public class FeedReader.BackendInfoPopover : Gtk.Popover {
try
{
- Gtk.show_uri_on_window(MainWindow.get_default(), m_ext.getWebsite(), Gdk.CURRENT_TIME);
+ Gtk.show_uri_on_window(MainWindow.get_default(), m_info.website, Gdk.CURRENT_TIME);
}
catch(GLib.Error e)
{
diff --git a/src/Widgets/CategorieRow.vala b/src/Widgets/CategorieRow.vala
index af192829..fab49726 100644
--- a/src/Widgets/CategorieRow.vala
+++ b/src/Widgets/CategorieRow.vala
@@ -45,7 +45,6 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
public CategoryRow(string name, string categorieID, int orderID, uint unread_count, string parentID, int level, bool expanded)
{
-
this.get_style_context().add_class("fr-sidebar-row");
m_level = level;
m_parentID = parentID;
@@ -109,9 +108,7 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
m_unreadBox.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
m_unreadBox.set_events(Gdk.EventMask.LEAVE_NOTIFY_MASK);
m_unreadBox.add(m_unreadStack);
- m_unreadBox.button_press_event.connect(onUnreadClick);
- m_unreadBox.enter_notify_event.connect(onUnreadEnter);
- m_unreadBox.leave_notify_event.connect(onUnreadLeave);
+ activateUnreadEventbox(true);
m_box.pack_start(m_expandBox, false, false, 0);
m_box.pack_start(m_label, true, true, 0);
@@ -140,73 +137,90 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
else
m_stack.set_visible_child_name("expanded");
- if(UtilsUI.canManipulateContent())
+ if(Utils.canManipulateContent())
{
if(m_categorieID != CategoryID.MASTER.to_string()
&& m_categorieID != CategoryID.TAGS.to_string())
{
const Gtk.TargetEntry[] accepted_targets = {
- { "text/plain", 0, DragTarget.FEED },
+ { "text/plain", 0, DragTarget.FEED },
{ "STRING", 0, DragTarget.CAT }
};
Gtk.drag_dest_set (
- this,
- Gtk.DestDefaults.MOTION,
- accepted_targets,
- Gdk.DragAction.MOVE
- );
-
- this.drag_motion.connect(onDragMotion);
- this.drag_leave.connect(onDragLeave);
- this.drag_drop.connect(onDragDrop);
- this.drag_data_received.connect(onDragDataReceived);
-
- try
+ this,
+ Gtk.DestDefaults.MOTION,
+ accepted_targets,
+ Gdk.DragAction.MOVE
+ );
+
+ this.drag_motion.connect(onDragMotion);
+ this.drag_leave.connect(onDragLeave);
+ this.drag_drop.connect(onDragDrop);
+ this.drag_data_received.connect(onDragDataReceived);
+
+ if(FeedReaderBackend.get_default().supportMultiLevelCategories())
{
- if(DBusConnection.get_default().supportMultiLevelCategories())
- {
- const Gtk.TargetEntry[] provided_targets = {
- { "STRING", 0, DragTarget.CAT }
- };
-
- Gtk.drag_source_set (
- this,
- Gdk.ModifierType.BUTTON1_MASK,
- provided_targets,
- Gdk.DragAction.MOVE
- );
-
- this.drag_begin.connect(onDragBegin);
- this.drag_data_get.connect(onDragDataGet);
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("categoryRow.constructor: %s".printf(e.message));
+ const Gtk.TargetEntry[] provided_targets = {
+ { "STRING", 0, DragTarget.CAT }
+ };
+
+ Gtk.drag_source_set (
+ this,
+ Gdk.ModifierType.BUTTON1_MASK,
+ provided_targets,
+ Gdk.DragAction.MOVE
+ );
+
+ this.drag_begin.connect(onDragBegin);
+ this.drag_data_get.connect(onDragDataGet);
}
}
else if(m_categorieID == CategoryID.MASTER.to_string())
{
const Gtk.TargetEntry[] accepted_targets = {
- { "STRING", 0, DragTarget.CAT }
+ { "STRING", 0, DragTarget.CAT }
};
Gtk.drag_dest_set (
- this,
- Gtk.DestDefaults.MOTION,
- accepted_targets,
- Gdk.DragAction.MOVE
- );
-
- this.drag_motion.connect(onDragMotion);
- this.drag_leave.connect(onDragLeave);
- this.drag_drop.connect(onDragDrop);
- this.drag_data_received.connect(onDragDataReceived);
+ this,
+ Gtk.DestDefaults.MOTION,
+ accepted_targets,
+ Gdk.DragAction.MOVE
+ );
+
+ this.drag_motion.connect(onDragMotion);
+ this.drag_leave.connect(onDragLeave);
+ this.drag_drop.connect(onDragDrop);
+ this.drag_data_received.connect(onDragDataReceived);
}
}
}
+ ~CategoryRow()
+ {
+ activateUnreadEventbox(false);
+
+ m_expandBox.button_press_event.disconnect(onExpandClick);
+ m_expandBox.enter_notify_event.disconnect(onExpandEnter);
+ m_expandBox.leave_notify_event.disconnect(onExpandLeave);
+
+ m_eventBox.button_press_event.disconnect(onClick);
+
+ this.drag_begin.disconnect(onDragBegin);
+ this.drag_data_get.disconnect(onDragDataGet);
+
+ this.drag_motion.disconnect(onDragMotion);
+ this.drag_leave.disconnect(onDragLeave);
+ this.drag_drop.disconnect(onDragDrop);
+ this.drag_data_received.disconnect(onDragDataReceived);
+
+ this.drag_motion.disconnect(onDragMotion);
+ this.drag_leave.disconnect(onDragLeave);
+ this.drag_drop.disconnect(onDragDrop);
+ this.drag_data_received.disconnect(onDragDataReceived);
+ }
+
//------------- Drag Source Functions ----------------------------------------------
private void onDragBegin(Gtk.Widget widget, Gdk.DragContext context)
@@ -230,37 +244,37 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
//------------- Drag Target Functions ----------------------------------------------
private bool onDragMotion(Gtk.Widget widget, Gdk.DragContext context, int x, int y, uint time)
- {
+ {
this.set_state_flags(Gtk.StateFlags.PRELIGHT, false);
- return true;
- }
+ return true;
+ }
private void onDragLeave(Gtk.Widget widget, Gdk.DragContext context, uint time)
{
- this.unset_state_flags(Gtk.StateFlags.PRELIGHT);
- }
+ this.unset_state_flags(Gtk.StateFlags.PRELIGHT);
+ }
private bool onDragDrop(Gtk.Widget widget, Gdk.DragContext context, int x, int y, uint time)
- {
+ {
Logger.debug("categoryRow: onDragDrop");
- // If the source offers a target
- if(context.list_targets() != null)
+ // If the source offers a target
+ if(context.list_targets() != null)
{
- var target_type = (Gdk.Atom)context.list_targets().nth_data(0);
+ var target_type = (Gdk.Atom)context.list_targets().nth_data(0);
- // Request the data from the source.
- Gtk.drag_get_data(widget, context, target_type, time);
+ // Request the data from the source.
+ Gtk.drag_get_data(widget, context, target_type, time);
return true;
- }
+ }
return false;
- }
+ }
private void onDragDataReceived(Gtk.Widget widget, Gdk.DragContext context, int x, int y,
- Gtk.SelectionData selection_data, uint target_type, uint time)
- {
+ Gtk.SelectionData selection_data, uint target_type, uint time)
+ {
Logger.debug("categoryRow: onDragDataReceived");
var dataString = selection_data.get_text();
@@ -300,18 +314,11 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
}
else
{
- try
- {
- DBusConnection.get_default().moveFeed(feedID, currentCat, m_categorieID);
- }
- catch(GLib.Error e)
- {
- Logger.error("categoryRow.onDragDataReceived: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().moveFeed(feedID, currentCat, m_categorieID);
}
Gtk.drag_finish(context, true, false, time);
- }
+ }
else if(target_type == DragTarget.CAT)
{
Logger.debug("drag catID: " + dataString);
@@ -324,14 +331,7 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
}
else
{
- try
- {
- DBusConnection.get_default().moveCategory(dataString, m_categorieID);
- }
- catch(GLib.Error e)
- {
- Logger.error("categoryRow.onDragDataReceived: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().moveCategory(dataString, m_categorieID);
}
Gtk.drag_finish(context, true, false, time);
@@ -339,7 +339,7 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
}
}
- }
+ }
private Gtk.Window getDragWindow()
{
@@ -362,7 +362,7 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
if(event.button != 3)
return false;
- if(!UtilsUI.canManipulateContent())
+ if(!Utils.canManipulateContent())
return false;
@@ -393,14 +393,7 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
string text = _("Category \"%s\" removed").printf(m_name);
var notification = MainWindow.get_default().showNotification(text);
ulong eventID = notification.dismissed.connect(() => {
- try
- {
- DBusConnection.get_default().removeCategory(m_categorieID);
- }
- catch(GLib.Error e)
- {
- Logger.error("categoryRow.onClick: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().removeCategory(m_categorieID);
});
notification.action.connect(() => {
notification.disconnect(eventID);
@@ -421,14 +414,7 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
uint time = 300;
this.reveal(false, time);
GLib.Timeout.add(time, () => {
- try
- {
- DBusConnection.get_default().removeCategoryWithChildren(m_categorieID);
- }
- catch(GLib.Error e)
- {
- Logger.error("categoryRow.onClick: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().removeCategoryWithChildren(m_categorieID);
return false;
});
});
@@ -488,32 +474,25 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
var renameEntry = new Gtk.Entry();
renameEntry.set_text(m_name);
renameEntry.activate.connect(() => {
- try
+ if(m_categorieID != CategoryID.NEW.to_string())
{
- if(m_categorieID != CategoryID.NEW.to_string())
+ FeedReaderBackend.get_default().renameCategory(m_categorieID, renameEntry.get_text());
+ }
+ else if(context != null)
+ {
+ Logger.debug("categoryRow: create new Category " + renameEntry.get_text());
+ m_categorieID = FeedReaderBackend.get_default().addCategory(renameEntry.get_text(), "", true);
+
+ if(id2 == null) // move feed
{
- DBusConnection.get_default().renameCategory(m_categorieID, renameEntry.get_text());
+ FeedReaderBackend.get_default().moveCategory(id1, m_categorieID);
}
- else if(context != null)
+ else // move category
{
- Logger.debug("categoryRow: create new category " + renameEntry.get_text());
- m_categorieID = DBusConnection.get_default().addCategory(renameEntry.get_text(), "", true);
-
- if(id2 == null) // move feed
- {
- DBusConnection.get_default().moveCategory(id1, m_categorieID);
- }
- else // move category
- {
- DBusConnection.get_default().moveFeed(id1, id2, m_categorieID);
- }
-
- Gtk.drag_finish(context, true, false, time);
+ FeedReaderBackend.get_default().moveFeed(id1, id2, m_categorieID);
}
- }
- catch(GLib.Error e)
- {
- Logger.error("categoryRow.showRenamePopover: %s".printf(e.message));
+
+ Gtk.drag_finish(context, true, false, time);
}
popRename.hide();
@@ -709,22 +688,11 @@ public class FeedReader.CategoryRow : Gtk.ListBoxRow {
public void reveal(bool reveal, uint duration = 500)
{
- if(Settings.state().get_boolean("no-animations"))
- {
- m_revealer.set_transition_type(Gtk.RevealerTransitionType.NONE);
- m_revealer.set_transition_duration(0);
- m_revealer.set_reveal_child(reveal);
- m_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
- m_revealer.set_transition_duration(500);
- }
- else
- {
- if(!reveal && this.is_selected())
- deselectRow();
+ if(!reveal && this.is_selected())
+ deselectRow();
- m_revealer.set_transition_duration(duration);
- m_revealer.set_reveal_child(reveal);
- }
+ m_revealer.set_transition_duration(duration);
+ m_revealer.set_reveal_child(reveal);
}
public void activateUnreadEventbox(bool activate)
diff --git a/src/Widgets/ColumnView.vala b/src/Widgets/ColumnView.vala
index a6570e25..d7f8e31b 100644
--- a/src/Widgets/ColumnView.vala
+++ b/src/Widgets/ColumnView.vala
@@ -35,8 +35,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
private ColumnView()
{
- Logger.debug("ContentPage: setup FeedList");
-
+ Logger.debug("ColumnView: setup");
m_feedList = new feedList();
m_footer = new FeedListFooter();
var feedListBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
@@ -57,6 +56,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_articleList.setSelectedType(FeedListType.FEED);
m_article_view.clearContent();
m_headerbar.showArticleButtons(false);
+ m_headerbar.clearTitle();
m_articleList.setSelectedFeed(feedID);
newArticleList();
@@ -76,6 +76,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_articleList.setSelectedType(FeedListType.TAG);
m_article_view.clearContent();
m_headerbar.showArticleButtons(false);
+ m_headerbar.clearTitle();
m_articleList.setSelectedFeed(tagID);
newArticleList();
m_footer.setRemoveButtonSensitive(true);
@@ -87,6 +88,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_articleList.setSelectedType(FeedListType.CATEGORY);
m_article_view.clearContent();
m_headerbar.showArticleButtons(false);
+ m_headerbar.clearTitle();
m_articleList.setSelectedFeed(categorieID);
newArticleList();
@@ -107,7 +109,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_articleList = new ArticleList();
m_articleList.drag_begin.connect((context) => {
- if(dbUI.get_default().read_tags().is_empty)
+ if(DataBase.readOnly().read_tags().is_empty)
m_feedList.newFeedlist(m_articleList.getState(), false, true);
m_feedList.expand_collapse_category(CategoryID.TAGS.to_string(), true);
m_feedList.expand_collapse_category(CategoryID.MASTER.to_string(), false);
@@ -119,7 +121,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
});
m_articleList.drag_failed.connect((context, result) => {
Logger.debug("ContentPage: articleList drag_failed signal");
- if(dbUI.get_default().read_tags().is_empty)
+ if(DataBase.readOnly().read_tags().is_empty)
m_feedList.newFeedlist(m_articleList.getState(), false, false);
else
m_feedList.removeEmptyTagRow();
@@ -135,9 +137,10 @@ public class FeedReader.ColumnView : Gtk.Paned {
{
m_article_view.load(row.getID());
m_headerbar.showArticleButtons(true);
+ m_headerbar.setTitle(row.getName());
Logger.debug("ContentPage: set headerbar");
- m_headerbar.setRead(row.isUnread());
- m_headerbar.setMarked(row.isMarked());
+ m_headerbar.setRead(row.getArticle().getUnread());
+ m_headerbar.setMarked(row.getArticle().getMarked());
m_headerbar.showMediaButton(row.haveMedia());
m_article_view.showMediaButton(row.haveMedia());
}
@@ -163,6 +166,10 @@ public class FeedReader.ColumnView : Gtk.Paned {
});
});
+ m_headerbar.cancel.connect(() => {
+ FeedReaderApp.get_default().cancelSync();
+ });
+
m_headerbar.change_state.connect((state, transition) => {
setArticleListState(state);
clearArticleView();
@@ -177,8 +184,8 @@ public class FeedReader.ColumnView : Gtk.Paned {
});
m_headerbar.notify["position"].connect(() => {
- this.set_position(m_headerbar.get_position());
- });
+ this.set_position(m_headerbar.get_position());
+ });
m_headerbar.toggledMarked.connect(() => {
toggleMarkedSelectedArticle();
@@ -253,7 +260,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_feedList.newFeedlist(m_articleList.getState(), defaultSettings);
}
- public void updateFeedList()
+ public void refreshFeedListCounter()
{
m_feedList.refreshCounters(m_articleList.getState());
}
@@ -289,6 +296,7 @@ public class FeedReader.ColumnView : Gtk.Paned {
private void clearArticleView()
{
m_headerbar.showArticleButtons(false);
+ m_headerbar.clearTitle();
m_article_view.clearContent();
}
@@ -297,44 +305,27 @@ public class FeedReader.ColumnView : Gtk.Paned {
return m_feedList.getSelectedRow();
}
- public string getSelectedArticle()
+ public Article getSelectedArticle()
{
return m_articleList.getSelectedArticle();
}
- public ArticleStatus getSelectedArticleMarked()
- {
- return m_articleList.getSelectedArticleMarked();
- }
-
- public ArticleStatus getSelectedArticleRead()
- {
- return m_articleList.getSelectedArticleRead();
- }
-
- public string getSelectedURL()
- {
- return m_articleList.getSelectedURL();
- }
-
public void markAllArticlesAsRead()
{
- m_headerbar.setRead(false);
+ m_headerbar.setRead(ArticleStatus.READ);
m_articleList.markAllAsRead();
}
public void toggleReadSelectedArticle()
{
m_headerbar.toggleRead();
- bool unread = m_articleList.toggleReadSelected();
- m_article_view.setUnread(unread);
+ m_article_view.setRead(m_articleList.toggleReadSelected());
}
public void toggleMarkedSelectedArticle()
{
m_headerbar.toggleMarked();
- bool marked = m_articleList.toggleMarkedSelected();
- m_article_view.setMarked(marked);
+ m_article_view.setMarked(m_articleList.toggleMarkedSelected());
}
public void openSelectedArticle()
@@ -352,32 +343,6 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_articleList.removeTagFromSelectedRow(tagID);
}
- public Gee.ArrayList<tag> getSelectedArticleTags()
- {
- var tags = new Gee.ArrayList<tag>();
- string id = m_articleList.getSelectedArticle();
-
- if(id != "" && id != "empty")
- {
- var article = dbUI.get_default().read_article(id);
- unowned Gee.ArrayList<string> tagIDs = article.getTags();
-
- foreach(string tagID in tagIDs)
- {
- tags.add(dbUI.get_default().read_tag(tagID));
- }
- }
-
- return tags;
- }
-
- public Gee.ArrayList<string> getSelectedArticleMedia()
- {
- string id = m_articleList.getSelectedArticle();
- var article = dbUI.get_default().read_article(id);
- return article.getMedia();
- }
-
public void syncStarted()
{
m_articleList.syncStarted();
@@ -388,13 +353,6 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_articleList.syncFinished();
}
- /*
- public void updateAccountInfo()
- {
- m_feedList.updateAccountInfo();
- }
- */
-
public Gdk.RGBA getBackgroundColor()
{
return m_articleList.getBackgroundColor();
@@ -410,9 +368,9 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_headerbar.setOffline();
m_feedList.setOffline();
- if(!UtilsUI.canManipulateContent(false))
+ if(!Utils.canManipulateContent(false))
{
- m_footer.setActive(false);
+ m_footer.setAddButtonSensitive(false);
m_feedList.newFeedlist(m_articleList.getState(), false);
}
}
@@ -422,9 +380,9 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_headerbar.setOnline();
m_feedList.setOnline();
- if(UtilsUI.canManipulateContent(true))
+ if(Utils.canManipulateContent(true))
{
- m_footer.setActive(true);
+ m_footer.setAddButtonSensitive(true);
m_feedList.newFeedlist(m_articleList.getState(), false);
var selected_row = m_feedList.getSelectedRow();
@@ -448,6 +406,11 @@ public class FeedReader.ColumnView : Gtk.Paned {
m_footer.setReady();
}
+ public void footerShowError(string errmsg)
+ {
+ m_footer.showError(errmsg);
+ }
+
public feedList getFeedList()
{
return m_feedList;
@@ -527,7 +490,10 @@ public class FeedReader.ColumnView : Gtk.Paned {
state.setFeedListWidth(m_pane.get_position());
state.setFeedListScrollPos(m_feedList.vadjustment.value);
state.setArticleViewScrollPos(m_article_view.getScrollPos());
- state.setArticleListSelectedRow(m_articleList.getSelectedArticle());
+ var selectedArticle = m_articleList.getSelectedArticle();
+ if(selectedArticle != null)
+ state.setArticleListSelectedRow(selectedArticle.getArticleID());
+ state.setArticleListTopRow(m_articleList.getFirstArticle());
m_headerbar.saveState(ref state);
}
diff --git a/src/Widgets/ColumnViewHeader.vala b/src/Widgets/ColumnViewHeader.vala
index 6e958835..6345c0c3 100644
--- a/src/Widgets/ColumnViewHeader.vala
+++ b/src/Widgets/ColumnViewHeader.vala
@@ -21,9 +21,8 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
private ArticleListState m_state;
private Gtk.HeaderBar m_header_left;
private ArticleViewHeader m_header_right;
- private Gtk.Label m_syncProgressText;
- private Gtk.Popover m_syncPopover;
public signal void refresh();
+ public signal void cancel();
public signal void change_state(ArticleListState state, Gtk.StackTransitionType transition);
public signal void search_term(string searchTerm);
public signal void toggledMarked();
@@ -57,18 +56,18 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
change_state(m_state, transition);
});
- m_refresh_button = new UpdateButton.from_icon_name("feed-refresh-symbolic", _("Update feeds"));
- m_refresh_button.updating(Settings.state().get_boolean("currently-updating"));
+ bool updating = Settings.state().get_boolean("currently-updating");
+ m_refresh_button = new UpdateButton.from_icon_name("feed-refresh-symbolic", _("Update feeds"), true, true);
+ m_refresh_button.updating(updating);
m_refresh_button.clicked.connect(() => {
if(!m_refresh_button.getStatus())
refresh();
else
- m_syncPopover.show_all();
+ {
+ cancel();
+ m_refresh_button.setSensitive(false);
+ }
});
- m_syncProgressText = new Gtk.Label(Settings.state().get_string("sync-status"));
- m_syncProgressText.margin = 20;
- m_syncPopover = new Gtk.Popover(m_refresh_button);
- m_syncPopover.add(m_syncProgressText);
@@ -98,16 +97,13 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
menubutton.image = new Gtk.Image.from_icon_name("emblem-system-symbolic", Gtk.IconSize.MENU);
menubutton.set_size_request(32, 32);
menubutton.set_use_popover(true);
- menubutton.set_menu_model(UtilsUI.getMenu());
+ menubutton.set_menu_model(Utils.getMenu());
menubutton.set_tooltip_text(_("Settings"));
m_header_left.pack_end(menubutton);
}
else if(GLib.Environment.get_variable("XDG_CURRENT_DESKTOP").down() == "gnome")
{
- var quit_action = new SimpleAction("quit", null);
- quit_action.activate.connect(FeedReaderApp.get_default().quit);
- FeedReaderApp.get_default().add_action(quit_action);
- FeedReaderApp.get_default().app_menu = UtilsUI.getMenu();
+ FeedReaderApp.get_default().app_menu = Utils.getMenu();
}
@@ -119,7 +115,7 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
m_header_right.show_close_button = true;
m_header_right.get_style_context().add_class("header_left");
m_header_right.get_style_context().add_class("titlebar");
- m_header_right.set_title("FeedReader");
+ this.clearTitle();
m_header_right.set_size_request(450, 0);
m_header_right.toggledMarked.connect(() => {
toggledMarked();
@@ -146,15 +142,15 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
private void set_window_buttons()
{
- string[] buttons = Gtk.Settings.get_default().gtk_decoration_layout.split(":");
- if (buttons.length < 2) {
+ string[] buttons = Gtk.Settings.get_default().gtk_decoration_layout.split(":");
+ if (buttons.length < 2) {
buttons = {buttons[0], ""};
Logger.warning("gtk_decoration_layout in unexpected format");
- }
+ }
m_header_left.set_decoration_layout(buttons[0] + ":");
m_header_right.set_decoration_layout(":" + buttons[1]);
- }
+ }
public void setRefreshButton(bool status)
{
@@ -179,7 +175,7 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
return m_search.has_focus;
}
- public void setMarked(bool marked)
+ public void setMarked(ArticleStatus marked)
{
m_header_right.setMarked(marked);
}
@@ -189,7 +185,7 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
m_header_right.toggleMarked();
}
- public void setRead(bool read)
+ public void setRead(ArticleStatus read)
{
m_header_right.setRead(read);
}
@@ -221,7 +217,7 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
public void updateSyncProgress(string progress)
{
- m_syncProgressText.set_text(progress);
+ m_refresh_button.setProgress(progress);
}
public void refreshSahrePopover()
@@ -234,4 +230,13 @@ public class FeedReader.ColumnViewHeader : Gtk.Paned {
state.setSearchTerm(m_search.text);
state.setArticleListState(m_state);
}
+ public void setTitle(string title)
+ {
+ m_header_right.set_title(title);
+ }
+ public void clearTitle()
+ {
+ m_header_right.set_title("FeedReader");
+ }
+
}
diff --git a/src/Widgets/FeedList.vala b/src/Widgets/FeedList.vala
index bede1874..ddaadc8c 100644
--- a/src/Widgets/FeedList.vala
+++ b/src/Widgets/FeedList.vala
@@ -16,12 +16,12 @@
public class FeedReader.feedList : Gtk.ScrolledWindow {
private Gtk.ListBox m_list;
- private Gtk.ListBoxRow? m_selected = null;
+ private string? m_selectedID = null;
+ private FeedListType m_selectedType = FeedListType.ALL_FEEDS;
private TagRow? m_emptyTagRow = null;
private Gtk.Spinner m_spinner;
private ServiceInfo m_branding;
private uint m_expand_collapse_time = 150;
- private bool m_update = false;
private bool m_busy = false;
private bool m_TagsDisplayed = false;
public signal void newFeedSelected(string feedID);
@@ -44,37 +44,42 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
this.add(feedlist_box);
m_list.row_activated.connect(() => {
- FeedRow selected_row = m_list.get_selected_row() as FeedRow;
- if(selected_row != null)
+ FeedRow selected_feed = m_list.get_selected_row() as FeedRow;
+ if(selected_feed != null)
{
- if(selected_row.getName() == "")
- {
- // don't select seperator
- m_list.select_row(m_selected);
- return;
- }
- if(selected_row != m_selected)
- {
- m_selected = selected_row;
- if(!m_update)
- newFeedSelected(selected_row.getID());
+ if(selected_feed.getID() == m_selectedID
+ && m_selectedType == FeedListType.FEED)
return;
- }
+
+ m_selectedID = selected_feed.getID();
+ m_selectedType = FeedListType.FEED;
+ newFeedSelected(selected_feed.getID());
+ return;
}
+
CategoryRow selected_categorie = m_list.get_selected_row() as CategoryRow;
- if(selected_categorie != null && selected_categorie != m_selected)
+ if(selected_categorie != null)
{
- m_selected = selected_categorie;
- if(!m_update)
- newCategorieSelected(selected_categorie.getID());
+ if(selected_categorie.getID() == m_selectedID
+ && m_selectedType == FeedListType.CATEGORY)
+ return;
+
+ m_selectedID = selected_categorie.getID();
+ m_selectedType = FeedListType.CATEGORY;
+ newCategorieSelected(selected_categorie.getID());
return;
}
+
TagRow selected_tag = m_list.get_selected_row() as TagRow;
- if(selected_tag != null && selected_tag != m_selected)
+ if(selected_tag != null)
{
- m_selected = selected_tag;
- if(!m_update)
- newTagSelected(selected_tag.getID());
+ if(selected_tag.getTag().getTagID() == m_selectedID
+ && m_selectedType == FeedListType.TAG)
+ return;
+
+ m_selectedID = selected_tag.getTag().getTagID();
+ m_selectedType = FeedListType.TAG;
+ newTagSelected(selected_tag.getTag().getTagID());
return;
}
});
@@ -166,7 +171,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
if(current_tag.isRevealed())
{
m_list.select_row(current_tag);
- newTagSelected(current_tag.getID());
+ newTagSelected(current_tag.getTag().getTagID());
break;
}
}
@@ -198,14 +203,10 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
}
Settings.state().set_double("feed-row-scrollpos", vadjustment.value);
- Settings.state().set_boolean("no-animations", true);
- m_update = true;
}
clear();
createFeedlist(state, defaultSettings, masterCat);
- Settings.state().set_boolean("no-animations", false);
- m_update = false;
m_busy = false;
}
@@ -231,7 +232,16 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
private void createFeedlist(ArticleListState state, bool defaultSettings, bool masterCat)
{
- var row_separator1 = new FeedRow(null, 0, false, FeedID.SEPARATOR.to_string(), "-1", 0);
+ var separatorFeed = new Feed(FeedID.SEPARATOR.to_string(), "", "", 0);
+
+ uint unread = 0;
+ if(state == ArticleListState.MARKED)
+ unread = DataBase.readOnly().get_marked_total();
+ else
+ unread = DataBase.readOnly().get_unread_total();
+ var allFeed = new Feed(FeedID.ALL.to_string(), _("All Articles"), "", unread);
+
+ var row_separator1 = new FeedRow(separatorFeed, "-1", 0);
var separator1 = new Gtk.Separator(Gtk.Orientation.HORIZONTAL);
separator1.get_style_context().add_class("fr-sidebar-separator");
separator1.margin_top = 8;
@@ -239,20 +249,16 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
row_separator1.sensitive = false;
m_list.add(row_separator1);
- uint unread = 0;
- if(state == ArticleListState.MARKED)
- unread = dbUI.get_default().get_marked_total();
- else
- unread = dbUI.get_default().get_unread_total();
- var row_all = new FeedRow(_("All Articles"), unread, false, FeedID.ALL.to_string(), "-1", 0);
+
+ var row_all = new FeedRow(allFeed, "-1", 0);
row_all.margin_top = 8;
row_all.margin_bottom = 8;
m_list.add(row_all);
row_all.activateUnreadEventbox((state == ArticleListState.MARKED) ? false : true);
row_all.setAsRead.connect(markSelectedRead);
- row_all.reveal(true);
+ row_all.reveal(true, 0);
- var row_separator = new FeedRow(null, 0, false, FeedID.SEPARATOR.to_string(), "-1", 0);
+ var row_separator = new FeedRow(separatorFeed, "-1", 0);
var separator = new Gtk.Separator(Gtk.Orientation.HORIZONTAL);
separator.get_style_context().add_class("fr-sidebar-separator");
separator.margin_bottom = 8;
@@ -262,9 +268,9 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
//-------------------------------------------------------------------
- var feeds = dbUI.get_default().read_feeds((state == ArticleListState.MARKED) ? true : false);
+ var feeds = DataBase.readOnly().read_feeds((state == ArticleListState.MARKED) ? true : false);
- if(!UtilsUI.onlyShowFeeds())
+ if(!Utils.onlyShowFeeds())
{
createCategories(ref feeds, masterCat, state);
createTags();
@@ -272,8 +278,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
foreach(var item in feeds)
{
-
- if(!UtilsUI.onlyShowFeeds())
+ if(!Utils.onlyShowFeeds())
{
var FeedChildList = m_list.get_children();
int pos = 0;
@@ -284,20 +289,14 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
if(tmpRow != null)
{
- if(Utils.arrayContains(item.getCatIDs(), tmpRow.getID())
+ if(item.getCatIDs().contains(tmpRow.getID())
|| tmpRow.getID() == "" && item.isUncategorized())
{
- var feedrow = new FeedRow(
- item.getTitle(),
- item.getUnread(),
- item.hasIcon(),
- item.getFeedID(),
- tmpRow.getID(),
- tmpRow.getLevel()
- );
+ var feedrow = new FeedRow(item, tmpRow.getID(), tmpRow.getLevel());
m_list.insert(feedrow, pos);
feedrow.setAsRead.connect(markSelectedRead);
feedrow.moveUP.connect(moveUP);
+ feedrow.copyFeedURL.connect(copySelectedFeedURL);
feedrow.deselectRow.connect(deselectRow);
feedrow.drag_begin.connect((context) => {
onDragBegin(context);
@@ -305,7 +304,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
});
feedrow.drag_failed.connect(onDragEnd);
if(!Settings.general().get_boolean("feedlist-only-show-unread") || item.getUnread() != 0)
- feedrow.reveal(true);
+ feedrow.reveal(true, 0);
feedrow.activateUnreadEventbox((state == ArticleListState.MARKED) ? false : true);
pos++;
}
@@ -314,14 +313,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
}
else
{
- var feedrow = new FeedRow (
- item.getTitle(),
- item.getUnread(),
- item.hasIcon(),
- item.getFeedID(),
- item.getCatIDs()[0],
- 0
- );
+ var feedrow = new FeedRow(item, item.getCatIDs()[0], 0);
m_list.insert(feedrow, 3);
feedrow.setAsRead.connect(markSelectedRead);
feedrow.moveUP.connect(moveUP);
@@ -332,20 +324,20 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
});
feedrow.drag_failed.connect(onDragEnd);
if(!Settings.general().get_boolean("feedlist-only-show-unread") || item.getUnread() != 0)
- feedrow.reveal(true);
+ feedrow.reveal(true, 0);
feedrow.activateUnreadEventbox((state == ArticleListState.MARKED) ? false : true);
}
}
initCollapseCategories();
- restoreSelectedRow(defaultSettings);
+ restoreSelectedRow();
this.show_all();
vadjustment.notify["upper"].connect(restoreScrollPos);
}
- private void restoreSelectedRow(bool defaultSettings)
+ private void restoreSelectedRow()
{
- Logger.debug("FeedList: restore selected row: " + Settings.state().get_string("feedlist-selected-row"));
+ Logger.debug("FeedList.restoreSelectedRow: " + Settings.state().get_string("feedlist-selected-row"));
string[] selectedRow = Settings.state().get_string("feedlist-selected-row").split(" ", 2);
var FeedChildList = m_list.get_children();
@@ -358,7 +350,8 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
if(tmpRow != null && tmpRow.getID() == selectedRow[1])
{
m_list.select_row(tmpRow);
- tmpRow.activate();
+ if(m_selectedID != selectedRow[1])
+ tmpRow.activate();
return;
}
}
@@ -372,7 +365,8 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
if(tmpRow != null && tmpRow.getID() == selectedRow[1])
{
m_list.select_row(tmpRow);
- tmpRow.activate();
+ if(m_selectedID != selectedRow[1])
+ tmpRow.activate();
return;
}
}
@@ -383,10 +377,11 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
foreach(Gtk.Widget row in FeedChildList)
{
var tmpRow = row as TagRow;
- if(tmpRow != null && tmpRow.getID() == selectedRow[1])
+ if(tmpRow != null && tmpRow.getTag().getTagID() == selectedRow[1])
{
m_list.select_row(tmpRow);
- tmpRow.activate();
+ if(m_selectedID != selectedRow[1])
+ tmpRow.activate();
return;
}
}
@@ -437,7 +432,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
m_list.insert(CategoryRow, length+1);
CategoryRow.setAsRead.connect(markSelectedRead);
CategoryRow.moveUP.connect(moveUP);
- CategoryRow.reveal(true);
+ CategoryRow.reveal(true, 0);
}
private void addTagCategory(int length)
@@ -461,34 +456,27 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
});
m_list.insert(tagrow, length+2);
tagrow.setAsRead.connect(markSelectedRead);
- tagrow.reveal(true);
+ tagrow.reveal(true, 0);
m_TagsDisplayed = true;
}
- private void createCategories(ref Gee.ArrayList<feed> feeds, bool masterCat, ArticleListState state)
+ private void createCategories(ref Gee.List<Feed> feeds, bool masterCat, ArticleListState state)
{
- int maxCatLevel = dbUI.get_default().getMaxCatLevel();
+ int maxCatLevel = DataBase.readOnly().getMaxCatLevel();
int length = (int)m_list.get_children().length();
bool supportTags = false;
bool supportCategories = true;
bool supportMultiLevelCategories = false;
string uncategorizedID = "";
- try
- {
- supportTags = DBusConnection.get_default().supportTags();
- supportCategories = DBusConnection.get_default().supportCategories();
- uncategorizedID = DBusConnection.get_default().uncategorizedID();
- supportMultiLevelCategories = DBusConnection.get_default().supportMultiLevelCategories();
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedList.createCategories: %s".printf(e.message));
- }
+ supportTags = FeedReaderBackend.get_default().supportTags();
+ supportCategories = FeedReaderBackend.get_default().supportCategories();
+ uncategorizedID = FeedReaderBackend.get_default().uncategorizedID();
+ supportMultiLevelCategories = FeedReaderBackend.get_default().supportMultiLevelCategories();
if((supportTags
- && !dbUI.get_default().isTableEmpty("tags"))
+ && !DataBase.readOnly().isTableEmpty("tags"))
|| masterCat)
{
addMasterCategory(length, _("Categories"));
@@ -507,16 +495,16 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
for(int i = 1; i <= maxCatLevel; i++)
{
- var categories = dbUI.get_default().read_categories_level(i, feeds);
+ var categories = DataBase.readOnly().read_categories_level(i, feeds);
- if(dbUI.get_default().haveFeedsWithoutCat())
+ if(DataBase.readOnly().haveFeedsWithoutCat())
{
categories.insert(
0,
- new category(
+ new Category(
uncategorizedID,
_("Uncategorized"),
- (int)dbUI.get_default().get_unread_uncategorized(),
+ (int)DataBase.readOnly().get_unread_uncategorized(),
(int)(categories.size + 10),
CategoryID.MASTER.to_string(),
1
@@ -546,15 +534,15 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
}
var CategoryRow = new CategoryRow(
- item.getTitle(),
- item.getCatID(),
- item.getOrderID(),
- item.getUnreadCount(),
- parent,
- level,
- getCatState(item.getCatID())
- );
- expand = false;
+ item.getTitle(),
+ item.getCatID(),
+ item.getOrderID(),
+ item.getUnreadCount(),
+ parent,
+ level,
+ getCatState(item.getCatID())
+ );
+ expand = false;
CategoryRow.collapse.connect((collapse, catID, selectParent) => {
if(collapse)
collapseCategorieInternal(catID, selectParent);
@@ -572,7 +560,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
});
CategoryRow.drag_failed.connect(onDragEnd);
if(!Settings.general().get_boolean("feedlist-only-show-unread") || item.getUnreadCount() != 0)
- CategoryRow.reveal(true);
+ CategoryRow.reveal(true, 0);
CategoryRow.activateUnreadEventbox((state == ArticleListState.MARKED) ? false : true);
break;
}
@@ -586,25 +574,25 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
{
if(!Settings.general().get_boolean("only-feeds"))
{
- var tags = dbUI.get_default().read_tags();
- foreach(var Tag in tags)
+ var tags = DataBase.readOnly().read_tags();
+ foreach(Tag tag in tags)
{
- var tagrow = new TagRow (Tag.getTitle(), Tag.getTagID(), Tag.getColor());
+ var tagrow = new TagRow(tag);
tagrow.moveUP.connect(moveUP);
tagrow.removeRow.connect(() => {
removeRow(tagrow);
});
m_list.insert(tagrow, -1);
- tagrow.reveal(true);
+ tagrow.reveal(true, 0);
}
}
}
public void refreshCounters(ArticleListState state)
{
- uint allCount = (state == ArticleListState.MARKED) ? dbUI.get_default().get_marked_total() : dbUI.get_default().get_unread_total();
- var feeds = dbUI.get_default().read_feeds((state == ArticleListState.MARKED) ? true : false);
- var categories = dbUI.get_default().read_categories(feeds);
+ uint allCount = (state == ArticleListState.MARKED) ? DataBase.readOnly().get_marked_total() : DataBase.readOnly().get_unread_total();
+ var feeds = DataBase.readOnly().read_feeds((state == ArticleListState.MARKED) ? true : false);
+ var categories = DataBase.readOnly().read_categories(feeds);
// double-check
uint feedCount = 0;
@@ -637,17 +625,17 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
var tmpFeedRow = row as FeedRow;
if(tmpFeedRow != null)
{
- foreach(feed Feed in feeds)
+ foreach(Feed feed in feeds)
{
- if(tmpFeedRow.getID() == Feed.getFeedID())
+ if(tmpFeedRow.getID() == feed.getFeedID())
{
- tmpFeedRow.set_unread_count(Feed.getUnread());
+ tmpFeedRow.set_unread_count(feed.getUnread());
tmpFeedRow.activateUnreadEventbox((state == ArticleListState.MARKED) ? false : true);
if(Settings.general().get_boolean("feedlist-only-show-unread"))
{
if(tmpFeedRow.getUnreadCount() == 0)
tmpFeedRow.reveal(false);
- else if(isCategorieExpanded(tmpFeedRow.getCatID()) || UtilsUI.onlyShowFeeds())
+ else if(isCategorieExpanded(tmpFeedRow.getCatID()) || Utils.onlyShowFeeds())
tmpFeedRow.reveal(true);
}
@@ -664,7 +652,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
var tmpCatRow = row as CategoryRow;
if(tmpCatRow != null)
{
- foreach(category cat in categories)
+ foreach(Category cat in categories)
{
if(tmpCatRow.getID() == cat.getCatID())
{
@@ -684,7 +672,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
}
}
- if(dbUI.get_default().haveFeedsWithoutCat())
+ if(DataBase.readOnly().haveFeedsWithoutCat())
{
foreach(Gtk.Widget row in FeedChildList)
{
@@ -693,12 +681,12 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
{
if(state == ArticleListState.MARKED)
{
- tmpCatRow.set_unread_count(dbUI.get_default().get_marked_uncategorized());
+ tmpCatRow.set_unread_count(DataBase.readOnly().get_marked_uncategorized());
tmpCatRow.activateUnreadEventbox(false);
}
else
{
- tmpCatRow.set_unread_count(dbUI.get_default().get_unread_uncategorized());
+ tmpCatRow.set_unread_count(DataBase.readOnly().get_unread_uncategorized());
tmpCatRow.activateUnreadEventbox(true);
}
if(Settings.general().get_boolean("feedlist-only-show-unread") && tmpCatRow.getUnreadCount() != 0)
@@ -721,13 +709,13 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
var tmpCatRow = row as CategoryRow;
if(tmpCatRow != null && !tmpCatRow.isExpanded())
{
- collapseCategorieInternal(tmpCatRow.getID());
+ collapseCategorieInternal(tmpCatRow.getID(), true, false);
}
}
}
- private void collapseCategorieInternal(string catID, bool selectParent = true)
+ private void collapseCategorieInternal(string catID, bool selectParent, bool animate = true)
{
var FeedChildList = m_list.get_children();
var selected_row = m_list.get_selected_row();
@@ -737,18 +725,19 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
var tmpFeedRow = row as FeedRow;
var tmpCatRow = row as CategoryRow;
var tmpTagRow = row as TagRow;
+ var animationTime = (animate) ? m_expand_collapse_time : 0;
if(tmpFeedRow != null && tmpFeedRow.getCatID() == catID)
{
- tmpFeedRow.reveal(false, m_expand_collapse_time);
+ tmpFeedRow.reveal(false, animationTime);
}
if(tmpCatRow != null && tmpCatRow.getParent() == catID)
{
- tmpCatRow.reveal(false, m_expand_collapse_time);
- collapseCategorieInternal(tmpCatRow.getID(), selectParent);
+ tmpCatRow.reveal(false, animationTime);
+ collapseCategorieInternal(tmpCatRow.getID(), selectParent, animate);
}
if(tmpTagRow != null && catID == CategoryID.TAGS.to_string())
{
- tmpTagRow.reveal(false, m_expand_collapse_time);
+ tmpTagRow.reveal(false, animationTime);
}
}
@@ -768,7 +757,8 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
if(tmpCatRow != null && tmpCatRow.getID() == catID)
{
m_list.select_row(tmpCatRow);
- m_selected = tmpCatRow;
+ m_selectedID = tmpCatRow.getID();
+ m_selectedType = FeedListType.CATEGORY;
newCategorieSelected(catID);
}
}
@@ -884,7 +874,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
}
else if(tagrow != null)
{
- return "tag " + tagrow.getID();
+ return "tag " + tagrow.getTag().getTagID();
}
return "";
@@ -895,39 +885,32 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
{
Logger.debug("FeedList: mark all articles as read");
- try
+ if(type == FeedListType.FEED)
{
- if(type == FeedListType.FEED)
+ if(id == FeedID.ALL.to_string())
{
- if(id == FeedID.ALL.to_string())
- {
- DBusConnection.get_default().markAllItemsRead();
- }
- else
- {
- DBusConnection.get_default().markFeedAsRead(id, false);
- }
+ FeedReaderBackend.get_default().markAllItemsRead();
}
- else if(type == FeedListType.CATEGORY)
+ else
{
- if(id == "")
- {
- var feeds = dbUI.get_default().read_feeds_without_cat();
- foreach(feed Feed in feeds)
- {
- DBusConnection.get_default().markFeedAsRead(Feed.getFeedID(), false);
- Logger.debug("FeedList: mark all articles as read feed: %s".printf(Feed.getTitle()));
- }
- }
- else
- {
- DBusConnection.get_default().markFeedAsRead(id, true);
- }
+ FeedReaderBackend.get_default().markFeedAsRead(id, false);
}
}
- catch(GLib.Error e)
+ else if(type == FeedListType.CATEGORY)
{
- Logger.error("FeedList.markSelectedRead: %s".printf(e.message));
+ if(id == "")
+ {
+ var feeds = DataBase.readOnly().read_feeds_without_cat();
+ foreach(Feed feed in feeds)
+ {
+ FeedReaderBackend.get_default().markFeedAsRead(feed.getFeedID(), false);
+ Logger.debug("FeedList: mark all articles as read feed: %s".printf(feed.getTitle()));
+ }
+ }
+ else
+ {
+ FeedReaderBackend.get_default().markFeedAsRead(id, true);
+ }
}
}
@@ -961,6 +944,22 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
m_branding.setOnline();
}
+ public void copySelectedFeedURL(string feed_id){
+ /*
+ Copy selected feed url to clipboard
+ */
+ if (feed_id != ""){
+ var feed = DataBase.readOnly().read_feed(feed_id);
+ if (feed != null){
+ string feed_url = feed.getXmlUrl();
+ Gdk.Display display = MainWindow.get_default().get_display ();
+ Gtk.Clipboard clipboard = Gtk.Clipboard.get_for_display (display, Gdk.SELECTION_CLIPBOARD);
+
+ clipboard.set_text(feed_url, feed_url.length);
+ }
+ }
+ }
+
public void moveUP()
{
move(false);
@@ -998,7 +997,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
foreach(Gtk.Widget row in FeedChildList)
{
var tmpRow = row as TagRow;
- if(tmpRow != null && tmpRow.getID() == id)
+ if(tmpRow != null && tmpRow.getTag().getTagID() == id)
{
tmpRow.reveal(reveal, time);
return;
@@ -1010,7 +1009,8 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
public void addEmptyTagRow()
{
- m_emptyTagRow = new TagRow (_("New Tag"), TagID.NEW, 0);
+ var newTag = new Tag(TagID.NEW, _("New Tag"), 0);
+ m_emptyTagRow = new TagRow(newTag);
m_emptyTagRow.moveUP.connect(moveUP);
m_emptyTagRow.removeRow.connect(() => {
removeRow(m_emptyTagRow);
@@ -1055,7 +1055,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
{
tagRow.reveal(false, duration);
GLib.Timeout.add(duration + 20, () => {
- m_list.remove(tagRow);
+ m_list.remove(tagRow);
return false;
});
}
@@ -1063,7 +1063,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
{
catRow.reveal(false, duration);
GLib.Timeout.add(duration + 20, () => {
- m_list.remove(catRow);
+ m_list.remove(catRow);
return false;
});
}
@@ -1071,7 +1071,7 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
{
feedRow.reveal(false, duration);
GLib.Timeout.add(duration + 20, () => {
- m_list.remove(feedRow);
+ m_list.remove(feedRow);
return false;
});
}
@@ -1117,30 +1117,23 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
int level = 1;
int pos = -1;
- try
+ if(FeedReaderBackend.get_default().supportTags())
{
- if(DBusConnection.get_default().supportTags())
+ var FeedChildList = m_list.get_children();
+ foreach(Gtk.Widget row in FeedChildList)
{
- var FeedChildList = m_list.get_children();
- foreach(Gtk.Widget row in FeedChildList)
+ pos++;
+ var tmpCat = row as CategoryRow;
+ if(tmpCat != null && tmpCat.getID() == CategoryID.TAGS.to_string())
{
- pos++;
- var tmpCat = row as CategoryRow;
- if(tmpCat != null && tmpCat.getID() == CategoryID.TAGS.to_string())
- {
- level = 2;
- break;
- }
+ level = 2;
+ break;
}
}
- else
- {
- level = 1;
- }
}
- catch(GLib.Error e)
+ else
{
- Logger.error("FeedList.showNewCategory: %s".printf(e.message));
+ level = 1;
}
var newRow = new CategoryRow(_("New Category"), CategoryID.NEW.to_string(), 99, 0, CategoryID.MASTER.to_string(), level, false);
@@ -1193,5 +1186,4 @@ public class FeedReader.feedList : Gtk.ScrolledWindow {
return false;
}
-
}
diff --git a/src/Widgets/FeedListFooter.vala b/src/Widgets/FeedListFooter.vala
index 6287b0e2..a4f6ca95 100644
--- a/src/Widgets/FeedListFooter.vala
+++ b/src/Widgets/FeedListFooter.vala
@@ -48,17 +48,10 @@ public class FeedReader.FeedListFooter : Gtk.Box {
this.pack_start(sep2, false, false);
this.pack_start(m_box);
- try
+ if(!FeedReaderBackend.get_default().supportFeedManipulation())
{
- if(!DBusConnection.get_default().supportFeedManipulation())
- {
- m_addButton.set_sensitive(false);
- m_removeButton.set_sensitive(false);
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedListFooter.constructor: %s".printf(e.message));
+ m_addButton.set_sensitive(false);
+ m_removeButton.set_sensitive(false);
}
}
@@ -77,15 +70,8 @@ public class FeedReader.FeedListFooter : Gtk.Box {
public void setRemoveButtonSensitive(bool sensitive)
{
- try
- {
- if(FeedReaderApp.get_default().isOnline() && DBusConnection.get_default().supportFeedManipulation())
- m_removeButton.set_sensitive(sensitive);
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedListFooter.setRemoveButtonSensitive: %s".printf(e.message));
- }
+ if(FeedReaderApp.get_default().isOnline() && FeedReaderBackend.get_default().supportFeedManipulation())
+ m_removeButton.set_sensitive(sensitive);
}
public void setSelectedRow(FeedListType type, string id)
@@ -93,21 +79,24 @@ public class FeedReader.FeedListFooter : Gtk.Box {
m_removeButton.setSelectedRow(type, id);
}
- public void setActive(bool active)
+ public void setAddButtonSensitive(bool active)
{
- try
+ if(FeedReaderBackend.get_default().supportFeedManipulation())
{
- if(DBusConnection.get_default().supportFeedManipulation())
- {
- m_addButton.set_sensitive(active);
- m_removeButton.set_sensitive(active);
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedListFooter.setActive: %s".printf(e.message));
+ m_addButton.set_sensitive(active);
+ m_removeButton.set_sensitive(active);
}
}
+
+ public void showError(string errmsg)
+ {
+ var label = new Gtk.Label(errmsg);
+ label.margin = 20;
+
+ var pop = new Gtk.Popover(m_addStack);
+ pop.add(label);
+ pop.show_all();
+ }
}
diff --git a/src/Widgets/FeedRow.vala b/src/Widgets/FeedRow.vala
index 559d1c8d..420ced14 100644
--- a/src/Widgets/FeedRow.vala
+++ b/src/Widgets/FeedRow.vala
@@ -15,44 +15,38 @@
public class FeedReader.FeedRow : Gtk.ListBoxRow {
+ private Feed m_feed;
+ private string m_parentCatID;
private Gtk.Box m_box;
private Gtk.Label m_label;
private bool m_subscribed;
- private string m_catID;
- private int m_level;
private Gtk.Revealer m_revealer;
private Gtk.Image m_icon;
private Gtk.Label m_unread;
- private uint m_unread_count;
private Gtk.EventBox m_eventBox;
private Gtk.EventBox m_unreadBox;
private bool m_unreadHovered;
private Gtk.Stack m_unreadStack;
private uint m_timeout_source_id;
- private string m_name { get; private set; }
- private string m_feedID { get; private set; }
public signal void setAsRead(FeedListType type, string id);
+ public signal void copyFeedURL(string id);
public signal void moveUP();
public signal void deselectRow();
- public FeedRow(string? text, uint unread_count, bool has_icon, string feedID, string catID, int level)
+ public FeedRow(Feed feed, string parentCat, int level)
{
- m_level = level;
- m_catID = catID;
m_subscribed = true;
- m_name = text;
- m_feedID = feedID;
+ m_parentCatID = parentCat;
+ m_feed = feed;
- if(text != null)
+ if(m_feed.getFeedID() != FeedID.SEPARATOR.to_string())
{
var rowhight = 30;
m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
- m_icon = getFeedIcon();
-
+ m_icon = createFavIcon();
m_icon.margin_start = level * 24;
- m_unread_count = unread_count;
- m_label = new Gtk.Label(m_name);
+ m_label = new Gtk.Label(m_feed.getTitle());
m_label.set_size_request (0, rowhight);
m_label.set_ellipsize (Pango.EllipsizeMode.END);
m_label.set_alignment(0, 0.5f);
@@ -75,12 +69,10 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
m_unreadBox.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
m_unreadBox.set_events(Gdk.EventMask.LEAVE_NOTIFY_MASK);
m_unreadBox.add(m_unreadStack);
- m_unreadBox.button_press_event.connect(onUnreadClick);
- m_unreadBox.enter_notify_event.connect(onUnreadEnter);
- m_unreadBox.leave_notify_event.connect(onUnreadLeave);
+ activateUnreadEventbox(true);
- if(!UtilsUI.onlyShowFeeds() && feedID != FeedID.ALL.to_string())
+ if(!Utils.onlyShowFeeds() && m_feed.getFeedID() != FeedID.ALL.to_string())
this.get_style_context().add_class("fr-sidebar-feed");
else
this.get_style_context().add_class("fr-sidebar-row");
@@ -90,7 +82,7 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
m_box.pack_end (m_unreadBox, false, false, 8);
m_eventBox = new Gtk.EventBox();
- if(m_feedID != FeedID.ALL.to_string())
+ if(m_feed.getFeedID() != FeedID.ALL.to_string())
{
m_eventBox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK);
m_eventBox.button_press_event.connect(onClick);
@@ -105,37 +97,39 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
this.no_show_all = true;;
m_revealer.show_all();
- set_unread_count(m_unread_count);
+ set_unread_count(m_feed.getUnread());
- try
+ if(m_feed.getFeedID() != FeedID.ALL.to_string()
+ && !Settings.general().get_boolean("only-feeds")
+ && Utils.canManipulateContent()
+ && FeedReaderBackend.get_default().supportCategories())
{
- if(m_feedID != FeedID.ALL.to_string()
- && !Settings.general().get_boolean("only-feeds")
- && UtilsUI.canManipulateContent()
- && DBusConnection.get_default().supportCategories())
- {
- const Gtk.TargetEntry[] provided_targets = {
- { "text/plain", 0, DragTarget.FEED }
- };
-
- Gtk.drag_source_set (
- this,
- Gdk.ModifierType.BUTTON1_MASK,
- provided_targets,
- Gdk.DragAction.MOVE
- );
-
- this.drag_begin.connect(onDragBegin);
- this.drag_data_get.connect(onDragDataGet);
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedRow.constructor: %s".printf(e.message));
+ const Gtk.TargetEntry[] provided_targets = {
+ { "text/plain", 0, DragTarget.FEED }
+ };
+
+ Gtk.drag_source_set (
+ this,
+ Gdk.ModifierType.BUTTON1_MASK,
+ provided_targets,
+ Gdk.DragAction.MOVE
+ );
+
+ this.drag_begin.connect(onDragBegin);
+ this.drag_data_get.connect(onDragDataGet);
}
}
}
+ ~FeedRow()
+ {
+ activateUnreadEventbox(false);
+ if(m_eventBox != null)
+ m_eventBox.button_press_event.disconnect(onClick);
+ this.drag_begin.disconnect(onDragBegin);
+ this.drag_data_get.disconnect(onDragDataGet);
+ }
+
private void onDragBegin(Gtk.Widget widget, Gdk.DragContext context)
{
Logger.debug("FeedRow: onDragBegin");
@@ -149,28 +143,43 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
if(target_type == DragTarget.FEED)
{
- selection_data.set_text(m_feedID + "," + m_catID, -1);
+ selection_data.set_text(m_feed.getFeedID() + "," + m_parentCatID, -1);
}
}
- private Gtk.Image getFeedIcon()
+ public Gtk.Image createFavIcon()
{
- var icon = FavIconCache.get_default().getIcon(m_feedID);
- if(icon != null)
- return new Gtk.Image.from_pixbuf(icon);
+ var icon = new Gtk.Image.from_icon_name("feed-rss-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
+ icon.get_style_context().add_class("fr-sidebar-symbolic");
- var defaultIcon = new Gtk.Image.from_icon_name("feed-rss-symbolic", Gtk.IconSize.LARGE_TOOLBAR);
- defaultIcon.get_style_context().add_class("fr-sidebar-symbolic");
- return defaultIcon;
+ var favicon = FavIcon.for_feed(m_feed);
+ favicon.get_surface.begin((obj, res) => {
+ var surface = favicon.get_surface.end(res);
+ if(surface != null)
+ {
+ icon.surface = surface;
+ m_icon.get_style_context().remove_class("fr-sidebar-symbolic");
+ }
+ });
+ ulong handler_id = favicon.surface_changed.connect((feed, surface) => {
+ icon.surface = surface;
+ icon.get_style_context().remove_class("fr-sidebar-symbolic");
+ });
+ icon.destroy.connect(() => {
+ favicon.disconnect(handler_id);
+ });
+
+ return icon;
}
private Gtk.Window getFeedIconWindow()
{
+ var icon = createFavIcon();
var window = new Gtk.Window(Gtk.WindowType.POPUP);
var visual = window.get_screen().get_rgba_visual();
window.set_visual(visual);
window.get_style_context().add_class("transparentBG");
- window.add(getFeedIcon());
+ window.add(icon);
window.show_all();
return window;
}
@@ -181,7 +190,7 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
if(event.button != 3)
return false;
- if(!UtilsUI.canManipulateContent())
+ if(!Utils.canManipulateContent())
return false;
switch(event.type)
@@ -193,37 +202,19 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
}
var remove_action = new GLib.SimpleAction("deleteFeed", null);
- remove_action.activate.connect(() => {
- if(this.is_selected())
- moveUP();
-
- uint time = 300;
- this.reveal(false, time);
-
- var notification = MainWindow.get_default().showNotification(_("Feed \"%s\" removed").printf(m_name));
- ulong eventID = notification.dismissed.connect(() => {
- try
- {
- DBusConnection.get_default().removeFeed(m_feedID);
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedRow.onClick: %s".printf(e.message));
- }
- });
- notification.action.connect(() => {
- notification.disconnect(eventID);
- this.reveal(true, time);
- notification.dismiss();
- });
- });
+ remove_action.activate.connect(RemoveThisFeed);
var markAsRead_action = new GLib.SimpleAction("markFeedAsRead", null);
markAsRead_action.activate.connect(() => {
- setAsRead(FeedListType.FEED, m_feedID);
+ setAsRead(FeedListType.FEED, m_feed.getFeedID());
});
- if(m_unread_count != 0)
+ var copyFeedURL_action = new GLib.SimpleAction("copyFeedURL", null);
+ copyFeedURL_action.activate.connect(() => {
+ copyFeedURL(m_feed.getFeedID());
+ });
+
+ if(m_feed.getUnread() != 0)
markAsRead_action.set_enabled(true);
else
markAsRead_action.set_enabled(false);
@@ -231,20 +222,22 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
var rename_action = new GLib.SimpleAction("renameFeed", null);
rename_action.activate.connect(showRenamePopover);
- var app = FeedReaderApp.get_default();
- app.add_action(markAsRead_action);
- app.add_action(rename_action);
- app.add_action(remove_action);
+ FeedReaderApp.get_default().add_action(markAsRead_action);
+ FeedReaderApp.get_default().add_action(copyFeedURL_action);
+ FeedReaderApp.get_default().add_action(rename_action);
+ FeedReaderApp.get_default().add_action(remove_action);
+
- var feed = dbUI.get_default().read_feed(m_feedID);
- var catCount = feed.getCatIDs().length;
- var cat = dbUI.get_default().read_category(m_catID);
var menu = new GLib.Menu();
menu.append(_("Mark as read"), "markFeedAsRead");
+ menu.append(_("Copy URL"), "copyFeedURL");
menu.append(_("Rename"), "renameFeed");
- if(catCount > 1)
+ if(m_feed.getCatIDs().size > 1)
+ {
+ var cat = DataBase.readOnly().read_category(m_parentCatID);
menu.append(_("Remove only from %s").printf(cat.getTitle()), "deleteFeed");
+ }
menu.append(_("Remove"), "deleteFeed");
var pop = new Gtk.Popover(this);
@@ -253,10 +246,9 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
pop.closed.connect(() => {
this.unset_state_flags(Gtk.StateFlags.PRELIGHT);
});
+
pop.show();
this.set_state_flags(Gtk.StateFlags.PRELIGHT, false);
-
-
return true;
}
@@ -269,17 +261,10 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
});
var renameEntry = new Gtk.Entry();
- renameEntry.set_text(m_name);
+ renameEntry.set_text(m_feed.getTitle());
renameEntry.activate.connect(() => {
popRename.hide();
- try
- {
- DBusConnection.get_default().renameFeed(m_feedID, renameEntry.get_text());
- }
- catch(GLib.Error e)
- {
- Logger.error("FeedRow.showRenamePopover: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().renameFeed(m_feed.getFeedID(), renameEntry.get_text());
});
var renameButton = new Gtk.Button.with_label(_("rename"));
@@ -300,12 +285,12 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
public void set_unread_count(uint unread_count)
{
- m_unread_count = unread_count;
+ m_feed.setUnread(unread_count);
- if(m_unread_count > 0 && !m_unreadHovered)
+ if(m_feed.getUnread() > 0 && !m_unreadHovered)
{
m_unreadStack.set_visible_child_name("unreadCount");
- m_unread.set_text(m_unread_count.to_string());
+ m_unread.set_text(m_feed.getUnread().to_string());
}
else if(!m_unreadHovered)
{
@@ -319,9 +304,9 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
private bool onUnreadClick(Gdk.EventButton event)
{
- if(m_unreadHovered && m_unread_count > 0)
+ if(m_unreadHovered && m_feed.getUnread() > 0)
{
- setAsRead(FeedListType.FEED, m_feedID);
+ setAsRead(FeedListType.FEED, m_feed.getFeedID());
}
return true;
}
@@ -329,7 +314,7 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
private bool onUnreadEnter(Gdk.EventCrossing event)
{
m_unreadHovered = true;
- if(m_unread_count > 0)
+ if(m_feed.getUnread() > 0)
{
m_unreadStack.set_visible_child_name("mark");
}
@@ -339,7 +324,7 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
private bool onUnreadLeave(Gdk.EventCrossing event)
{
m_unreadHovered = false;
- if(m_unread_count > 0)
+ if(m_feed.getUnread() > 0)
{
m_unreadStack.set_visible_child_name("unreadCount");
}
@@ -352,13 +337,13 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
public void upUnread()
{
- set_unread_count(m_unread_count+1);
+ set_unread_count(m_feed.getUnread() + 1);
}
public void downUnread()
{
- if(m_unread_count > 0)
- set_unread_count(m_unread_count-1);
+ if(m_feed.getUnread() > 0)
+ set_unread_count(m_feed.getUnread() - 1);
}
public void update(string text, uint unread_count)
@@ -374,17 +359,17 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
public string getCatID()
{
- return m_catID;
+ return m_parentCatID;
}
public string getID()
{
- return m_feedID;
+ return m_feed.getFeedID();
}
public string getName()
{
- return m_name;
+ return m_feed.getTitle();
}
public bool isSubscribed()
@@ -394,7 +379,7 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
public uint getUnreadCount()
{
- return m_unread_count;
+ return m_feed.getUnread();
}
public bool isRevealed()
@@ -415,38 +400,26 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
this.show();
}
- if(Settings.state().get_boolean("no-animations"))
+ m_revealer.set_transition_duration(duration);
+ m_revealer.set_reveal_child(reveal);
+ if(!reveal)
{
- if(!reveal)
- {
+ if(this.is_selected())
+ deselectRow();
+
+ m_timeout_source_id = GLib.Timeout.add(duration, () => {
this.hide();
- }
- m_revealer.set_transition_type(Gtk.RevealerTransitionType.NONE);
- m_revealer.set_transition_duration(0);
- m_revealer.set_reveal_child(reveal);
- m_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
- m_revealer.set_transition_duration(500);
- }
- else
- {
- m_revealer.set_transition_duration(duration);
- m_revealer.set_reveal_child(reveal);
- if(!reveal)
- {
- if(this.is_selected())
- deselectRow();
-
- m_timeout_source_id = GLib.Timeout.add(duration, () => {
- this.hide();
- m_timeout_source_id = 0;
- return false;
- });
- }
+ m_timeout_source_id = 0;
+ return false;
+ });
}
}
public void activateUnreadEventbox(bool activate)
{
+ if(m_unreadBox == null)
+ return;
+
if(activate)
{
m_unreadBox.button_press_event.connect(onUnreadClick);
@@ -461,4 +434,22 @@ public class FeedReader.FeedRow : Gtk.ListBoxRow {
}
}
+ private void RemoveThisFeed(Variant? parameter)
+ {
+ if(this.is_selected())
+ moveUP();
+
+ uint time = 300;
+ this.reveal(false, time);
+
+ var notification = MainWindow.get_default().showNotification(_("Feed removed: %s").printf(m_feed.getTitle()));
+ ulong eventID = notification.dismissed.connect(() => {
+ FeedReaderBackend.get_default().removeFeed(m_feed.getFeedID());
+ });
+ notification.action.connect(() => {
+ notification.disconnect(eventID);
+ this.reveal(true, time);
+ notification.dismiss();
+ });
+ }
}
diff --git a/src/Widgets/FullscreenHeader.vala b/src/Widgets/FullscreenHeader.vala
index ae797c4f..55078083 100644
--- a/src/Widgets/FullscreenHeader.vala
+++ b/src/Widgets/FullscreenHeader.vala
@@ -68,7 +68,7 @@ public class FeedReader.FullscreenHeader : Gtk.EventBox {
return false;
if(event.detail == Gdk.NotifyType.NONLINEAR_VIRTUAL)
- return false;
+ return false;
m_hover = false;
@@ -95,14 +95,14 @@ public class FeedReader.FullscreenHeader : Gtk.EventBox {
m_header.set_title(title);
}
- public void setMarked(bool marked)
+ public void setMarked(ArticleStatus marked)
{
m_header.setMarked(marked);
}
- public void setUnread(bool unread)
+ public void setRead(ArticleStatus read)
{
- m_header.setRead(unread);
+ m_header.setRead(read);
}
private void removeTimeout()
diff --git a/src/Widgets/HoverButton.vala b/src/Widgets/HoverButton.vala
index 935b7573..f2f74bfe 100644
--- a/src/Widgets/HoverButton.vala
+++ b/src/Widgets/HoverButton.vala
@@ -15,35 +15,35 @@
public class FeedReader.HoverButton : Gtk.EventBox {
- private Gtk.Button m_button;
- private Gtk.Stack m_stack;
- private Gtk.Image m_inactive;
- private Gtk.Image m_active;
- private bool m_isActive;
- public signal void clicked(bool active);
+ private Gtk.Button m_button;
+ private Gtk.Stack m_stack;
+ private Gtk.Image m_inactive;
+ private Gtk.Image m_active;
+ private bool m_isActive;
+ public signal void clicked(bool active);
public HoverButton(Gtk.Image inactive, Gtk.Image active, bool isActive)
- {
- m_inactive = inactive;
- m_active = active;
- m_isActive = isActive;
- m_stack = new Gtk.Stack();
- m_button = new Gtk.Button();
+ {
+ m_inactive = inactive;
+ m_active = active;
+ m_isActive = isActive;
+ m_stack = new Gtk.Stack();
+ m_button = new Gtk.Button();
m_button.set_relief(Gtk.ReliefStyle.NONE);
m_button.set_focus_on_click(false);
- m_button.clicked.connect(() => {
- toggle();
- clicked(m_isActive);
- });
+ m_button.clicked.connect(() => {
+ toggle();
+ clicked(m_isActive);
+ });
- m_stack.add_named(inactive, "inactive");
- m_stack.add_named(active, "active");
- m_button.add(m_stack);
+ m_stack.add_named(inactive, "inactive");
+ m_stack.add_named(active, "active");
+ m_button.add(m_stack);
- if(isActive)
- m_stack.set_visible_child_name("active");
- else
- m_stack.set_visible_child_name("inactive");
+ if(isActive)
+ m_stack.set_visible_child_name("active");
+ else
+ m_stack.set_visible_child_name("inactive");
@@ -52,71 +52,71 @@ public class FeedReader.HoverButton : Gtk.EventBox {
this.set_size_request(16, 16);
this.add(m_button);
- this.enter_notify_event.connect(onEnter);
+ this.enter_notify_event.connect(onEnter);
this.leave_notify_event.connect(onLeave);
- }
-
- private void setActiveIcon()
- {
- m_stack.set_visible_child_name("active");
- m_active.show();
- }
-
- private void setInactiveIcon()
- {
- m_stack.set_visible_child_name("inactive");
- m_inactive.show();
- }
-
- public void toggle()
- {
- setActive(!m_isActive);
- }
-
- public void setActive(bool active)
- {
- m_isActive = active;
-
- if(m_isActive)
- {
- setActiveIcon();
- }
- else
- {
- setInactiveIcon();
- }
- }
-
-
- private bool onEnter(Gdk.EventCrossing event)
- {
- if(m_isActive)
- {
- setInactiveIcon();
- }
- else
- {
- setActiveIcon();
- }
- return true;
- }
-
- private bool onLeave(Gdk.EventCrossing event)
- {
- if(event.detail == Gdk.NotifyType.INFERIOR)
- return false;
-
- if(m_isActive)
- {
- setActiveIcon();
- }
- else
- {
- setInactiveIcon();
- }
-
- return true;
- }
+ }
+
+ private void setActiveIcon()
+ {
+ m_stack.set_visible_child_name("active");
+ m_active.show();
+ }
+
+ private void setInactiveIcon()
+ {
+ m_stack.set_visible_child_name("inactive");
+ m_inactive.show();
+ }
+
+ public void toggle()
+ {
+ setActive(!m_isActive);
+ }
+
+ public void setActive(bool active)
+ {
+ m_isActive = active;
+
+ if(m_isActive)
+ {
+ setActiveIcon();
+ }
+ else
+ {
+ setInactiveIcon();
+ }
+ }
+
+
+ private bool onEnter(Gdk.EventCrossing event)
+ {
+ if(m_isActive)
+ {
+ setInactiveIcon();
+ }
+ else
+ {
+ setActiveIcon();
+ }
+ return true;
+ }
+
+ private bool onLeave(Gdk.EventCrossing event)
+ {
+ if(event.detail == Gdk.NotifyType.INFERIOR)
+ return false;
+
+ if(m_isActive)
+ {
+ setActiveIcon();
+ }
+ else
+ {
+ setInactiveIcon();
+ }
+
+ return true;
+ }
}
diff --git a/src/Widgets/ImagePopup.vala b/src/Widgets/ImagePopup.vala
index 24ce73bc..d6f0c59d 100644
--- a/src/Widgets/ImagePopup.vala
+++ b/src/Widgets/ImagePopup.vala
@@ -82,13 +82,9 @@ public class FeedReader.imagePopup : Gtk.Window {
m_scaleRevealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_RIGHT);
m_scaleRevealer.add(m_scale);
- // Code for Gtk+ >= 3.22
- //var geo = Gdk.Display.get_default().get_monitor_at_window(this.get_root_window()).get_geometry();
- //double win_width = (int)(geo.width*0.8);
- //double win_height = (int)(geo.height*0.8);
-
- double win_width = (int)(Gdk.Screen.width()*0.8);
- double win_height = (int)(Gdk.Screen.height()*0.8);
+ var geo = Gdk.Display.get_default().get_monitor_at_window(this.get_root_window()).get_geometry();
+ double win_width = (int)(geo.width*0.8);
+ double win_height = (int)(geo.height*0.8);
double min_height = 300;
double min_widht = 500;
@@ -127,7 +123,7 @@ public class FeedReader.imagePopup : Gtk.Window {
m_saveButton = new Gtk.Button.from_icon_name("document-save-symbolic", Gtk.IconSize.BUTTON);
m_saveButton.clicked.connect(() => {
- UtilsUI.saveImageDialog(m_imagePath);
+ Utils.saveImageDialog(m_imagePath);
});
m_image.notify["scale"].connect(onImageScrolled);
@@ -150,7 +146,7 @@ public class FeedReader.imagePopup : Gtk.Window {
if(!m_zoomButton.get_active())
{
GLib.Timeout.add(150, () => {
- m_image.notify["scale"].connect(onImageScrolled);
+ m_image.notify["scale"].connect(onImageScrolled);
return false;
});
}
@@ -272,9 +268,9 @@ public class FeedReader.imagePopup : Gtk.Window {
{
if(m_OngoingScrollID > 0)
{
- GLib.Source.remove(m_OngoingScrollID);
- m_OngoingScrollID = 0;
- }
+ GLib.Source.remove(m_OngoingScrollID);
+ m_OngoingScrollID = 0;
+ }
m_posX = evt.x;
m_posY = evt.y;
for(int i = 0; i < 10; ++i)
diff --git a/src/Widgets/InfoBar.vala b/src/Widgets/InfoBar.vala
index ff268990..a128e5dd 100644
--- a/src/Widgets/InfoBar.vala
+++ b/src/Widgets/InfoBar.vala
@@ -15,14 +15,14 @@
public class FeedReader.InfoBar : Gtk.Revealer {
- // THIS IS BASICALLY A WORKAROUND FOR THIS GTK+ BUG:
- // https://bugzilla.gnome.org/show_bug.cgi?id=710888
+ // THIS IS BASICALLY A WORKAROUND FOR THIS GTK+ BUG:
+ // https://bugzilla.gnome.org/show_bug.cgi?id=710888
- private Gtk.Label m_Label;
+ private Gtk.Label m_Label;
- public InfoBar(string text)
- {
- m_Label = new Gtk.Label(text);
+ public InfoBar(string text)
+ {
+ m_Label = new Gtk.Label(text);
var bar = new Gtk.InfoBar();
bar.valign = Gtk.Align.START;
@@ -34,21 +34,21 @@ public class FeedReader.InfoBar : Gtk.Revealer {
this.set_reveal_child(false);
});
- this.set_transition_duration(200);
- this.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
- this.valign = Gtk.Align.START;
- this.add(bar);
- }
-
- public void reveal()
- {
- this.show_all();
- this.set_reveal_child(true);
- }
-
- public void setText(string text)
- {
- m_Label.set_text(text);
- }
+ this.set_transition_duration(200);
+ this.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
+ this.valign = Gtk.Align.START;
+ this.add(bar);
+ }
+
+ public void reveal()
+ {
+ this.show_all();
+ this.set_reveal_child(true);
+ }
+
+ public void setText(string text)
+ {
+ m_Label.set_text(text);
+ }
}
diff --git a/src/Widgets/LoginPage.vala b/src/Widgets/LoginPage.vala
index 6efb2511..67800fe9 100644
--- a/src/Widgets/LoginPage.vala
+++ b/src/Widgets/LoginPage.vala
@@ -16,10 +16,8 @@
public class FeedReader.LoginPage : Gtk.Stack {
private Gtk.Box m_layout;
- private Peas.ExtensionSet m_extensions;
- private Peas.Engine m_engine;
+ private Gtk.ListBox m_accountList;
private WebLoginPage m_page;
- private string? m_activeExtension = null;
private Gtk.Box? m_activeWidget = null;
public signal void submit_data();
public signal void loginError(LoginResponse errorCode);
@@ -27,24 +25,10 @@ public class FeedReader.LoginPage : Gtk.Stack {
public LoginPage()
{
- m_engine = Peas.Engine.get_default();
- m_engine.add_search_path(Constants.INSTALL_PREFIX + "/" + Constants.INSTALL_LIBDIR + "/pluginsUI/", null);
- m_engine.enable_loader("python3");
-
- m_extensions = new Peas.ExtensionSet(m_engine, typeof(LoginInterface));
-
- m_extensions.extension_added.connect((info, extension) => {
- var plugin = (extension as LoginInterface);
- plugin.init();
- plugin.login.connect(() => { writeLoginData(); });
+ FeedReaderBackend.get_default().tryLogin.connect(() => {
+ writeLoginData();
});
- foreach(var plugin in m_engine.get_plugin_list())
- {
- m_engine.try_load_plugin(plugin);
- }
-
-
m_layout = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
m_layout.set_size_request(700, 410);
m_layout.set_halign(Gtk.Align.CENTER);
@@ -62,19 +46,18 @@ public class FeedReader.LoginPage : Gtk.Stack {
welcomeText2.set_lines(3);
- var accountList = new Gtk.ListBox();
- accountList.set_selection_mode(Gtk.SelectionMode.NONE);
- accountList.row_activated.connect(serviceSelected);
+ m_accountList = new Gtk.ListBox();
+ m_accountList.set_selection_mode(Gtk.SelectionMode.NONE);
+ m_accountList.row_activated.connect(serviceSelected);
- m_extensions.foreach((extSet, info, ext) => {
- accountList.add(new LoginRow(ext as LoginInterface));
- });
+ RefreshPlugins();
+ FeedServer.get_default().PluginsChanedEvent.connect(RefreshPlugins);
var scroll = new Gtk.ScrolledWindow(null, null);
scroll.set_size_request(450, 0);
scroll.set_halign(Gtk.Align.CENTER);
scroll.get_style_context().add_class(Gtk.STYLE_CLASS_FRAME);
- scroll.add(accountList);
+ scroll.add(m_accountList);
m_layout.pack_start(welcomeText, false, true, 0);
@@ -89,11 +72,39 @@ public class FeedReader.LoginPage : Gtk.Stack {
reset();
}
+ private void RefreshPlugins()
+ {
+ var children = m_accountList.get_children();
+ foreach(Gtk.Widget row in children)
+ {
+ m_accountList.remove(row);
+ row.destroy();
+ }
+
+ FeedServer.get_default().getPlugins().foreach((extSet, info, ext) => {
+ var plug = ext as FeedServerInterface;
+ if(plug != null)
+ {
+ Logger.debug("LoginPage: add plugin " + plug.getID());
+ BackendInfo pluginfo = BackendInfo()
+ {
+ ID = plug.getID(),
+ name = plug.serviceName(),
+ flags = plug.getFlags(),
+ website = plug.getWebsite(),
+ iconName = plug.iconName()
+ };
+ m_accountList.add(new LoginRow(pluginfo));
+ }
+ });
+
+ m_accountList.show_all();
+ }
+
public void reset()
{
var visible = this.get_visible_child_name();
this.set_visible_child_name("selectScreen");
- m_activeExtension = null;
if(visible == "loginWidget"
&& m_activeWidget != null)
@@ -110,99 +121,87 @@ public class FeedReader.LoginPage : Gtk.Stack {
private void serviceSelected(Gtk.ListBoxRow row)
{
var serviceRow = (row as LoginRow);
- var extension = serviceRow.getExtension();
- Logger.debug("serviceSelected: %s".printf(serviceRow.getServiceName()));
+ Logger.debug("serviceSelected: %s".printf(serviceRow.getInfo().name));
var window = MainWindow.get_default();
window.getSimpleHeader().showBackButton(true);
- m_activeExtension = extension.getID();
+ FeedServer.get_default().setActivePlugin(serviceRow.getInfo().ID);
+ FeedServerInterface? plug = FeedServer.get_default().getActivePlugin();
- if(extension.needWebLogin())
+ if(plug != null)
{
- m_page.loadPage(extension.buildLoginURL());
- m_page.getApiCode.connect(extension.extractCode);
- m_page.success.connect(() => {
- login(extension.getID());
- });
- this.set_visible_child_name("web");
-
- window.getSimpleHeader().back.connect(() => {
- this.set_visible_child_full("selectScreen", Gtk.StackTransitionType.SLIDE_RIGHT);
- window.getSimpleHeader().showBackButton(false);
+ if(plug.needWebLogin())
+ {
m_page.reset();
- m_activeExtension = null;
- });
- }
- else
- {
- m_activeWidget = extension.getWidget();
- m_activeWidget.show_all();
-
- this.add_named(m_activeWidget, "loginWidget");
- this.set_visible_child_name("loginWidget");
+ m_page.loadPage(plug.buildLoginURL());
+ m_page.getApiCode.connect(plug.extractCode);
+ m_page.success.connect(() => {
+ login(plug.getID());
+ });
+ this.set_visible_child_name("web");
- window.getSimpleHeader().back.connect(() => {
- this.set_visible_child_full("selectScreen", Gtk.StackTransitionType.SLIDE_RIGHT);
- window.getSimpleHeader().showBackButton(false);
- if(m_activeWidget != null)
- {
- this.remove(m_activeWidget);
- m_activeWidget = null;
- }
- m_activeExtension = null;
- });
+ window.getSimpleHeader().back.connect(() => {
+ this.set_visible_child_full("selectScreen", Gtk.StackTransitionType.SLIDE_RIGHT);
+ window.getSimpleHeader().showBackButton(false);
+ m_page.reset();
+ });
+ }
+ else
+ {
+ m_activeWidget = plug.getWidget();
+ m_activeWidget.show_all();
+
+ this.add_named(m_activeWidget, "loginWidget");
+ this.set_visible_child_name("loginWidget");
+
+ window.getSimpleHeader().back.connect(() => {
+ this.set_visible_child_full("selectScreen", Gtk.StackTransitionType.SLIDE_RIGHT);
+ window.getSimpleHeader().showBackButton(false);
+ if(m_activeWidget != null)
+ {
+ this.remove(m_activeWidget);
+ m_activeWidget = null;
+ }
+ });
+ }
}
}
public void showHtAccess()
{
- getActiveExtension().showHtAccess();
- }
-
- private LoginInterface? getActiveExtension()
- {
- LoginInterface? e = null;
- m_extensions.foreach((extSet, info, ext) => {
- var extension = (ext as LoginInterface);
- if(extension.getID() == m_activeExtension)
- {
- e = extension;
- }
- });
- return e;
+ FeedServer.get_default().getActivePlugin().showHtAccess();
}
public void writeLoginData()
{
Logger.debug("write login data");
- var ext = getActiveExtension();
- ext.writeData();
- login(ext.getID());
+ var ext = FeedServer.get_default().getActivePlugin();
+ if(ext != null)
+ {
+ ext.writeData();
+ login(ext.getID());
+ }
}
private void login(string id)
{
- try
+ LoginResponse status = FeedReaderBackend.get_default().login(id);
+ Logger.debug("LoginPage: status = " + status.to_string());
+ if(status == LoginResponse.SUCCESS)
{
- LoginResponse status = DBusConnection.get_default().login(id);
- Logger.debug("LoginPage: status = " + status.to_string());
- if(status == LoginResponse.SUCCESS)
+ var ext = FeedServer.get_default().getActivePlugin();
+ if(ext != null)
{
- var ext = getActiveExtension();
ext.postLoginAction.begin((ob, res) => {
ext.postLoginAction.end(res);
submit_data();
+ FeedReaderBackend.get_default().startSync(true);
});
-
- return;
}
-
- loginError(status);
- }
- catch(GLib.Error e)
- {
- Logger.error("LoginPage.login: %s".printf(e.message));
+ return;
}
+
+ loginError(status);
}
}
diff --git a/src/Widgets/LoginRow.vala b/src/Widgets/LoginRow.vala
index 12db2570..8f8b2c87 100644
--- a/src/Widgets/LoginRow.vala
+++ b/src/Widgets/LoginRow.vala
@@ -15,19 +15,17 @@
public class FeedReader.LoginRow : Gtk.ListBoxRow {
- private LoginInterface m_ext;
+ private BackendInfo m_info;
private Gtk.Stack m_infoStack;
private bool m_hovered = false;
- public LoginRow(LoginInterface ext)
+ public LoginRow(BackendInfo info)
{
- m_ext = ext;
- string iconName = (ext as LoginInterface).iconName();
- string serviceName = (ext as LoginInterface).serviceName();
+ m_info = info;
- var icon = new Gtk.Image.from_icon_name(iconName, Gtk.IconSize.MENU);
+ var icon = new Gtk.Image.from_icon_name(info.iconName, Gtk.IconSize.MENU);
icon.margin_start = 10;
- var label = new Gtk.Label(serviceName);
+ var label = new Gtk.Label(info.name);
label.set_alignment(0.0f, 0.5f);
label.get_style_context().add_class("h3");
@@ -67,14 +65,9 @@ public class FeedReader.LoginRow : Gtk.ListBoxRow {
this.add(eventbox);
}
- public string getServiceName()
+ public BackendInfo getInfo()
{
- return m_ext.serviceName();
- }
-
- public LoginInterface getExtension()
- {
- return m_ext;
+ return m_info;
}
private bool rowEnter(Gdk.EventCrossing event)
@@ -105,7 +98,7 @@ public class FeedReader.LoginRow : Gtk.ListBoxRow {
private void infoClicked()
{
- var pop = new BackendInfoPopover(m_infoStack, m_ext);
+ var pop = new BackendInfoPopover(m_infoStack, m_info);
pop.show_all();
pop.closed.connect_after(() => {
GLib.Timeout.add(50, () => {
diff --git a/src/Widgets/MainWindow.vala b/src/Widgets/MainWindow.vala
index 82165b1f..95b94a18 100644
--- a/src/Widgets/MainWindow.vala
+++ b/src/Widgets/MainWindow.vala
@@ -41,7 +41,7 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
private MainWindow()
{
- Object(application: FeedReaderApp.get_default(), title: _("FeedReader"));
+ Object(application: FeedReaderApp.get_default(), title: _("FeedReader"), show_menubar: false);
this.window_position = WindowPosition.CENTER;
m_stack = new Gtk.Stack();
@@ -146,39 +146,34 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
this.set_titlebar(m_simpleHeader);
this.set_title("FeedReader");
this.set_default_size(Settings.state().get_int("window-width"), Settings.state().get_int("window-height"));
- this.delete_event.connect(() => {
- getInterfaceState().write();
- return false;
- });
this.show_all();
Logger.debug("MainWindow: determining state");
- try
+ if(FeedReaderBackend.get_default().isOnline() && !Settings.state().get_boolean("spring-cleaning"))
{
- if(DBusConnection.get_default().isOnline() && !Settings.state().get_boolean("spring-cleaning"))
+ loadContent();
+ }
+ else
+ {
+ if(Settings.state().get_boolean("spring-cleaning"))
+ {
+ showSpringClean();
+ }
+ else if(!DataBase.readOnly().isEmpty())
{
- loadContent();
+ showOfflineContent();
}
else
{
- if(Settings.state().get_boolean("spring-cleaning"))
- {
- showSpringClean();
- }
- else if(!dbUI.get_default().isEmpty())
- {
- showOfflineContent();
- }
- else
- {
- showLogin();
- }
+ showLogin();
}
}
- catch(GLib.Error e)
- {
- Logger.error("MainWindow.constructor: %s".printf(e.message));
- }
+ }
+
+ public override bool delete_event(Gdk.EventAny event)
+ {
+ this.hide();
+ return true;
}
private bool onStateEvent(Gdk.EventWindowState event)
@@ -188,8 +183,7 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
if(event.changed_mask == Gdk.WindowState.FULLSCREEN)
{
Logger.debug("MainWindow: fullscreen event");
- if(ColumnView.get_default().getSelectedArticle() == ""
- || ColumnView.get_default().getSelectedArticle() == "empty")
+ if(ColumnView.get_default().getSelectedArticle() == null)
return true;
if(ColumnView.get_default().isFullscreenVideo())
@@ -233,7 +227,6 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
ColumnView.get_default().newFeedList();
m_stack.set_visible_child_full("content", transition);
ColumnView.get_default().getHeader().setButtonsSensitive(true);
- //ColumnView.get_default().updateAccountInfo();
if(!ColumnView.get_default().isFullscreen())
{
@@ -280,15 +273,14 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
var state = new InterfaceState();
state.setWindowSize(windowHeight, windowWidth);
- state.setArticleListNewRowCount(0);
state.setWindowMaximized(this.is_maximized);
ColumnView.get_default().saveState(ref state);
return state;
}
- public void writeInterfaceState()
+ public void writeInterfaceState(bool shutdown = false)
{
- getInterfaceState().write();
+ getInterfaceState().write(shutdown);
}
public void reloadCSS()
@@ -328,7 +320,7 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
Gtk.CssProvider provider = new Gtk.CssProvider();
provider.load_from_resource(path);
weak Gdk.Display display = Gdk.Display.get_default();
- weak Gdk.Screen screen = display.get_default_screen();
+ weak Gdk.Screen screen = display.get_default_screen();
Gtk.StyleContext.add_provider_for_screen(screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_USER);
return provider;
}
@@ -336,7 +328,7 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
private void removeProvider(Gtk.CssProvider provider)
{
weak Gdk.Display display = Gdk.Display.get_default();
- weak Gdk.Screen screen = display.get_default_screen();
+ weak Gdk.Screen screen = display.get_default_screen();
Gtk.StyleContext.remove_provider_for_screen(screen, provider);
}
@@ -377,7 +369,12 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
loginBox.pack_start(m_error_bar, false, false, 0);
loginBox.pack_start(m_login, true, true, 0);
- m_login.submit_data.connect(login);
+ m_login.submit_data.connect(() => {
+ Settings.state().set_strv("expanded-categories", Utils.getDefaultExpandedCategories());
+ Settings.state().set_string("feedlist-selected-row", "feed -4");
+ showContent(Gtk.StackTransitionType.SLIDE_RIGHT);
+ ColumnView.get_default().setOnline();
+ });
m_login.loginError.connect((errorCode) => {
showErrorBar(errorCode);
});
@@ -385,24 +382,6 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
m_error_bar.set_visible(false);
}
- private void login()
- {
- Settings.state().set_strv("expanded-categories", Utils.getDefaultExpandedCategories());
- Settings.state().set_string("feedlist-selected-row", "feed -4");
- try
- {
- if(dbUI.get_default().isEmpty())
- DBusConnection.get_default().startInitSync();
- else
- DBusConnection.get_default().startSync();
- }
- catch(GLib.Error e)
- {
- Logger.error("MainWindow.login: %s".printf(e.message));
- }
- showContent(Gtk.StackTransitionType.SLIDE_RIGHT);
- }
-
private void setupResetPage()
{
var reset = new ResetPage();
@@ -490,17 +469,6 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
private void loadContent()
{
Logger.debug("MainWindow: load content");
- dbUI.get_default().updateBadge.connect(() => {
- try
- {
- DBusConnection.get_default().updateBadge();
- }
- catch(Error e)
- {
- Logger.error("MainWindow.loadContent: %s".printf(e.message));
- }
-
- });
m_stack.set_transition_duration(0);
showContent(Gtk.StackTransitionType.NONE);
m_stack.set_transition_duration(m_stackTransitionTime);
@@ -508,42 +476,35 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
private void markSelectedRead()
{
- try
- {
- ColumnView.get_default().markAllArticlesAsRead();
- string[] selectedRow = ColumnView.get_default().getSelectedFeedListRow().split(" ", 2);
+ ColumnView.get_default().markAllArticlesAsRead();
+ string[] selectedRow = ColumnView.get_default().getSelectedFeedListRow().split(" ", 2);
- if(selectedRow[0] == "feed")
+ if(selectedRow[0] == "feed")
+ {
+ if(selectedRow[1] == FeedID.ALL.to_string())
{
- if(selectedRow[1] == FeedID.ALL.to_string())
+ var categories = DataBase.readOnly().read_categories();
+ foreach(Category cat in categories)
{
- var categories = dbUI.get_default().read_categories();
- foreach(category cat in categories)
- {
- DBusConnection.get_default().markFeedAsRead(cat.getCatID(), true);
- Logger.debug("MainWindow: mark all articles as read cat: %s".printf(cat.getTitle()));
- }
-
- var feeds = dbUI.get_default().read_feeds_without_cat();
- foreach(feed Feed in feeds)
- {
- DBusConnection.get_default().markFeedAsRead(Feed.getFeedID(), false);
- Logger.debug("MainWindow: mark all articles as read feed: %s".printf(Feed.getTitle()));
- }
+ FeedReaderBackend.get_default().markFeedAsRead(cat.getCatID(), true);
+ Logger.debug("MainWindow: mark all articles as read cat: %s".printf(cat.getTitle()));
}
- else
+
+ var feeds = DataBase.readOnly().read_feeds_without_cat();
+ foreach(Feed feed in feeds)
{
- DBusConnection.get_default().markFeedAsRead(selectedRow[1], false);
+ FeedReaderBackend.get_default().markFeedAsRead(feed.getFeedID(), false);
+ Logger.debug("MainWindow: mark all articles as read feed: %s".printf(feed.getTitle()));
}
}
- else if(selectedRow[0] == "cat")
+ else
{
- DBusConnection.get_default().markFeedAsRead(selectedRow[1], true);
+ FeedReaderBackend.get_default().markFeedAsRead(selectedRow[1], false);
}
}
- catch(GLib.Error e)
+ else if(selectedRow[0] == "cat")
{
- Logger.error("MainWindow.markSelectedRead: %s".printf(e.message));
+ FeedReaderBackend.get_default().markFeedAsRead(selectedRow[1], true);
}
}
@@ -554,13 +515,13 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
Gdk.ModifierType? mod;
string setting = Settings.keybindings().get_string(gsettingKey);
Gtk.accelerator_parse(setting, out key, out mod);
- Logger.debug(gsettingKey);
if(key != null && Gdk.keyval_to_lower(event.keyval) == key)
{
if(mod == null || mod == 0)
{
- if(event.state == 16)
+ if(event.state == 16
+ || event.state == 0)
return true;
}
else if(mod in event.state)
@@ -692,7 +653,7 @@ public class FeedReader.MainWindow : Gtk.ApplicationWindow
if(checkShortcut(event, "global-quit"))
{
Logger.debug("shortcut: quit");
- this.close();
+ FeedReaderApp.get_default().activate_action("quit", null);
return true;
}
diff --git a/src/Widgets/MediaButton.vala b/src/Widgets/MediaButton.vala
new file mode 100644
index 00000000..a7917c29
--- /dev/null
+++ b/src/Widgets/MediaButton.vala
@@ -0,0 +1,131 @@
+// This file is part of FeedReader.
+//
+// FeedReader is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// FeedReader is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
+
+public class FeedReader.AttachedMediaButton : Gtk.Button {
+
+ private Gtk.ListBox m_list;
+ private Gtk.Image m_filesIcon;
+ private Gtk.Spinner m_spinner;
+ private Gtk.Stack m_stack;
+ private Gee.List<Enclosure> m_enclosures;
+ private Gtk.Popover m_pop;
+ private ulong m_signalID = 0;
+ public signal void play(string url);
+ public signal void popClosed();
+ public signal void popOpened();
+
+ public AttachedMediaButton()
+ {
+ m_filesIcon = new Gtk.Image.from_icon_name("mail-attachment-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
+ m_spinner = new Gtk.Spinner();
+ m_spinner.set_size_request(16,16);
+
+ m_stack = new Gtk.Stack();
+ m_stack.set_transition_duration(100);
+ m_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE);
+ m_stack.add_named(m_spinner, "spinner");
+ m_stack.add_named(m_filesIcon, "files");
+ this.add(m_stack);
+ this.set_relief(Gtk.ReliefStyle.NONE);
+ this.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
+ this.set_focus_on_click(false);
+
+ m_list = new Gtk.ListBox();
+ m_list.margin = 10;
+ m_list.set_selection_mode(Gtk.SelectionMode.NONE);
+ m_list.row_activated.connect((row) => {
+ m_spinner.start();
+ m_pop.hide();
+ mediaRow? mRow = row as mediaRow;
+ if(mRow != null)
+ playMedia(mRow.getURL());
+ else
+ Logger.error("MediaPopover: invalid row clicked");
+ });
+
+ m_pop = new Gtk.Popover(this);
+ m_pop.add(m_list);
+ m_pop.set_modal(true);
+ m_pop.set_position(Gtk.PositionType.BOTTOM);
+ m_pop.closed.connect(() => {
+ popClosed();
+ });
+ }
+
+ public void update()
+ {
+ m_enclosures = new Gee.ArrayList<Enclosure>();
+ Article? selectedArticle = ColumnView.get_default().getSelectedArticle();
+ if(selectedArticle != null)
+ {
+ m_enclosures = selectedArticle.getEnclosures();
+ }
+
+ if(m_signalID != 0)
+ {
+ this.disconnect(m_signalID);
+ m_signalID = 0;
+ }
+
+ if(m_enclosures.size != 0)
+ {
+ m_stack.set_visible_child_name("files");
+ this.set_tooltip_text(_("Attachments"));
+ var children = m_list.get_children();
+ foreach(Gtk.Widget row in children)
+ {
+ m_list.remove(row);
+ }
+ foreach(Enclosure enc in m_enclosures)
+ {
+ m_list.add(new mediaRow(enc));
+ }
+ m_signalID = this.clicked.connect(() => {
+ popOpened();
+ m_pop.show_all();
+ });
+ }
+ else
+ {
+ // no media
+ }
+ }
+
+ private void playMedia(string url)
+ {
+ Logger.debug(@"MediaButton.playMedia: $url");
+ if(Settings.general().get_boolean("mediaplayer"))
+ {
+ m_stack.set_visible_child_name("spinner");
+ var media = new MediaPlayer(url);
+ media.loaded.connect(() => {
+ m_spinner.stop();
+ m_stack.set_visible_child_name("files");
+ });
+ ColumnView.get_default().ArticleViewAddMedia(media);
+ }
+ else
+ {
+ try
+ {
+ Gtk.show_uri_on_window(MainWindow.get_default(), url, Gdk.CURRENT_TIME);
+ }
+ catch(GLib.Error e)
+ {
+ Logger.debug("could not open the link in an external browser: %s".printf(e.message));
+ }
+ }
+ }
+}
diff --git a/src/Widgets/MediaPlayer.vala b/src/Widgets/MediaPlayer.vala
index cc6eb123..5f87aa04 100644
--- a/src/Widgets/MediaPlayer.vala
+++ b/src/Widgets/MediaPlayer.vala
@@ -57,11 +57,11 @@ public class FeedReader.MediaPlayer : Gtk.Box {
ThreadFunc<void*> run = () => {
try
- {
- var discoverer = new Gst.PbUtils.Discoverer((Gst.ClockTime)(10*Gst.SECOND));
- var info = discoverer.discover_uri(m_URL);
+ {
+ var discoverer = new Gst.PbUtils.Discoverer((Gst.ClockTime)(10*Gst.SECOND));
+ var info = discoverer.discover_uri(m_URL);
- foreach(Gst.PbUtils.DiscovererStreamInfo i in info.get_stream_list())
+ foreach(Gst.PbUtils.DiscovererStreamInfo i in info.get_stream_list())
{
if(i is Gst.PbUtils.DiscovererVideoInfo)
{
@@ -70,9 +70,9 @@ public class FeedReader.MediaPlayer : Gtk.Box {
m_type = MediaType.VIDEO;
}
}
- }
- catch (Error e)
- {
+ }
+ catch (Error e)
+ {
Logger.error("Unable discover_uri: " + e.message);
}
Idle.add((owned) callback, GLib.Priority.HIGH_IDLE);
@@ -400,7 +400,7 @@ public class FeedReader.MediaPlayer : Gtk.Box {
m_player["volume"] = 0.0;
m_muted = true;
}
- }
+ }
private bool busCallback(Gst.Bus bus, Gst.Message message)
{
@@ -452,7 +452,7 @@ public class FeedReader.MediaPlayer : Gtk.Box {
Gst.State newstate;
Gst.State pending;
message.parse_state_changed(out oldstate, out newstate, out pending);
- break;
+ break;
}
return true;
}
diff --git a/src/Widgets/MediaPopover.vala b/src/Widgets/MediaPopover.vala
deleted file mode 100644
index 439c7e80..00000000
--- a/src/Widgets/MediaPopover.vala
+++ /dev/null
@@ -1,70 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.MediaPopover : Gtk.Popover {
-
- private Gtk.ListBox m_list;
- private Gee.ArrayList<string> m_media;
- public signal void play(string url);
-
- public MediaPopover(Gtk.Widget widget)
- {
- m_list = new Gtk.ListBox();
- m_list.margin = 10;
- m_list.set_selection_mode(Gtk.SelectionMode.NONE);
- m_list.row_activated.connect(playMedia);
- populateList();
- this.add(m_list);
- this.set_modal(true);
- this.set_relative_to(widget);
- this.set_position(Gtk.PositionType.BOTTOM);
- this.show_all();
- }
-
- private void populateList()
- {
- m_media = ColumnView.get_default().getSelectedArticleMedia();
-
- foreach(string media in m_media)
- {
- m_list.add(new mediaRow(media));
- }
- }
-
- private void playMedia(Gtk.ListBoxRow row)
- {
- this.hide();
- mediaRow? mRow = row as mediaRow;
-
- if(mRow != null)
- {
- if(Settings.general().get_boolean("mediaplayer"))
- {
- play(mRow.getURL());
- }
- else
- {
- try
- {
- Gtk.show_uri_on_window(MainWindow.get_default(), mRow.getURL(), Gdk.CURRENT_TIME);
- }
- catch(GLib.Error e)
- {
- Logger.debug("could not open the link in an external browser: %s".printf(e.message));
- }
- }
- }
- }
-}
diff --git a/src/Widgets/MediaRow.vala b/src/Widgets/MediaRow.vala
index 6fc9d914..53663316 100644
--- a/src/Widgets/MediaRow.vala
+++ b/src/Widgets/MediaRow.vala
@@ -15,35 +15,51 @@
public class FeedReader.mediaRow : Gtk.ListBoxRow {
- private string m_url;
+ private Enclosure m_enc;
- public mediaRow(string url)
+ public mediaRow(Enclosure enc)
{
- m_url = url;
+ m_enc = enc;
- int lastSlash = url.last_index_of_char('/');
- string fileName = url.substring(lastSlash + 1);
- var icon = new Gtk.Image.from_icon_name("media-playback-start-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
+ int lastSlash = m_enc.get_url().last_index_of_char('/');
+ string fileName = m_enc.get_url().substring(lastSlash + 1);
+ string icon_name = "image-x-generic-symbolic";
- var label = new Gtk.Label(GLib.Uri.unescape_string(fileName));
- label.set_line_wrap_mode(Pango.WrapMode.WORD);
- label.set_ellipsize(Pango.EllipsizeMode.END);
- label.set_alignment(0.0f, 0.5f);
- label.get_style_context().add_class("h4");
+ switch(enc.get_enclosure_type())
+ {
+ case EnclosureType.IMAGE:
+ icon_name = "image-x-generic-symbolic";
+ break;
+
+ case EnclosureType.AUDIO:
+ icon_name = "audio-speakers-symbolic";
+ break;
+
+ case EnclosureType.VIDEO:
+ icon_name = "media-playback-start-symbolic";
+ break;
+ }
+ var icon = new Gtk.Image.from_icon_name(icon_name, Gtk.IconSize.SMALL_TOOLBAR);
+
+ var label = new Gtk.Label(GLib.Uri.unescape_string(fileName));
+ label.set_line_wrap_mode(Pango.WrapMode.WORD);
+ label.set_ellipsize(Pango.EllipsizeMode.END);
+ label.set_alignment(0.0f, 0.5f);
+ label.get_style_context().add_class("h4");
var box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
- box.margin = 3;
- box.pack_start(icon, false, false, 8);
- box.pack_start(label, true, true, 0);
+ box.margin = 3;
+ box.pack_start(icon, false, false, 8);
+ box.pack_start(label, true, true, 0);
this.add(box);
this.margin = 2;
this.show_all();
}
- public string getURL()
- {
- return m_url;
- }
+ public string getURL()
+ {
+ return m_enc.get_url();
+ }
}
diff --git a/src/Widgets/ModeButton.vala b/src/Widgets/ModeButton.vala
index 2a2ea097..34db2f87 100644
--- a/src/Widgets/ModeButton.vala
+++ b/src/Widgets/ModeButton.vala
@@ -22,252 +22,252 @@
namespace FeedReader {
- /**
- * This widget is a multiple option modal switch
- *
- * {{../../doc/images/ModeButton.png}}
- */
- public class ModeButton : Gtk.Box {
-
- private class Item : Gtk.ToggleButton {
- public int index { get; construct; }
- public Item (int index) {
- Object (index: index);
- can_focus = false;
- add_events (Gdk.EventMask.SCROLL_MASK);
- }
- }
-
- public signal void mode_added (int index, Gtk.Widget widget);
- public signal void mode_removed (int index, Gtk.Widget widget);
- public signal void mode_changed (Gtk.Widget widget);
-
- /**
- * Index of currently selected item.
- */
- public int selected {
- get { return _selected; }
- set { set_active (value); }
- }
-
- /**
- * Read-only length of current ModeButton
- */
- public uint n_items {
- get { return item_map.size; }
- }
-
- private int _selected = -1;
- private Gee.HashMap<int, Item> item_map;
- private uint m_timeout_source_id = 0;
-
- /**
- * Makes new ModeButton
- */
- public ModeButton () {
- homogeneous = true;
- spacing = 0;
- can_focus = false;
-
- item_map = new Gee.HashMap<int, Item> ();
-
- var style = get_style_context ();
- style.add_class (Gtk.STYLE_CLASS_LINKED);
- style.add_class ("raised"); // needed for toolbars
- }
-
- /**
- * Appends Pixbuf to ModeButton
- *
- * @param pixbuf Gdk.Pixbuf to append to ModeButton
- */
- public int append_pixbuf (Gdk.Pixbuf pixbuf, string tooltip = "") {
- return append (new Gtk.Image.from_pixbuf (pixbuf), tooltip);
- }
-
- /**
- * Appends text to ModeButton
- *
- * @param text text to append to ModeButton
- * @return index of new item
- */
- public int append_text (string text, string tooltip = "") {
- return append (new Gtk.Label(text), tooltip);
- }
-
- /**
- * Appends icon to ModeButton
- *
- * @param icon_name name of icon to append
- * @param size desired size of icon
- * @return index of appended item
- */
- public int append_icon (string icon_name, Gtk.IconSize size, string tooltip = "") {
- return append (new Gtk.Image.from_icon_name (icon_name, size), tooltip);
- }
-
- /**
- * Appends given widget to ModeButton
- *
- * @param w widget to add to ModeButton
- * @return index of new item
- */
- public int append (Gtk.Widget w, string tooltip) {
- int index;
- for (index = item_map.size; item_map.has_key (index); index++);
- assert (item_map[index] == null);
-
- w.set_tooltip_text(tooltip);
-
- var item = new Item (index);
- item.scroll_event.connect (on_scroll_event);
- item.add (w);
-
- item.button_press_event.connect (() => {
- set_active (item.index);
- return true;
- });
-
- item_map[index] = item;
-
- add (item);
- item.show_all ();
-
- mode_added (index, w);
-
- return index;
- }
-
- /**
- * Sets item of given index's activity
- *
- * @param new_active_index index of changed item
- */
- public void set_active (int new_active_index, bool initSet = false) {
- return_if_fail (item_map.has_key (new_active_index));
- var new_item = item_map[new_active_index] as Item;
-
- if (new_item != null) {
- assert (new_item.index == new_active_index);
- new_item.set_active (true);
-
- if (_selected == new_active_index)
- return;
-
- // Unselect the previous item
- var old_item = item_map[_selected] as Item;
- if (old_item != null)
- old_item.set_active (false);
-
- _selected = new_active_index;
-
- if(!initSet)
- {
- if(m_timeout_source_id > 0)
- {
- GLib.Source.remove(m_timeout_source_id);
- m_timeout_source_id = 0;
- }
-
- m_timeout_source_id = GLib.Timeout.add(50, () => {
- mode_changed(new_item.get_child());
- m_timeout_source_id = 0;
- return false;
- });
- }
- }
- }
-
- /**
- * Changes visibility of item of given index
- *
- * @param index index of item to be modified
- * @param val value to change the visiblity to
- */
- public void set_item_visible (int index, bool val) {
- return_if_fail (item_map.has_key (index));
- var item = item_map[index] as Item;
-
- if (item != null) {
- assert (item.index == index);
- item.no_show_all = !val;
- item.visible = val;
- }
- }
-
- /**
- * Removes item at given index
- *
- * @param index index of item to remove
- */
- public new void remove (int index) {
- return_if_fail (item_map.has_key (index));
- var item = item_map[index] as Item;
-
- if (item != null) {
- assert (item.index == index);
- item_map.unset (index);
- mode_removed (index, item.get_child ());
- item.destroy ();
- }
- }
-
- /**
- * Clears all children
- */
- public void clear_children () {
- foreach (weak Gtk.Widget button in get_children ()) {
- button.hide ();
- if (button.get_parent () != null)
- base.remove (button);
- }
-
- item_map.clear ();
-
- _selected = -1;
- }
-
- private bool on_scroll_event (Gtk.Widget widget, Gdk.EventScroll ev) {
- int offset;
-
- switch (ev.direction) {
- case Gdk.ScrollDirection.DOWN:
- case Gdk.ScrollDirection.RIGHT:
- offset = 1;
- break;
- case Gdk.ScrollDirection.UP:
- case Gdk.ScrollDirection.LEFT:
- offset = -1;
- break;
- default:
- return false;
- }
-
- // Try to find a valid item, since there could be invisible items in
- // the middle and those shouldn't be selected. We use the children list
- // instead of item_map because order matters here.
- var children = get_children ();
- uint n_children = children.length ();
-
- var selected_item = item_map[selected];
- if (selected_item == null)
- return false;
-
- int new_item = children.index (selected_item);
- if (new_item < 0)
- return false;
-
- do {
- new_item += offset;
- var item = children.nth_data (new_item) as Item;
-
- if (item != null && item.visible && item.sensitive) {
- selected = item.index;
- break;
- }
- } while (new_item >= 0 && new_item < n_children);
-
- return false;
- }
- }
+ /**
+ * This widget is a multiple option modal switch
+ *
+ * {{../../doc/images/ModeButton.png}}
+ */
+ public class ModeButton : Gtk.Box {
+
+ private class Item : Gtk.ToggleButton {
+ public int index { get; construct; }
+ public Item (int index) {
+ Object (index: index);
+ can_focus = false;
+ add_events (Gdk.EventMask.SCROLL_MASK);
+ }
+ }
+
+ public signal void mode_added (int index, Gtk.Widget widget);
+ public signal void mode_removed (int index, Gtk.Widget widget);
+ public signal void mode_changed (Gtk.Widget widget);
+
+ /**
+ * Index of currently selected item.
+ */
+ public int selected {
+ get { return _selected; }
+ set { set_active (value); }
+ }
+
+ /**
+ * Read-only length of current ModeButton
+ */
+ public uint n_items {
+ get { return item_map.size; }
+ }
+
+ private int _selected = -1;
+ private Gee.HashMap<int, Item> item_map;
+ private uint m_timeout_source_id = 0;
+
+ /**
+ * Makes new ModeButton
+ */
+ public ModeButton () {
+ homogeneous = true;
+ spacing = 0;
+ can_focus = false;
+
+ item_map = new Gee.HashMap<int, Item> ();
+
+ var style = get_style_context ();
+ style.add_class (Gtk.STYLE_CLASS_LINKED);
+ style.add_class ("raised"); // needed for toolbars
+ }
+
+ /**
+ * Appends Pixbuf to ModeButton
+ *
+ * @param pixbuf Gdk.Pixbuf to append to ModeButton
+ */
+ public int append_pixbuf (Gdk.Pixbuf pixbuf, string tooltip = "") {
+ return append (new Gtk.Image.from_pixbuf (pixbuf), tooltip);
+ }
+
+ /**
+ * Appends text to ModeButton
+ *
+ * @param text text to append to ModeButton
+ * @return index of new item
+ */
+ public int append_text (string text, string tooltip = "") {
+ return append (new Gtk.Label(text), tooltip);
+ }
+
+ /**
+ * Appends icon to ModeButton
+ *
+ * @param icon_name name of icon to append
+ * @param size desired size of icon
+ * @return index of appended item
+ */
+ public int append_icon (string icon_name, Gtk.IconSize size, string tooltip = "") {
+ return append (new Gtk.Image.from_icon_name (icon_name, size), tooltip);
+ }
+
+ /**
+ * Appends given widget to ModeButton
+ *
+ * @param w widget to add to ModeButton
+ * @return index of new item
+ */
+ public int append (Gtk.Widget w, string tooltip) {
+ int index;
+ for (index = item_map.size; item_map.has_key (index); index++);
+ assert (item_map[index] == null);
+
+ w.set_tooltip_text(tooltip);
+
+ var item = new Item (index);
+ item.scroll_event.connect (on_scroll_event);
+ item.add (w);
+
+ item.button_press_event.connect (() => {
+ set_active (item.index);
+ return true;
+ });
+
+ item_map[index] = item;
+
+ add (item);
+ item.show_all ();
+
+ mode_added (index, w);
+
+ return index;
+ }
+
+ /**
+ * Sets item of given index's activity
+ *
+ * @param new_active_index index of changed item
+ */
+ public void set_active (int new_active_index, bool initSet = false) {
+ return_if_fail (item_map.has_key (new_active_index));
+ var new_item = item_map[new_active_index] as Item;
+
+ if (new_item != null) {
+ assert (new_item.index == new_active_index);
+ new_item.set_active (true);
+
+ if (_selected == new_active_index)
+ return;
+
+ // Unselect the previous item
+ var old_item = item_map[_selected] as Item;
+ if (old_item != null)
+ old_item.set_active (false);
+
+ _selected = new_active_index;
+
+ if(!initSet)
+ {
+ if(m_timeout_source_id > 0)
+ {
+ GLib.Source.remove(m_timeout_source_id);
+ m_timeout_source_id = 0;
+ }
+
+ m_timeout_source_id = GLib.Timeout.add(50, () => {
+ mode_changed(new_item.get_child());
+ m_timeout_source_id = 0;
+ return false;
+ });
+ }
+ }
+ }
+
+ /**
+ * Changes visibility of item of given index
+ *
+ * @param index index of item to be modified
+ * @param val value to change the visiblity to
+ */
+ public void set_item_visible (int index, bool val) {
+ return_if_fail (item_map.has_key (index));
+ var item = item_map[index] as Item;
+
+ if (item != null) {
+ assert (item.index == index);
+ item.no_show_all = !val;
+ item.visible = val;
+ }
+ }
+
+ /**
+ * Removes item at given index
+ *
+ * @param index index of item to remove
+ */
+ public new void remove (int index) {
+ return_if_fail (item_map.has_key (index));
+ var item = item_map[index] as Item;
+
+ if (item != null) {
+ assert (item.index == index);
+ item_map.unset (index);
+ mode_removed (index, item.get_child ());
+ item.destroy ();
+ }
+ }
+
+ /**
+ * Clears all children
+ */
+ public void clear_children () {
+ foreach (weak Gtk.Widget button in get_children ()) {
+ button.hide ();
+ if (button.get_parent () != null)
+ base.remove (button);
+ }
+
+ item_map.clear ();
+
+ _selected = -1;
+ }
+
+ private bool on_scroll_event (Gtk.Widget widget, Gdk.EventScroll ev) {
+ int offset;
+
+ switch (ev.direction) {
+ case Gdk.ScrollDirection.DOWN:
+ case Gdk.ScrollDirection.RIGHT:
+ offset = 1;
+ break;
+ case Gdk.ScrollDirection.UP:
+ case Gdk.ScrollDirection.LEFT:
+ offset = -1;
+ break;
+ default:
+ return false;
+ }
+
+ // Try to find a valid item, since there could be invisible items in
+ // the middle and those shouldn't be selected. We use the children list
+ // instead of item_map because order matters here.
+ var children = get_children ();
+ uint n_children = children.length ();
+
+ var selected_item = item_map[selected];
+ if (selected_item == null)
+ return false;
+
+ int new_item = children.index (selected_item);
+ if (new_item < 0)
+ return false;
+
+ do {
+ new_item += offset;
+ var item = children.nth_data (new_item) as Item;
+
+ if (item != null && item.visible && item.sensitive) {
+ selected = item.index;
+ break;
+ }
+ } while (new_item >= 0 && new_item < n_children);
+
+ return false;
+ }
+ }
}
diff --git a/src/Widgets/RemovePopover.vala b/src/Widgets/RemovePopover.vala
index f893ba3f..0640ccc2 100644
--- a/src/Widgets/RemovePopover.vala
+++ b/src/Widgets/RemovePopover.vala
@@ -31,15 +31,16 @@ public class FeedReader.RemovePopover : Gtk.Popover {
switch(m_type)
{
case FeedListType.TAG:
- m_name = dbUI.get_default().getTagName(m_id);
+ m_name = DataBase.readOnly().getTagName(m_id);
break;
case FeedListType.FEED:
- m_name = dbUI.get_default().getFeedName(m_id);
+ var feed = DataBase.readOnly().read_feed(m_id);
+ m_name = feed != null ? feed.getTitle() : "";
break;
case FeedListType.CATEGORY:
- m_name = dbUI.get_default().getCategoryName(m_id);
+ m_name = DataBase.readOnly().getCategoryName(m_id);
break;
}
@@ -81,14 +82,7 @@ public class FeedReader.RemovePopover : Gtk.Popover {
var notification = MainWindow.get_default().showNotification(text);
ulong eventID = notification.dismissed.connect(() => {
- try
- {
- DBusConnection.get_default().deleteTag(m_id);
- }
- catch(GLib.Error e)
- {
- Logger.error("RemovePopover.removeTag: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().deleteTag(DataBase.readOnly().read_tag(m_id));
});
notification.action.connect(() => {
notification.disconnect(eventID);
@@ -103,14 +97,7 @@ public class FeedReader.RemovePopover : Gtk.Popover {
var notification = MainWindow.get_default().showNotification(text);
ulong eventID = notification.dismissed.connect(() => {
- try
- {
- DBusConnection.get_default().removeFeed(m_id);
- }
- catch(GLib.Error e)
- {
- Logger.error("RemovePopover.removeFeed: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().removeFeed(m_id);
});
notification.action.connect(() => {
notification.disconnect(eventID);
@@ -126,14 +113,7 @@ public class FeedReader.RemovePopover : Gtk.Popover {
var notification = MainWindow.get_default().showNotification(text);
ulong eventID = notification.dismissed.connect(() => {
- try
- {
- DBusConnection.get_default().removeCategory(m_id);
- }
- catch(GLib.Error e)
- {
- Logger.error("RemovePopover.removeCategory: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().removeCategory(m_id);
});
notification.action.connect(() => {
notification.disconnect(eventID);
diff --git a/src/Widgets/ResetPage.vala b/src/Widgets/ResetPage.vala
index 18d806b0..68231fa9 100644
--- a/src/Widgets/ResetPage.vala
+++ b/src/Widgets/ResetPage.vala
@@ -80,6 +80,7 @@ public class FeedReader.ResetPage : Gtk.Bin {
m_waitingBox.show_all();
m_spinner.start();
m_newAccountButton.set_sensitive(false);
+ FeedReaderBackend.get_default().cancelSync();
while(Settings.state().get_boolean("currently-updating"))
{
@@ -90,29 +91,26 @@ public class FeedReader.ResetPage : Gtk.Bin {
return;
}
- try
- {
- // set "currently-updating" ourself to prevent the daemon to start sync
- Settings.state().set_boolean("currently-updating", true);
+ // set "currently-updating" ourself to prevent the backend to start sync
+ Settings.state().set_boolean("currently-updating", true);
- // clear all data from UI
- ColumnView.get_default().clear();
+ // clear all data from UI
+ ColumnView.get_default().clear();
- Utils.resetSettings(Settings.general());
- Utils.resetSettings(Settings.state());
- DBusConnection.get_default().resetDB();
- DBusConnection.get_default().resetAccount();
+ Settings.general().reset("plugin");
+ Utils.resetSettings(Settings.state());
+ FeedReaderBackend.get_default().resetDB();
+ FeedReaderBackend.get_default().resetAccount();
- Utils.remove_directory(GLib.Environment.get_user_data_dir() + "/feedreader/data/images/");
+ Utils.remove_directory(GLib.Environment.get_user_data_dir() + "/feedreader/data/images/");
- Settings.state().set_boolean("currently-updating", false);
- DBusConnection.get_default().login("none");
- reset();
- }
- catch(GLib.Error e)
- {
- Logger.error("ResetPage.resetAllData: %s".printf(e.message));
- }
+ Settings.state().set_boolean("currently-updating", false);
+ FeedReaderBackend.get_default().login("none");
+
+ // Load all available plugins, to present them on the login page
+ FeedServer.get_default().LoadAllPlugins();
+
+ reset();
}
private void abortReset()
diff --git a/src/Widgets/ServiceInfo.vala b/src/Widgets/ServiceInfo.vala
index 12217679..2d662dfa 100644
--- a/src/Widgets/ServiceInfo.vala
+++ b/src/Widgets/ServiceInfo.vala
@@ -14,89 +14,82 @@
// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
public class FeedReader.ServiceInfo : Gtk.Overlay {
- private Gtk.Stack m_stack;
- private Gtk.Spinner m_spinner;
- private Gtk.Image m_logo;
- private Gtk.Label m_label;
- private Gtk.Label m_offline;
- private Gtk.Box m_box;
+ private Gtk.Stack m_stack;
+ private Gtk.Spinner m_spinner;
+ private Gtk.Image m_logo;
+ private Gtk.Label m_label;
+ private Gtk.Label m_offline;
+ private Gtk.Box m_box;
- public ServiceInfo()
- {
- m_logo = new Gtk.Image();
- m_logo = new Gtk.Image.from_file("");
- m_logo.get_style_context().add_class("fr-sidebar-symbolic");
- m_label = new Gtk.Label("");
- m_label.margin_start = 10;
- m_label.margin_end = 10;
- m_label.set_ellipsize(Pango.EllipsizeMode.END);
+ public ServiceInfo()
+ {
+ m_logo = new Gtk.Image();
+ m_logo = new Gtk.Image.from_file("");
+ m_logo.get_style_context().add_class("fr-sidebar-symbolic");
+ m_label = new Gtk.Label("");
+ m_label.margin_start = 10;
+ m_label.margin_end = 10;
+ m_label.set_ellipsize(Pango.EllipsizeMode.END);
- m_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
- m_box.pack_start(m_logo, false, false, 0);
- m_box.pack_start(m_label, false, false, 5);
- m_box.margin_top = 20;
- m_box.margin_bottom = 5;
+ m_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ m_box.pack_start(m_logo, false, false, 0);
+ m_box.pack_start(m_label, false, false, 5);
+ m_box.margin_top = 20;
+ m_box.margin_bottom = 5;
- m_spinner = new Gtk.Spinner();
- m_spinner.set_size_request(32,32);
+ m_spinner = new Gtk.Spinner();
+ m_spinner.set_size_request(32,32);
- m_stack = new Gtk.Stack();
- m_stack.add_named(m_box, "info");
- m_stack.add_named(m_spinner, "spinner");
- m_stack.get_style_context().add_class("fr-sidebar");
- this.add(m_stack);
+ m_stack = new Gtk.Stack();
+ m_stack.add_named(m_box, "info");
+ m_stack.add_named(m_spinner, "spinner");
+ m_stack.get_style_context().add_class("fr-sidebar");
+ this.add(m_stack);
- m_offline = new Gtk.Label("OFFLINE");
- m_offline.margin_start = 40;
- m_offline.margin_end = 40;
- m_offline.margin_top = 30;
- m_offline.margin_bottom = 10;
- m_offline.get_style_context().add_class("osd");
- m_offline.no_show_all = true;
- this.add_overlay(m_offline);
- }
+ m_offline = new Gtk.Label("OFFLINE");
+ m_offline.margin_start = 40;
+ m_offline.margin_end = 40;
+ m_offline.margin_top = 30;
+ m_offline.margin_bottom = 10;
+ m_offline.get_style_context().add_class("osd");
+ m_offline.no_show_all = true;
+ this.add_overlay(m_offline);
+ }
- public void refresh()
- {
- try
- {
- string? service_icon = DBusConnection.get_default().symbolicIcon();
- string? user_name = DBusConnection.get_default().accountName();
- string? server = DBusConnection.get_default().getServerURL();
+ public void refresh()
+ {
+ string? service_icon = FeedReaderBackend.get_default().symbolicIcon();
+ string? user_name = FeedReaderBackend.get_default().accountName();
+ string? server = FeedReaderBackend.get_default().getServerURL();
- if(this.is_visible())
- {
- if(user_name == "none" || service_icon == "none")
- {
- m_spinner.start();
- m_stack.set_visible_child_name("spinner");
- }
- else
- {
- m_logo.set_from_icon_name(service_icon, Gtk.IconSize.BUTTON);
- m_logo.get_style_context().add_class("fr-sidebar-symbolic");
- m_label.set_label(user_name);
- m_stack.set_visible_child_name("info");
- if(server != "none")
- this.set_tooltip_text(Utils.shortenURL(server));
- }
- }
- }
- catch(GLib.Error e)
+ if(this.is_visible())
{
- Logger.error("ServiceInfo.refresh: %s".printf(e.message));
+ if(user_name == "none" || service_icon == "none")
+ {
+ m_spinner.start();
+ m_stack.set_visible_child_name("spinner");
+ }
+ else
+ {
+ m_logo.set_from_icon_name(service_icon, Gtk.IconSize.BUTTON);
+ m_logo.get_style_context().add_class("fr-sidebar-symbolic");
+ m_label.set_label(user_name);
+ m_stack.set_visible_child_name("info");
+ if(server != "none")
+ this.set_tooltip_text(Utils.shortenURL(server));
+ }
}
- show_all();
- }
+ show_all();
+ }
- public void setOffline()
- {
- m_offline.show();
- }
+ public void setOffline()
+ {
+ m_offline.show();
+ }
- public void setOnline()
- {
- m_offline.hide();
- }
+ public void setOnline()
+ {
+ m_offline.hide();
+ }
}
diff --git a/src/Widgets/ServiceSettingsPopover.vala b/src/Widgets/ServiceSettingsPopover.vala
index 5a802424..ed65c4bf 100644
--- a/src/Widgets/ServiceSettingsPopover.vala
+++ b/src/Widgets/ServiceSettingsPopover.vala
@@ -20,13 +20,13 @@ public class FeedReader.ServiceSettingsPopover : Gtk.Popover {
public ServiceSettingsPopover(Gtk.Widget widget)
{
- var list = new Gtk.ListBox();
- list.margin = 10;
- list.set_selection_mode(Gtk.SelectionMode.NONE);
- list.row_activated.connect((row) => {
+ var list = new Gtk.ListBox();
+ list.margin = 10;
+ list.set_selection_mode(Gtk.SelectionMode.NONE);
+ list.row_activated.connect((row) => {
newAccount(((ServiceSettingsPopoverRow)row).getType());
this.hide();
- });
+ });
foreach(var account in Share.get_default().getAccountTypes())
{
@@ -34,11 +34,11 @@ public class FeedReader.ServiceSettingsPopover : Gtk.Popover {
list.add(row);
}
- this.add(list);
+ this.add(list);
this.set_modal(true);
this.set_relative_to(widget);
this.set_position(Gtk.PositionType.BOTTOM);
- this.show_all();
+ this.show_all();
}
}
@@ -47,41 +47,41 @@ public class FeedReader.ServiceSettingsPopover : Gtk.Popover {
public class FeedReader.ServiceSettingsPopoverRow : Gtk.ListBoxRow {
private string m_name;
- private Gtk.Label m_label;
- private Gtk.Box m_box;
- private string m_type;
+ private Gtk.Label m_label;
+ private Gtk.Box m_box;
+ private string m_type;
public ServiceSettingsPopoverRow(string serviceName, string type, string iconName)
{
m_type = type;
m_name = serviceName;
- m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
- m_box.margin = 3;
+ m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
+ m_box.margin = 3;
var icon = new Gtk.Image.from_icon_name(iconName, Gtk.IconSize.DND);
- m_label = new Gtk.Label(serviceName);
- m_label.set_line_wrap_mode(Pango.WrapMode.WORD);
- m_label.set_ellipsize(Pango.EllipsizeMode.END);
- m_label.set_alignment(0.5f, 0.5f);
- m_label.set_justify(Gtk.Justification.LEFT);
- m_label.set_halign(Gtk.Align.START);
+ m_label = new Gtk.Label(serviceName);
+ m_label.set_line_wrap_mode(Pango.WrapMode.WORD);
+ m_label.set_ellipsize(Pango.EllipsizeMode.END);
+ m_label.set_alignment(0.5f, 0.5f);
+ m_label.set_justify(Gtk.Justification.LEFT);
+ m_label.set_halign(Gtk.Align.START);
- m_box.pack_start(icon, false, false, 8);
- m_box.pack_start(m_label, true, true, 0);
+ m_box.pack_start(icon, false, false, 8);
+ m_box.pack_start(m_label, true, true, 0);
this.add(m_box);
this.show_all();
}
- public string getType()
- {
- return m_type;
- }
+ public string getType()
+ {
+ return m_type;
+ }
- public string getName()
- {
- return m_name;
- }
+ public string getName()
+ {
+ return m_name;
+ }
}
diff --git a/src/Widgets/Setting.vala b/src/Widgets/Setting.vala
index ba024d93..fd029175 100644
--- a/src/Widgets/Setting.vala
+++ b/src/Widgets/Setting.vala
@@ -25,8 +25,8 @@ public class FeedReader.Setting : Gtk.Box {
this.spacing = 0;
m_label = new Gtk.Label(name);
- m_label.set_alignment(0, 0.5f);
- m_label.margin_start = 15;
+ m_label.set_alignment(0, 0.5f);
+ m_label.margin_start = 15;
m_label.set_tooltip_text(tooltip);
this.pack_start(m_label, true, true, 0);
@@ -36,6 +36,23 @@ public class FeedReader.Setting : Gtk.Box {
}
+public class FeedReader.SettingFont : FeedReader.Setting {
+
+ public SettingFont(string name, GLib.Settings settings, string key){
+ base(name, null);
+ var font_button = new Gtk.FontButton.with_font(settings.get_string(key));
+ font_button.set_use_size(false);
+ font_button.set_show_size(true);
+ font_button.font_set.connect(() => {
+ settings.set_string(key, font_button.get_font_name());
+ changed();
+ });
+
+ this.pack_end(font_button, false, false, 0);
+ }
+
+}
+
public class FeedReader.SettingDropbox : FeedReader.Setting {
public SettingDropbox(string name, GLib.Settings settings, string key, string[] values, string? tooltip = null)
@@ -43,12 +60,12 @@ public class FeedReader.SettingDropbox : FeedReader.Setting {
base(name, tooltip);
var liststore = new Gtk.ListStore(1, typeof(string));
- foreach(string val in values)
- {
- Gtk.TreeIter iter;
- liststore.append(out iter);
- liststore.set(iter, 0, val);
- }
+ foreach(string val in values)
+ {
+ Gtk.TreeIter iter;
+ liststore.append(out iter);
+ liststore.set(iter, 0, val);
+ }
var dropbox = new Gtk.ComboBox.with_model(liststore);
var renderer = new Gtk.CellRendererText();
@@ -58,9 +75,9 @@ public class FeedReader.SettingDropbox : FeedReader.Setting {
dropbox.changed.connect(() => {
settings.set_enum(key, dropbox.get_active());
changed();
- });
+ });
- this.pack_end(dropbox, false, false, 0);
+ this.pack_end(dropbox, false, false, 0);
}
}
@@ -71,15 +88,15 @@ public class FeedReader.SettingSwitch : FeedReader.Setting {
{
base(name, tooltip);
- var Switch = new Gtk.Switch();
- Switch.active = settings.get_boolean(key);
+ var Switch = new Gtk.Switch();
+ Switch.active = settings.get_boolean(key);
- Switch.notify["active"].connect(() => {
- settings.set_boolean(key, Switch.active);
- changed();
- });
+ Switch.notify["active"].connect(() => {
+ settings.set_boolean(key, Switch.active);
+ changed();
+ });
- this.pack_end(Switch, false, false, 0);
+ this.pack_end(Switch, false, false, 0);
}
}
@@ -90,14 +107,14 @@ public class FeedReader.SettingSpin : FeedReader.Setting {
{
base(name, tooltip);
- var spin = new Gtk.SpinButton.with_range(min, max, step);
- spin.set_value(settings.get_int(key));
+ var spin = new Gtk.SpinButton.with_range(min, max, step);
+ spin.set_value(settings.get_int(key));
- spin.value_changed.connect(() => {
- settings.set_int(key, spin.get_value_as_int());
- changed();
- });
+ spin.value_changed.connect(() => {
+ settings.set_int(key, spin.get_value_as_int());
+ changed();
+ });
- this.pack_end(spin, false, false, 0);
+ this.pack_end(spin, false, false, 0);
}
}
diff --git a/src/Widgets/SettingsDialog.vala b/src/Widgets/SettingsDialog.vala
index d530b267..c2a044c9 100644
--- a/src/Widgets/SettingsDialog.vala
+++ b/src/Widgets/SettingsDialog.vala
@@ -15,10 +15,11 @@
public class FeedReader.SettingsDialog : Gtk.Dialog {
- private Gtk.ListBox m_serviceList;
- private Gtk.Stack m_stack;
- private InfoBar m_errorBar;
- private static SettingsDialog? m_dialog = null;
+ private Gtk.ListBox m_serviceList;
+ private Gtk.Stack m_stack;
+ private InfoBar m_errorBar;
+ private Gtk.HeaderBar m_headerbar;
+ private static SettingsDialog? m_dialog = null;
public static SettingsDialog get_default()
{
@@ -28,201 +29,189 @@ public class FeedReader.SettingsDialog : Gtk.Dialog {
return m_dialog;
}
- private SettingsDialog()
- {
- Object(use_header_bar: 1);
- this.title = _("Settings");
+ private SettingsDialog()
+ {
this.border_width = 20;
- this.set_transient_for(MainWindow.get_default());
- this.set_modal(true);
- this.delete_event.connect(hide_on_delete);
- set_default_size(550, 550);
-
- m_stack = new Gtk.Stack();
- m_stack.set_transition_duration(50);
- m_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE);
- m_stack.set_halign(Gtk.Align.FILL);
- m_stack.add_titled(setup_UI(), "ui", _("Interface"));
- m_stack.add_titled(setup_Internal(), "internal", _("Internals"));
- m_stack.add_titled(setup_Service(), "service", _("Share"));
+ this.set_transient_for(MainWindow.get_default());
+ this.set_modal(true);
+ this.delete_event.connect(hide_on_delete);
+ set_default_size(550, 450);
+
+ m_headerbar = new Gtk.HeaderBar();
+ m_headerbar.set_show_close_button(true);
+ set_titlebar(m_headerbar);
+
+ m_stack = new Gtk.Stack();
+ m_stack.set_transition_duration(50);
+ m_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE);
+ m_stack.set_halign(Gtk.Align.FILL);
+ m_stack.add_titled(setup_UI(), "ui", _("Interface"));
+ m_stack.add_titled(setup_Internal(), "internal", _("Internals"));
+ m_stack.add_titled(setup_Service(), "service", _("Share"));
Gtk.StackSwitcher switcher = new Gtk.StackSwitcher();
- switcher.set_halign(Gtk.Align.CENTER);
- switcher.set_valign(Gtk.Align.CENTER);
- switcher.set_stack(m_stack);
-
- var content = get_content_area() as Gtk.Box;
- content.set_spacing(2);
- content.pack_start(switcher, false, false, 0);
- content.add(m_stack);
-
- }
-
- public void showDialog(string panel)
- {
- this.show_all();
- m_stack.set_visible_child_name(panel);
- }
-
- private Gtk.Box setup_UI()
- {
- var feed_settings = headline(_("Feed List:"));
-
- var only_feeds = new SettingSwitch(_("Only show feeds"), Settings.general(), "only-feeds");
- only_feeds.changed.connect(() => {
- Settings.state().set_strv("expanded-categories", Utils.getDefaultExpandedCategories());
- Settings.state().set_string("feedlist-selected-row", "feed -4");
- ColumnView.get_default().newFeedList(true);
- });
-
- var only_unread = new SettingSwitch(_("Only show unread"), Settings.general(), "feedlist-only-show-unread");
- only_unread.changed.connect(() => {
- ColumnView.get_default().newFeedList();
- });
-
- var feedlist_sort = new SettingDropbox(_("Sort FeedList by"), Settings.general(), "feedlist-sort-by", {_("Received"), _("Alphabetically")});
- feedlist_sort.changed.connect(() => {
- ColumnView.get_default().newFeedList();
- });
-
- var feedlist_theme = new SettingDropbox(_("Theme"), Settings.general(), "feedlist-theme", {_("Gtk+"), _("Dark"), _("elementary")});
- feedlist_theme.changed.connect(() => {
- MainWindow.get_default().reloadCSS();
- });
-
- var article_settings = headline(_("Article List:"));
-
- var article_sort = new SettingDropbox(_("Sort articles by"), Settings.general(), "articlelist-sort-by", {_("Received"), _("Date")});
- article_sort.changed.connect(() => {
- ColumnView.get_default().newArticleList();
- });
-
- var newest_first = new SettingSwitch(_("Oldest first"), Settings.general(), "articlelist-oldest-first", _("Only affects \"Unread\" column"));
- newest_first.changed.connect(() => {
- ColumnView.get_default().newArticleList();
- });
-
- var scroll_marked = new SettingSwitch(_("Mark read by scrolling past"), Settings.general(), "articlelist-mark-scrolling");
-
- var articleview_settings = headline(_("Article View:"));
-
- var article_theme = new SettingDropbox(_("Theme"), Settings.general(), "article-theme", {_("Default"), _("Spring"), _("Midnight"), _("Parchment")});
- article_theme.changed.connect(() => {
- ColumnView.get_default().reloadArticleView();
+ switcher.set_halign(Gtk.Align.CENTER);
+ switcher.set_valign(Gtk.Align.CENTER);
+ switcher.set_stack(m_stack);
+
+ m_headerbar.set_custom_title(switcher);
+
+ var content = get_content_area() as Gtk.Box;
+ content.add(m_stack);
+ }
+
+ public void showDialog(string panel)
+ {
+ this.show_all();
+ m_stack.set_visible_child_name(panel);
+ }
+
+ private Gtk.Box setup_UI()
+ {
+ var feed_settings = headline(_("Feed List:"));
+
+ var only_feeds = new SettingSwitch(_("Only show feeds"), Settings.general(), "only-feeds");
+ only_feeds.changed.connect(() => {
+ Settings.state().set_strv("expanded-categories", Utils.getDefaultExpandedCategories());
+ Settings.state().set_string("feedlist-selected-row", "feed -4");
+ ColumnView.get_default().newFeedList(true);
+ });
+
+ var only_unread = new SettingSwitch(_("Only show unread"), Settings.general(), "feedlist-only-show-unread");
+ only_unread.changed.connect(() => {
+ ColumnView.get_default().newFeedList();
+ });
+
+ var feedlist_sort = new SettingDropbox(_("Sort Feed List by"), Settings.general(), "feedlist-sort-by", {_("Received"), _("Alphabetically")});
+ feedlist_sort.changed.connect(() => {
+ ColumnView.get_default().newFeedList();
});
- var fontsize = new SettingDropbox(_("Font Size"), Settings.general(), "fontsize", {_("Small"), _("Normal"), _("Large"), _("Huge")});
- fontsize.changed.connect(() => {
+ var feedlist_theme = new SettingDropbox(_("Theme"), Settings.general(), "feedlist-theme", {_("Gtk+"), _("Dark"), _("elementary")});
+ feedlist_theme.changed.connect(() => {
+ MainWindow.get_default().reloadCSS();
+ });
+
+ var article_settings = headline(_("Article List:"));
+
+ var article_sort = new SettingDropbox(_("Sort articles by"), Settings.general(), "articlelist-sort-by", {_("Received"), _("Date")});
+ article_sort.changed.connect(() => {
+ ColumnView.get_default().newArticleList();
+ });
+
+ var newest_first = new SettingSwitch(_("Oldest first"), Settings.general(), "articlelist-oldest-first", _("Only affects \"Unread\" column"));
+ newest_first.changed.connect(() => {
+ ColumnView.get_default().newArticleList();
+ });
+
+ var scroll_marked = new SettingSwitch(_("Mark read by scrolling past"), Settings.general(), "articlelist-mark-scrolling");
+
+ var articleview_settings = headline(_("Article View:"));
+
+ var article_theme = new SettingDropbox(_("Theme"), Settings.general(), "article-theme", {_("Default"), _("Spring"), _("Midnight"), _("Parchment")});
+ article_theme.changed.connect(() => {
ColumnView.get_default().reloadArticleView();
});
+ var fontfamilly = new SettingFont(_("Font Familly"), Settings.general(), "font");
+ fontfamilly.changed.connect(() => {
+ ColumnView.get_default().reloadArticleView();
+ });
var uiBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 5);
- uiBox.expand = true;
- uiBox.pack_start(feed_settings, false, true, 0);
+ uiBox.expand = true;
+ uiBox.pack_start(feed_settings, false, true, 0);
uiBox.pack_start(only_feeds, false, true, 0);
uiBox.pack_start(only_unread, false, true, 0);
- uiBox.pack_start(feedlist_sort, false, true, 0);
- uiBox.pack_start(feedlist_theme, false, true, 0);
- uiBox.pack_start(article_settings, false, true, 0);
- uiBox.pack_start(article_sort, false, true, 0);
- uiBox.pack_start(newest_first, false, true, 0);
- uiBox.pack_start(scroll_marked, false, true, 0);
- uiBox.pack_start(articleview_settings, false, true, 0);
- uiBox.pack_start(article_theme, false, true, 0);
- uiBox.pack_start(fontsize, false, true, 0);
-
- return uiBox;
- }
-
-
- private Gtk.Box setup_Internal()
- {
+ uiBox.pack_start(feedlist_sort, false, true, 0);
+ uiBox.pack_start(feedlist_theme, false, true, 0);
+ uiBox.pack_start(article_settings, false, true, 0);
+ uiBox.pack_start(article_sort, false, true, 0);
+ uiBox.pack_start(newest_first, false, true, 0);
+ uiBox.pack_start(scroll_marked, false, true, 0);
+ uiBox.pack_start(articleview_settings, false, true, 0);
+ uiBox.pack_start(article_theme, false, true, 0);
+ uiBox.pack_start(fontfamilly, false, true, 0);
+ return uiBox;
+ }
+
+
+ private Gtk.Box setup_Internal()
+ {
var sync_settings = headline(_("Sync:"));
var sync_count = new SettingSpin(_("Number of articles"), Settings.general(), "max-articles", 10, 5000, 10);
- var sync_time = new SettingSpin(_("Every (Minutes)"), Settings.general(), "sync", 5, 600, 5);
+ var sync_time = new SettingSpin(_("Interval in Minutes (0 = OFF)"), Settings.general(), "sync", 5, 600, 5);
sync_time.changed.connect(() => {
- try
- {
- DBusConnection.get_default().scheduleSync(Settings.general().get_int("sync"));
- }
- catch(GLib.Error e)
- {
- Logger.error("SettingsDialog.setup_Internal: scheduleSync %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().scheduleSync(Settings.general().get_int("sync"));
});
var db_settings = headline(_("Database:"));
- var drop_articles = new SettingDropbox(_("Delete articles after"), Settings.general(), "drop-articles-after",
+ var drop_articles = new SettingDropbox(_("Delete articles after"), Settings.general(), "drop-articles-after",
{_("Never"), _("1 Week"), _("1 Month"), _("6 Months")});
var service_settings = headline(_("Additional Functionality:"));
- var grabber = new SettingSwitch(_("Content Grabber"), Settings.general(),"content-grabber");
-
- var mediaplayer = new SettingSwitch(_("Internal Media Player"), Settings.general(),"mediaplayer");
-
-
- var internalsBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 5);
- internalsBox.expand = true;
- internalsBox.pack_start(sync_settings, false, true, 0);
- try
- {
- if(DBusConnection.get_default().useMaxArticles())
- internalsBox.pack_start(sync_count, false, true, 0);
- }
- catch(GLib.Error e)
- {
- Logger.error("SettingsDialog.setup_Internal: useMaxArticles %s".printf(e.message));
- }
- internalsBox.pack_start(sync_time, false, true, 0);
- internalsBox.pack_start(db_settings, false, true, 0);
- internalsBox.pack_start(drop_articles, false, true, 0);
- internalsBox.pack_start(service_settings, false, true, 0);
- internalsBox.pack_start(grabber, false, true, 0);
- internalsBox.pack_start(mediaplayer, false, true, 0);
+ var grabber = new SettingSwitch(_("Content Grabber"), Settings.general(),"content-grabber");
+
+ var images = new SettingSwitch(_("Download Images"), Settings.general(),"download-images");
+
+ var mediaplayer = new SettingSwitch(_("Internal Media Player"), Settings.general(),"mediaplayer");
+
+
+ var internalsBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 5);
+ internalsBox.expand = true;
+ internalsBox.pack_start(sync_settings, false, true, 0);
+ if(FeedReaderBackend.get_default().useMaxArticles())
+ internalsBox.pack_start(sync_count, false, true, 0);
+ internalsBox.pack_start(sync_time, false, true, 0);
+ internalsBox.pack_start(db_settings, false, true, 0);
+ internalsBox.pack_start(drop_articles, false, true, 0);
+ internalsBox.pack_start(service_settings, false, true, 0);
+ internalsBox.pack_start(grabber, false, true, 0);
+ internalsBox.pack_start(images, false, true, 0);
+ internalsBox.pack_start(mediaplayer, false, true, 0);
return internalsBox;
- }
+ }
- private Gtk.Box setup_Service()
- {
+ private Gtk.Box setup_Service()
+ {
m_serviceList = new Gtk.ListBox();
- m_serviceList.set_selection_mode(Gtk.SelectionMode.NONE);
- m_serviceList.set_sort_func(sortFunc);
+ m_serviceList.set_selection_mode(Gtk.SelectionMode.NONE);
+ m_serviceList.set_sort_func(sortFunc);
- m_errorBar = new InfoBar("");
+ m_errorBar = new InfoBar("");
- var service_scroll = new Gtk.ScrolledWindow(null, null);
- service_scroll.expand = true;
+ var service_scroll = new Gtk.ScrolledWindow(null, null);
+ service_scroll.expand = true;
- var overlay = new Gtk.Overlay();
- overlay.add(service_scroll);
- overlay.add_overlay(m_errorBar);
- overlay.margin_top = 10;
- overlay.margin_bottom = 10;
+ var overlay = new Gtk.Overlay();
+ overlay.add(service_scroll);
+ overlay.add_overlay(m_errorBar);
+ overlay.margin_top = 10;
+ overlay.margin_bottom = 10;
- var viewport = new Gtk.Viewport(null, null);
- viewport.get_style_context().add_class("servicebox");
- viewport.add(m_serviceList);
- service_scroll.add(viewport);
+ var viewport = new Gtk.Viewport(null, null);
+ viewport.get_style_context().add_class("servicebox");
+ viewport.add(m_serviceList);
+ service_scroll.add(viewport);
- refreshAccounts();
+ refreshAccounts();
- var serviceBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 5);
- serviceBox.expand = true;
- serviceBox.pack_start(overlay, false, true, 0);
+ var serviceBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 5);
+ serviceBox.expand = true;
+ serviceBox.pack_start(overlay, false, true, 0);
- return serviceBox;
- }
+ return serviceBox;
+ }
- public void refreshAccounts()
+ public void refreshAccounts()
{
- m_serviceList.set_header_func(null);
+ m_serviceList.set_header_func(null);
var children = m_serviceList.get_children();
foreach(Gtk.Widget row in children)
{
@@ -230,32 +219,32 @@ public class FeedReader.SettingsDialog : Gtk.Dialog {
row.destroy();
}
- var list = Share.get_default().getAccounts();
-
- foreach(var account in list)
- {
- if(account.isSystemAccount())
- {
- ServiceSetup row = Share.get_default().newSystemAccount(account.getID());
- m_serviceList.add(row);
- row.reveal(false);
- }
- else if(Share.get_default().needSetup(account.getID()))
- {
- ServiceSetup row = Share.get_default().newSetup_withID(account.getID());
- row.removeRow.connect(() => {
- removeRow(row, m_serviceList);
- });
- m_serviceList.add(row);
- row.reveal(false);
- }
- }
-
- var addAccount = new Gtk.Button.from_icon_name("list-add-symbolic", Gtk.IconSize.DND);
- addAccount.set_relief(Gtk.ReliefStyle.NONE);
- addAccount.get_style_context().add_class("addServiceButton");
- addAccount.set_size_request(0, 48);
- addAccount.show();
+ var list = Share.get_default().getAccounts();
+
+ foreach(var account in list)
+ {
+ if(account.isSystemAccount())
+ {
+ ServiceSetup row = Share.get_default().newSystemAccount(account.getID());
+ m_serviceList.add(row);
+ row.reveal(false);
+ }
+ else if(Share.get_default().needSetup(account.getID()))
+ {
+ ServiceSetup row = Share.get_default().newSetup_withID(account.getID());
+ row.removeRow.connect(() => {
+ removeRow(row, m_serviceList);
+ });
+ m_serviceList.add(row);
+ row.reveal(false);
+ }
+ }
+
+ var addAccount = new Gtk.Button.from_icon_name("list-add-symbolic", Gtk.IconSize.DND);
+ addAccount.set_relief(Gtk.ReliefStyle.NONE);
+ addAccount.get_style_context().add_class("addServiceButton");
+ addAccount.set_size_request(0, 48);
+ addAccount.show();
m_serviceList.add(addAccount);
addAccount.clicked.connect(() => {
@@ -272,61 +261,60 @@ public class FeedReader.SettingsDialog : Gtk.Dialog {
var popover = new ServiceSettingsPopover(addAccount);
popover.newAccount.connect((type) => {
- ServiceSetup row = Share.get_default().newSetup(type);
- row.showInfoBar.connect((text) => {
- Logger.debug("test ABC 123");
- m_errorBar.setText(text);
- m_errorBar.reveal();
- });
- row.removeRow.connect(() => {
- removeRow(row, m_serviceList);
- });
- m_serviceList.add(row);
- row.reveal();
+ ServiceSetup row = Share.get_default().newSetup(type);
+ row.showInfoBar.connect((text) => {
+ m_errorBar.setText(text);
+ m_errorBar.reveal();
+ });
+ row.removeRow.connect(() => {
+ removeRow(row, m_serviceList);
+ });
+ m_serviceList.add(row);
+ row.reveal();
});
});
- m_serviceList.set_header_func(headerFunc);
+ m_serviceList.set_header_func(headerFunc);
}
- public void removeRow(ServiceSetup row, Gtk.ListBox list)
+ public void removeRow(ServiceSetup row, Gtk.ListBox list)
{
row.unreveal();
GLib.Timeout.add(700, () => {
- list.remove(row);
+ list.remove(row);
return false;
});
}
- private int sortFunc(Gtk.ListBoxRow row1, Gtk.ListBoxRow row2)
+ private int sortFunc(Gtk.ListBoxRow row1, Gtk.ListBoxRow row2)
{
var r1 = row1 as ServiceSetup;
var r2 = row2 as ServiceSetup;
- if(r1 == null && r2 == null)
- return 0;
- else if(r1 == null)
- return 1;
- else if(r2 == null)
- return -1;
-
- if(r1.getUserName() == ""
- && r2.getUserName() == "")
- return 0;
- else if(r1.getUserName() == "")
- return 1;
- else if(r2.getUserName() == "")
- return -1;
+ if(r1 == null && r2 == null)
+ return 0;
+ else if(r1 == null)
+ return 1;
+ else if(r2 == null)
+ return -1;
+
+ if(r1.getUserName() == ""
+ && r2.getUserName() == "")
+ return 0;
+ else if(r1.getUserName() == "")
+ return 1;
+ else if(r2.getUserName() == "")
+ return -1;
bool sys1 = r1.isSystemAccount();
bool sys2 = r2.isSystemAccount();
if(sys1 && sys2)
- return 0;
- else if(sys1)
- return -1;
+ return 0;
+ else if(sys1)
+ return -1;
- return 1;
+ return 1;
}
private void headerFunc(Gtk.ListBoxRow row, Gtk.ListBoxRow? before)
@@ -341,49 +329,49 @@ public class FeedReader.SettingsDialog : Gtk.Dialog {
box.pack_end(new Gtk.Separator(Gtk.Orientation.HORIZONTAL), false, false, 0);
box.show_all();
- var r1 = row as ServiceSetup;
+ var r1 = row as ServiceSetup;
- // this is the plus-button
- if(r1 == null)
- return;
+ // this is the plus-button
+ if(r1 == null)
+ return;
- bool sys1 = r1.isSystemAccount();
+ bool sys1 = r1.isSystemAccount();
- if(before == null)
- {
- if(sys1)
- {
- row.set_header(box);
- return;
- }
- else
- {
- label.set_text(_("FeedReader Accounts"));
- row.set_header(box);
- return;
- }
- }
+ if(before == null)
+ {
+ if(sys1)
+ {
+ row.set_header(box);
+ return;
+ }
+ else
+ {
+ label.set_text(_("FeedReader Accounts"));
+ row.set_header(box);
+ return;
+ }
+ }
var r2 = before as ServiceSetup;
- bool sys2 = r2.isSystemAccount();
-
- if(r1 != null && r2 != null)
- {
- if(!sys1 && sys2)
- {
- label.set_text(_("FeedReader Accounts"));
- row.set_header(box);
- }
- }
+ bool sys2 = r2.isSystemAccount();
+
+ if(r1 != null && r2 != null)
+ {
+ if(!sys1 && sys2)
+ {
+ label.set_text(_("FeedReader Accounts"));
+ row.set_header(box);
+ }
+ }
}
- private Gtk.Label headline(string name)
- {
- var headline = new Gtk.Label(name);
- headline.margin_top = 15;
- headline.set_alignment(0, 0.5f);
- headline.get_style_context().add_class("bold");
- return headline;
- }
+ private Gtk.Label headline(string name)
+ {
+ var headline = new Gtk.Label(name);
+ headline.margin_top = 15;
+ headline.set_alignment(0, 0.5f);
+ headline.get_style_context().add_class("bold");
+ return headline;
+ }
}
diff --git a/src/Widgets/SharePopover.vala b/src/Widgets/SharePopover.vala
index f22296cf..d272c5ea 100644
--- a/src/Widgets/SharePopover.vala
+++ b/src/Widgets/SharePopover.vala
@@ -22,11 +22,11 @@ public class FeedReader.SharePopover : Gtk.Popover {
public SharePopover(Gtk.Widget widget)
{
- m_list = new Gtk.ListBox();
- m_list.margin = 10;
- m_list.set_selection_mode(Gtk.SelectionMode.NONE);
- m_list.row_activated.connect(clicked);
- refreshList();
+ m_list = new Gtk.ListBox();
+ m_list.margin = 10;
+ m_list.set_selection_mode(Gtk.SelectionMode.NONE);
+ m_list.row_activated.connect(clicked);
+ refreshList();
m_stack = new Gtk.Stack();
m_stack.set_transition_duration(150);
m_stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT);
@@ -36,11 +36,11 @@ public class FeedReader.SharePopover : Gtk.Popover {
this.set_modal(true);
this.set_relative_to(widget);
this.set_position(Gtk.PositionType.BOTTOM);
- this.show_all();
+ this.show_all();
}
- public void refreshList()
- {
+ public void refreshList()
+ {
var children = m_list.get_children();
foreach(Gtk.Widget row in children)
{
@@ -48,12 +48,12 @@ public class FeedReader.SharePopover : Gtk.Popover {
row.destroy();
}
- var list = Share.get_default().getAccounts();
+ var list = Share.get_default().getAccounts();
- foreach(var account in list)
- {
- m_list.add(new ShareRow(account.getType(), account.getID(), account.getUsername(), account.getIconName()));
- }
+ foreach(var account in list)
+ {
+ m_list.add(new ShareRow(account.getType(), account.getID(), account.getUsername(), account.getIconName()));
+ }
var addRow = new Gtk.ListBoxRow();
addRow.margin = 2;
@@ -61,20 +61,20 @@ public class FeedReader.SharePopover : Gtk.Popover {
var addIcon = new Gtk.Image.from_icon_name("list-add-symbolic", Gtk.IconSize.DND);
var addLabel = new Gtk.Label(_("Add accounts"));
addLabel.set_line_wrap_mode(Pango.WrapMode.WORD);
- addLabel.set_ellipsize(Pango.EllipsizeMode.END);
- addLabel.set_alignment(0.0f, 0.5f);
- addLabel.get_style_context().add_class("h4");
+ addLabel.set_ellipsize(Pango.EllipsizeMode.END);
+ addLabel.set_alignment(0.0f, 0.5f);
+ addLabel.get_style_context().add_class("h4");
var addBox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 5);
addBox.margin = 3;
- addBox.pack_start(addIcon, false, false, 8);
- addBox.pack_start(addLabel, true, true, 0);
+ addBox.pack_start(addIcon, false, false, 8);
+ addBox.pack_start(addLabel, true, true, 0);
if(list.size > 0)
{
var seperatorBox = new Gtk.Box(Gtk.Orientation.VERTICAL, 5);
seperatorBox.pack_start(new Gtk.Separator(Gtk.Orientation.HORIZONTAL), false, false, 0);
- seperatorBox.pack_start(addBox, true, true, 0);
+ seperatorBox.pack_start(addBox, true, true, 0);
addRow.add(seperatorBox);
}
else
@@ -84,11 +84,11 @@ public class FeedReader.SharePopover : Gtk.Popover {
addRow.show_all();
m_list.add(addRow);
- }
+ }
- private void clicked(Gtk.ListBoxRow row)
- {
- ShareRow? shareRow = row as ShareRow;
+ private void clicked(Gtk.ListBoxRow row)
+ {
+ ShareRow? shareRow = row as ShareRow;
if(shareRow == null)
{
@@ -98,26 +98,29 @@ public class FeedReader.SharePopover : Gtk.Popover {
return;
}
- string url = "";
- string id = shareRow.getID();
+ string id = shareRow.getID();
+ Article? selectedArticle = ColumnView.get_default().getSelectedArticle();
- url = ColumnView.get_default().getSelectedURL();
- var widget = Share.get_default().shareWidget(shareRow.getType(), url);
- if(widget == null)
- shareURL(id, url);
- else
+ if(selectedArticle != null)
{
- m_stack.add_named(widget, "form");
- m_stack.set_visible_child_name("form");
- widget.share.connect_after(() => {
- shareURL(id, url);
- });
- widget.goBack.connect(() => {
- m_stack.set_visible_child_full("list", Gtk.StackTransitionType.SLIDE_RIGHT);
- m_stack.remove(widget);
- });
+ var widget = Share.get_default().shareWidget(shareRow.getType(), selectedArticle.getURL());
+ if(widget == null)
+ shareURL(id, selectedArticle.getURL());
+ else
+ {
+ m_stack.add_named(widget, "form");
+ m_stack.set_visible_child_name("form");
+ widget.share.connect_after(() => {
+ shareURL(id, selectedArticle.getURL());
+ });
+ widget.goBack.connect(() => {
+ m_stack.set_visible_child_full("list", Gtk.StackTransitionType.SLIDE_RIGHT);
+ m_stack.remove(widget);
+ });
+ }
}
- }
+
+ }
private async void shareAsync(string id, string url)
{
@@ -139,7 +142,7 @@ public class FeedReader.SharePopover : Gtk.Popover {
shareDone();
});
string idString = (id == null || id == "") ? "" : @" to $id";
- Logger.debug(@"bookmark: $url$idString");
+ Logger.debug(@"bookmark: $url$idString");
}
}
diff --git a/src/Widgets/ShareRow.vala b/src/Widgets/ShareRow.vala
index 8910e21f..b900f0f2 100644
--- a/src/Widgets/ShareRow.vala
+++ b/src/Widgets/ShareRow.vala
@@ -15,39 +15,39 @@
public class FeedReader.ShareRow : Gtk.ListBoxRow {
- private string m_id;
- private string m_type;
+ private string m_id;
+ private string m_type;
public ShareRow(string type, string id, string username, string iconName)
{
m_id = id;
- m_type = type;
- var icon = new Gtk.Image.from_icon_name(iconName, Gtk.IconSize.DND);
- icon.set_size_request(32, 32);
- var serviceLabel = new Gtk.Label(username);
- serviceLabel.set_line_wrap_mode(Pango.WrapMode.WORD);
- serviceLabel.set_ellipsize(Pango.EllipsizeMode.END);
- serviceLabel.set_alignment(0.0f, 0.5f);
- serviceLabel.get_style_context().add_class("h4");
+ m_type = type;
+ var icon = new Gtk.Image.from_icon_name(iconName, Gtk.IconSize.DND);
+ icon.set_size_request(32, 32);
+ var serviceLabel = new Gtk.Label(username);
+ serviceLabel.set_line_wrap_mode(Pango.WrapMode.WORD);
+ serviceLabel.set_ellipsize(Pango.EllipsizeMode.END);
+ serviceLabel.set_alignment(0.0f, 0.5f);
+ serviceLabel.get_style_context().add_class("h4");
var box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
- box.margin = 3;
- box.pack_start(icon, false, false, 8);
- box.pack_start(serviceLabel, true, true, 0);
+ box.margin = 3;
+ box.pack_start(icon, false, false, 8);
+ box.pack_start(serviceLabel, true, true, 0);
this.add(box);
this.margin = 2;
this.show_all();
}
- public string getID()
- {
- return m_id;
- }
+ public string getID()
+ {
+ return m_id;
+ }
- public string getType()
- {
- return m_type;
- }
+ public string getType()
+ {
+ return m_type;
+ }
}
diff --git a/src/Widgets/ShortcutsWindow.vala b/src/Widgets/ShortcutsWindow.vala
index 0999b544..4cea7ba1 100644
--- a/src/Widgets/ShortcutsWindow.vala
+++ b/src/Widgets/ShortcutsWindow.vala
@@ -61,8 +61,8 @@ public class FeedReader.ShortcutsWindow : Gtk.ShortcutsWindow {
string toggleMarked = Settings.keybindings().get_string("articlelist-toggle-marked");
string openUrl = Settings.keybindings().get_string("articlelist-open-url");
var nextprev = newShortcut(_("Select next/previous article"), nextPrev);
- var toggleread = newShortcut(_("Toggle the selected article un/read"), toggleRead);
- var togglemarked = newShortcut(_("Toggle the selected article un/marked"), toggleMarked);
+ var toggleread = newShortcut(_("Toggle reading status of selected article"), toggleRead);
+ var togglemarked = newShortcut(_("Toggle marking of selected article"), toggleMarked);
var openURL = newShortcut(_("Open the URL of the selected article"), openUrl);
var upDown = newShortcut(_("Scroll all the way up/down"), "Page_Up Page_Down");
var centerSelected = newShortcut(_("Center the currently selected article"), center);
diff --git a/src/Widgets/TagPopover.vala b/src/Widgets/TagPopover.vala
index 437c0a02..60c117ae 100644
--- a/src/Widgets/TagPopover.vala
+++ b/src/Widgets/TagPopover.vala
@@ -20,14 +20,23 @@ public class FeedReader.TagPopover : Gtk.Popover {
private Gtk.Viewport m_viewport;
private Gtk.Entry m_entry;
private Gtk.Stack m_stack;
- private Gee.ArrayList<tag> m_tags;
+ private Gee.List<Tag> m_tags;
private Gtk.EntryCompletion m_complete;
- private Gee.ArrayList<tag> m_availableTags;
+ private Gee.List<Tag> m_availableTags;
public TagPopover(Gtk.Widget widget)
{
- m_availableTags = new Gee.ArrayList<tag>();
- m_tags = ColumnView.get_default().getSelectedArticleTags();
+ m_availableTags = new Gee.ArrayList<Tag>();
+ m_tags = new Gee.ArrayList<Tag>();
+ Article? selectedArticle = ColumnView.get_default().getSelectedArticle();
+ if(selectedArticle != null)
+ {
+ Gee.List<string> tagIDs = selectedArticle.getTagIDs();
+ foreach(string tagID in tagIDs)
+ {
+ m_tags.add(DataBase.readOnly().read_tag(tagID));
+ }
+ }
m_stack = new Gtk.Stack();
m_stack.set_transition_type(Gtk.StackTransitionType.NONE);
@@ -79,9 +88,9 @@ public class FeedReader.TagPopover : Gtk.Popover {
private void populateList()
{
- foreach(tag Tag in m_tags)
+ foreach(Tag t in m_tags)
{
- var row = new TagPopoverRow(Tag);
+ var row = new TagPopoverRow(t);
row.remove_tag.connect(removeTag);
m_list.add(row);
}
@@ -97,23 +106,23 @@ public class FeedReader.TagPopover : Gtk.Popover {
m_complete.set_text_column(0);
Gtk.TreeIter iter;
- var tags = dbUI.get_default().read_tags();
+ var tags = DataBase.readOnly().read_tags();
- foreach(tag Tag in tags)
+ foreach(Tag tag in tags)
{
bool alreadyHasTag = false;
- foreach(tag Tag2 in m_tags)
+ foreach(Tag tag2 in m_tags)
{
- if(Tag2.getTitle() == Tag.getTitle())
+ if(tag2.getTitle() == tag.getTitle())
alreadyHasTag = true;
}
if(!alreadyHasTag)
{
list_store.append(out iter);
- list_store.set(iter, 0, Tag.getTitle());
- m_availableTags.add(Tag);
+ list_store.set(iter, 0, tag.getTitle());
+ m_availableTags.add(tag);
}
}
}
@@ -135,11 +144,11 @@ public class FeedReader.TagPopover : Gtk.Popover {
if(str == "")
return;
bool available = false;
- string tagID = "";
+ Tag? selectedTag = null;
- foreach(tag Tag in m_tags)
+ foreach(Tag tag in m_tags)
{
- if(str == Tag.getTitle())
+ if(str == tag.getTitle())
{
Logger.debug("TagPopover: article already tagged");
m_entry.set_text("");
@@ -147,34 +156,26 @@ public class FeedReader.TagPopover : Gtk.Popover {
}
}
- foreach(tag Tag in m_availableTags)
+ foreach(Tag tag in m_availableTags)
{
- if(str == Tag.getTitle())
+ if(str == tag.getTitle())
{
Logger.debug("TagPopover: tag available");
- tagID = Tag.getTagID();
+ selectedTag = tag;
available = true;
break;
}
}
- try
- {
- if(!available)
- {
- tagID = DBusConnection.get_default().createTag(str);
- Logger.debug("TagPopover: " + str + " created with id " + tagID);
- }
- DBusConnection.get_default().tagArticle(getActiveArticleID(), tagID, true);
- }
- catch(GLib.Error e)
+ if(!available)
{
- Logger.error("TagPopover.setupEntry: %s".printf(e.message));
+ selectedTag = FeedReaderBackend.get_default().createTag(str);
+ Logger.debug("TagPopover: %s created with id %s".printf(str, selectedTag.getTagID()));
}
+ FeedReaderBackend.get_default().tagArticle(getActiveArticleID(), selectedTag, true);
- var new_tag = dbUI.get_default().read_tag(tagID);
- var row = new TagPopoverRow(new_tag);
+ var row = new TagPopoverRow(selectedTag);
row.remove_tag.connect(removeTag);
m_list.add(row);
m_stack.set_visible_child_name("tags");
@@ -186,21 +187,14 @@ public class FeedReader.TagPopover : Gtk.Popover {
private void removeTag(TagPopoverRow row)
{
- try
- {
- DBusConnection.get_default().tagArticle(getActiveArticleID(), row.getTagID(), false);
- m_list.remove(row);
- }
- catch(GLib.Error e)
- {
- Logger.error("TagPopover.removeTag: %s".printf(e.message));
- }
+ FeedReaderBackend.get_default().tagArticle(getActiveArticleID(), row.getTag(), false);
+ m_list.remove(row);
- foreach(tag Tag in m_tags)
+ foreach(Tag tag in m_tags)
{
- if(Tag.getTagID() == row.getTagID())
+ if(tag.getTagID() == row.getTagID())
{
- m_tags.remove(Tag);
+ m_tags.remove(tag);
break;
}
}
@@ -214,7 +208,7 @@ public class FeedReader.TagPopover : Gtk.Popover {
ColumnView.get_default().removeTagFromSelectedRow(row.getTagID());
}
- private string getActiveArticleID()
+ private Article getActiveArticleID()
{
return ColumnView.get_default().getSelectedArticle();
}
diff --git a/src/Widgets/TagPopoverRow.vala b/src/Widgets/TagPopoverRow.vala
index c510528b..4b659f8d 100644
--- a/src/Widgets/TagPopoverRow.vala
+++ b/src/Widgets/TagPopoverRow.vala
@@ -15,77 +15,77 @@
public class FeedReader.TagPopoverRow : Gtk.ListBoxRow {
- private Gtk.Revealer m_revealer;
- private Gtk.Box m_box;
- private tag m_tag;
- private Gtk.Image m_clear;
- private Gtk.EventBox m_eventbox;
- public signal void remove_tag(TagPopoverRow row);
+ private Gtk.Revealer m_revealer;
+ private Gtk.Box m_box;
+ private Tag m_tag;
+ private Gtk.Image m_clear;
+ private Gtk.EventBox m_eventbox;
+ public signal void remove_tag(TagPopoverRow row);
- public TagPopoverRow(tag Tag)
- {
- m_tag = Tag;
- m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
- var circle = new ColorCircle(Tag.getColor(), false);
- circle.margin_start = 2;
- circle.margin_end = 3;
- var label = new Gtk.Label(Tag.getTitle());
- label.set_alignment(0, 0.5f);
- m_clear = new Gtk.Image.from_icon_name("edit-clear-symbolic", Gtk.IconSize.MENU);
- m_clear.margin_end = 5;
- m_clear.opacity = 0.7;
+ public TagPopoverRow(Tag tag)
+ {
+ m_tag = tag;
+ m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+ var circle = new ColorCircle(tag.getColor(), false);
+ circle.margin_start = 2;
+ circle.margin_end = 3;
+ var label = new Gtk.Label(tag.getTitle());
+ label.set_alignment(0, 0.5f);
+ m_clear = new Gtk.Image.from_icon_name("edit-clear-symbolic", Gtk.IconSize.MENU);
+ m_clear.margin_end = 5;
+ m_clear.opacity = 0.7;
- m_eventbox = new Gtk.EventBox();
+ m_eventbox = new Gtk.EventBox();
m_eventbox.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
m_eventbox.set_events(Gdk.EventMask.LEAVE_NOTIFY_MASK);
- m_eventbox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK);
+ m_eventbox.set_events(Gdk.EventMask.BUTTON_PRESS_MASK);
m_eventbox.enter_notify_event.connect(onEnter);
m_eventbox.leave_notify_event.connect(onLeave);
- m_eventbox.button_press_event.connect(onClick);
+ m_eventbox.button_press_event.connect(onClick);
m_eventbox.add(m_clear);
- m_box.pack_start(circle, false, false, 0);
- m_box.pack_start(label, true, true, 0);
- m_box.pack_end(m_eventbox, false, false, 0);
+ m_box.pack_start(circle, false, false, 0);
+ m_box.pack_start(label, true, true, 0);
+ m_box.pack_end(m_eventbox, false, false, 0);
- m_revealer = new Gtk.Revealer();
+ m_revealer = new Gtk.Revealer();
m_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
- m_revealer.set_transition_duration(150);
+ m_revealer.set_transition_duration(150);
m_revealer.add(m_box);
m_revealer.set_reveal_child(true);
- this.add(m_revealer);
- this.margin_top = 1;
- this.margin_bottom = 1;
- this.show_all();
- }
+ this.add(m_revealer);
+ this.margin_top = 1;
+ this.margin_bottom = 1;
+ this.show_all();
+ }
- private bool onEnter()
- {
- m_clear.opacity = 1.0;
- return false;
- }
+ private bool onEnter()
+ {
+ m_clear.opacity = 1.0;
+ return false;
+ }
- private bool onLeave()
- {
- m_clear.opacity = 0.7;
- return false;
- }
+ private bool onLeave()
+ {
+ m_clear.opacity = 0.7;
+ return false;
+ }
- private bool onClick()
- {
- m_revealer.set_reveal_child(false);
- remove_tag(this);
- return false;
- }
+ private bool onClick()
+ {
+ m_revealer.set_reveal_child(false);
+ remove_tag(this);
+ return false;
+ }
- public string getTagID()
- {
- return m_tag.getTagID();
- }
+ public string getTagID()
+ {
+ return m_tag.getTagID();
+ }
- public tag getTag()
- {
- return m_tag;
- }
+ public Tag getTag()
+ {
+ return m_tag;
+ }
}
diff --git a/src/Widgets/TagRow.vala b/src/Widgets/TagRow.vala
index 9b7272da..d4b75cc5 100644
--- a/src/Widgets/TagRow.vala
+++ b/src/Widgets/TagRow.vala
@@ -19,29 +19,27 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
private Gtk.Label m_label;
private bool m_exits;
private string m_catID;
- private int m_color;
private ColorCircle m_circle;
private ColorPopover m_pop;
private Gtk.Revealer m_revealer;
private Gtk.EventBox m_eventBox;
- public string m_name { get; private set; }
- public string m_tagID { get; private set; }
+ public string m_name;
+ public Tag m_tag;
public signal void moveUP();
public signal void removeRow();
- public TagRow (string name, string tagID, int color)
+ public TagRow (Tag tag)
{
+ m_tag = tag;
this.get_style_context().add_class("fr-sidebar-row");
m_exits = true;
- m_color = color;
- m_name = name.replace("&","&amp;");
- m_tagID = tagID;
+ m_name = m_tag.getTitle().replace("&","&amp;");
m_catID = CategoryID.TAGS.to_string();
var rowhight = 30;
m_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
- m_circle = new ColorCircle(m_color);
+ m_circle = new ColorCircle(m_tag.getColor());
m_circle.margin_start = 24;
m_pop = new ColorPopover(m_circle);
@@ -51,14 +49,8 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
m_pop.newColorSelected.connect((color) => {
m_circle.newColor(color);
- try
- {
- DBusConnection.get_default().updateTagColor(m_tagID, color);
- }
- catch(GLib.Error e)
- {
- Logger.error("TagRow.constructor: %s".printf(e.message));
- }
+ m_tag.setColor(color);
+ FeedReaderBackend.get_default().updateTagColor(m_tag);
});
m_label = new Gtk.Label(m_name);
@@ -83,78 +75,74 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
this.add(m_eventBox);
this.show_all();
- if(UtilsUI.canManipulateContent())
+ if(Utils.canManipulateContent())
{
const Gtk.TargetEntry[] accepted_targets = {
- { "STRING", 0, DragTarget.TAG }
+ { "STRING", 0, DragTarget.TAG }
};
- Gtk.drag_dest_set (
- this,
- Gtk.DestDefaults.MOTION,
- accepted_targets,
- Gdk.DragAction.COPY
- );
-
- this.drag_motion.connect(onDragMotion);
- this.drag_leave.connect(onDragLeave);
- this.drag_drop.connect(onDragDrop);
- this.drag_data_received.connect(onDragDataReceived);
+ Gtk.drag_dest_set (
+ this,
+ Gtk.DestDefaults.MOTION,
+ accepted_targets,
+ Gdk.DragAction.COPY
+ );
+
+ this.drag_motion.connect(onDragMotion);
+ this.drag_leave.connect(onDragLeave);
+ this.drag_drop.connect(onDragDrop);
+ this.drag_data_received.connect(onDragDataReceived);
}
}
private bool onDragMotion(Gtk.Widget widget, Gdk.DragContext context, int x, int y, uint time)
- {
+ {
this.set_state_flags(Gtk.StateFlags.PRELIGHT, false);
- return false;
- }
+ return false;
+ }
private void onDragLeave(Gtk.Widget widget, Gdk.DragContext context, uint time)
{
- this.unset_state_flags(Gtk.StateFlags.PRELIGHT);
- }
+ this.unset_state_flags(Gtk.StateFlags.PRELIGHT);
+ }
private bool onDragDrop(Gtk.Widget widget, Gdk.DragContext context, int x, int y, uint time)
- {
- // If the source offers a target
- if(context.list_targets() != null)
+ {
+ // If the source offers a target
+ if(context.list_targets() != null)
{
- var target_type = (Gdk.Atom)context.list_targets().nth_data(0);
+ var target_type = (Gdk.Atom)context.list_targets().nth_data(0);
- // Request the data from the source.
- Gtk.drag_get_data(widget, context, target_type, time);
+ // Request the data from the source.
+ Gtk.drag_get_data(widget, context, target_type, time);
return true;
- }
+ }
return false;
- }
+ }
private void onDragDataReceived(Gtk.Widget widget, Gdk.DragContext context, int x, int y,
- Gtk.SelectionData selection_data, uint target_type, uint time)
- {
- try
+ Gtk.SelectionData selection_data, uint target_type, uint time)
+ {
+ if(selection_data != null
+ && selection_data.get_length() >= 0
+ && target_type == DragTarget.TAG)
{
- if(selection_data != null
- && selection_data.get_length() >= 0
- && target_type == DragTarget.TAG)
+ string articleID = (string)selection_data.get_data();
+ Article article = DataBase.readOnly().read_article(articleID);
+ Logger.debug(@"drag articleID: $articleID");
+
+ if(m_tag.getTagID() != TagID.NEW)
{
- if(m_tagID != TagID.NEW)
- {
- Logger.debug("drag articleID: " + (string)selection_data.get_data());
- DBusConnection.get_default().tagArticle((string)selection_data.get_data(), m_tagID, true);
- Gtk.drag_finish(context, true, false, time);
- }
- else
- {
- showRenamePopover(context, time, (string)selection_data.get_data());
- }
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("TagRow.constructor: %s".printf(e.message));
+ FeedReaderBackend.get_default().tagArticle(article, m_tag, true);
+ Gtk.drag_finish(context, true, false, time);
+ }
+ else
+ {
+ showRenamePopover(context, time, article);
+ }
}
- }
+ }
private bool onClick(Gdk.EventButton event)
{
@@ -162,7 +150,7 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
if(event.button != 3)
return false;
- if(!UtilsUI.canManipulateContent())
+ if(!Utils.canManipulateContent())
return false;
switch(event.type)
@@ -185,8 +173,7 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
var notification = MainWindow.get_default().showNotification(text);
ulong eventID = notification.dismissed.connect(() => {
Logger.debug("TagRow: delete Tag");
- try{DBusConnection.get_default().deleteTag(m_tagID);}
- catch(GLib.Error e){Logger.error("TagRow.remove_action: %s".printf(e.message));}
+ FeedReaderBackend.get_default().deleteTag(m_tag);
});
notification.action.connect(() => {
notification.disconnect(eventID);
@@ -225,9 +212,9 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
m_label.set_use_markup (true);
}
- public string getID()
+ public Tag getTag()
{
- return m_tagID;
+ return m_tag;
}
public void setExits(bool subscribed)
@@ -247,28 +234,17 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
public void reveal(bool reveal, uint duration = 500)
{
- if(Settings.state().get_boolean("no-animations"))
- {
- m_revealer.set_transition_type(Gtk.RevealerTransitionType.NONE);
- m_revealer.set_transition_duration(0);
- m_revealer.set_reveal_child(reveal);
- m_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN);
- m_revealer.set_transition_duration(500);
- }
- else
- {
- m_revealer.set_transition_duration(duration);
- m_revealer.set_reveal_child(reveal);
- }
+ m_revealer.set_transition_duration(duration);
+ m_revealer.set_reveal_child(reveal);
}
- private void showRenamePopover(Gdk.DragContext? context = null, uint time = 0, string? articleID = null)
+ private void showRenamePopover(Gdk.DragContext? context = null, uint time = 0, Article? article = null)
{
var popRename = new Gtk.Popover(this);
popRename.set_position(Gtk.PositionType.BOTTOM);
popRename.closed.connect(() => {
this.unset_state_flags(Gtk.StateFlags.PRELIGHT);
- if(m_tagID == TagID.NEW && context != null)
+ if(m_tag.getTagID() == TagID.NEW && context != null)
{
Logger.debug("TagRow: cancel drag");
Gtk.drag_finish(context, false, false, time);
@@ -278,37 +254,23 @@ public class FeedReader.TagRow : Gtk.ListBoxRow {
var renameEntry = new Gtk.Entry();
renameEntry.set_text(m_name);
renameEntry.activate.connect(() => {
- if(m_tagID != TagID.NEW)
+ if(m_tag.getTagID() != TagID.NEW)
{
popRename.hide();
- try
- {
- DBusConnection.get_default().renameTag(m_tagID, renameEntry.get_text());
- }
- catch(GLib.Error e)
- {
- Logger.error("TagRow.showRenamePopover: %s".printf(e.message));
- }
+ m_tag = FeedReaderBackend.get_default().renameTag(m_tag, renameEntry.get_text());
}
else if(context != null)
{
- try
- {
- m_tagID = DBusConnection.get_default().createTag(renameEntry.get_text());
- popRename.hide();
- DBusConnection.get_default().tagArticle(articleID, m_tagID, true);
- Gtk.drag_finish(context, true, false, time);
- }
- catch(GLib.Error e)
- {
- Logger.error("TagRow.showRenamePopover: %s".printf(e.message));
- }
+ m_tag = FeedReaderBackend.get_default().createTag(renameEntry.get_text());
+ popRename.hide();
+ FeedReaderBackend.get_default().tagArticle(article, m_tag, true);
+ Gtk.drag_finish(context, true, false, time);
}
});
string label = _("rename");
- if(m_tagID == TagID.NEW && context != null)
+ if(m_tag.getTagID() == TagID.NEW && context != null)
label = _("add");
var renameButton = new Gtk.Button.with_label(label);
diff --git a/src/Widgets/UpdateButton.vala b/src/Widgets/UpdateButton.vala
index 035d7b22..d7b827c2 100644
--- a/src/Widgets/UpdateButton.vala
+++ b/src/Widgets/UpdateButton.vala
@@ -19,21 +19,29 @@ public class FeedReader.UpdateButton : Gtk.Button {
private Gtk.Spinner m_spinner;
private bool m_status;
private Gtk.Stack m_stack;
+ private Gtk.Label m_ProgressText;
+ private bool m_hasPopup;
+ private bool m_isCancellable;
+ private Gtk.Popover m_Popover;
+ private string m_tooltip;
- public UpdateButton.from_icon_name(string iconname, string tooltip)
+ public UpdateButton.from_icon_name(string iconname, string tooltip, bool progressPopup = false, bool cancellable = false)
{
m_icon = new Gtk.Image.from_icon_name(iconname, Gtk.IconSize.SMALL_TOOLBAR);
- setup(tooltip);
+ setup(tooltip, cancellable, progressPopup);
}
- public UpdateButton.from_resource(string iconname, string tooltip)
+ public UpdateButton.from_resource(string iconname, string tooltip, bool progressPopup = false, bool cancellable = false)
{
m_icon = new Gtk.Image.from_resource(iconname);
- setup(tooltip);
+ setup(tooltip, cancellable, progressPopup);
}
- private void setup(string tooltip)
+ private void setup(string tooltip, bool progressPopup, bool cancellable)
{
+ m_hasPopup = progressPopup;
+ m_isCancellable = cancellable;
+ m_tooltip = tooltip;
m_spinner = new Gtk.Spinner();
m_spinner.set_size_request(16,16);
@@ -43,8 +51,18 @@ public class FeedReader.UpdateButton : Gtk.Button {
m_stack.add_named(m_spinner, "spinner");
m_stack.add_named(m_icon, "icon");
+ if(m_hasPopup)
+ {
+ m_ProgressText = new Gtk.Label(Settings.state().get_string("sync-status"));
+ m_ProgressText.margin = 20;
+ m_Popover = new Gtk.Popover(this);
+ m_Popover.add(m_ProgressText);
+ this.button_press_event.connect(onClick);
+ }
+
this.add(m_stack);
this.set_relief(Gtk.ReliefStyle.NONE);
+ this.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
this.set_focus_on_click(false);
this.set_tooltip_text(tooltip);
this.show_all();
@@ -54,15 +72,18 @@ public class FeedReader.UpdateButton : Gtk.Button {
{
Logger.debug("UpdateButton: update status");
m_status = status;
+ this.set_has_tooltip(!status);
if(insensitive)
this.setSensitive(!status);
if(status)
{
+ this.set_tooltip_text(_("Cancel"));
m_stack.set_visible_child_name("spinner");
m_spinner.start();
}
else
{
+ this.set_tooltip_text(m_tooltip);
m_stack.set_visible_child_name("icon");
m_spinner.stop();
}
@@ -75,8 +96,34 @@ public class FeedReader.UpdateButton : Gtk.Button {
public void setSensitive(bool sensitive)
{
+ // FIXME: dont set sensitive if canceling
Logger.debug("UpdateButton: setSensitive %s".printf(sensitive ? "true" : "false"));
this.sensitive = sensitive;
}
+ public void setProgress(string text)
+ {
+ if(m_hasPopup)
+ m_ProgressText.set_text(text);
+ }
+
+ private bool onClick(Gdk.EventButton event)
+ {
+ if(event.button != 3)
+ return false;
+
+ if(m_status && !m_Popover.get_visible())
+ {
+ m_Popover.show_all();
+ return true;
+ }
+
+ return false;
+ }
+
+ public void setIcon(Gtk.Image icon)
+ {
+ m_icon = icon;
+ }
+
}
diff --git a/src/Widgets/WebLoginPage.vala b/src/Widgets/WebLoginPage.vala
index f82c1d90..576830d4 100644
--- a/src/Widgets/WebLoginPage.vala
+++ b/src/Widgets/WebLoginPage.vala
@@ -16,6 +16,7 @@
public class FeedReader.WebLoginPage : Gtk.Bin {
private WebKit.WebView m_view;
+ private bool m_success = false;
public signal bool getApiCode(string url);
public signal void success();
@@ -41,39 +42,41 @@ public class FeedReader.WebLoginPage : Gtk.Bin {
public void redirection(WebKit.LoadEvent load_event)
{
- Logger.debug("WebLoginPage: webView redirection");
switch(load_event)
{
case WebKit.LoadEvent.STARTED:
- Logger.debug("WebLoginPage: LoadEvent STARTED");
check();
break;
case WebKit.LoadEvent.REDIRECTED:
- Logger.debug("WebLoginPage: LoadEvent REDIRECTED");
check();
break;
case WebKit.LoadEvent.COMMITTED:
- Logger.debug("WebLoginPage: LoadEvent COMMITED");
break;
case WebKit.LoadEvent.FINISHED:
- Logger.debug("WebLoginPage: LoadEvent FINISHED");
break;
}
}
private void check()
{
+ if(m_success)
+ // code already successfully extracted
+ return;
+
string url = m_view.get_uri();
if(getApiCode(url))
{
m_view.stop_loading();
+ m_success = true;
success();
+
}
}
public void reset()
{
m_view.load_uri("about:blank");
+ m_success = false;
}
}
diff --git a/src/dbBase.vala b/src/dbBase.vala
deleted file mode 100644
index ad291741..00000000
--- a/src/dbBase.vala
+++ /dev/null
@@ -1,1555 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.dbBase : GLib.Object {
-
- protected Sqlite.Database sqlite_db;
- public signal void updateBadge();
-
- protected dbBase(string dbFile = "feedreader-04.db")
- {
- Sqlite.config(Sqlite.Config.LOG, errorLogCallback);
- string db_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/";
- var path = GLib.File.new_for_path(db_path);
- if(!path.query_exists())
- {
- try
- {
- path.make_directory_with_parents();
- }
- catch(GLib.Error e)
- {
- Logger.error("Can't create directory for database: %s".printf(e.message));
- }
- }
-
- Logger.debug(@"Opening Database: $db_path$dbFile");
- int rc = Sqlite.Database.open_v2(db_path + dbFile, out sqlite_db);
- if(rc != Sqlite.OK)
- Logger.error("Can't open database: %d: %s".printf(sqlite_db.errcode(), sqlite_db.errmsg()));
-
- sqlite_db.busy_timeout(1000);
- sqlite_db.update_hook(watchDog);
- }
-
- private void watchDog(Sqlite.Action action, string dbname, string table, int64 rowID)
- {
- if(action == Sqlite.Action.DELETE && !table.has_prefix("fts_"))
- {
- Logger.warning("DELETING rowID: %s from table: %s and db: %s".printf(rowID.to_string(), table, dbname));
- }
- }
-
- private void errorLogCallback(int eCode, string msg)
- {
- Logger.error("dbErrorLog: " + eCode.to_string() + ": " + msg);
- }
-
- public void init()
- {
- executeSQL("PRAGMA journal_mode = WAL");
- executeSQL("PRAGMA page_size = 4096");
-
- executeSQL( """CREATE TABLE IF NOT EXISTS "main"."feeds"
- (
- "feed_id" TEXT PRIMARY KEY NOT NULL UNIQUE,
- "name" TEXT NOT NULL,
- "url" TEXT NOT NULL,
- "has_icon" INTEGER NOT NULL,
- "category_id" TEXT,
- "subscribed" INTEGER DEFAULT 1,
- "xmlURL" TEXT
- )""");
-
- executeSQL( """CREATE TABLE IF NOT EXISTS "main"."categories"
- (
- "categorieID" TEXT PRIMARY KEY NOT NULL UNIQUE,
- "title" TEXT NOT NULL,
- "orderID" INTEGER,
- "exists" INTEGER,
- "Parent" TEXT,
- "Level" INTEGER
- )""");
-
- executeSQL( """CREATE TABLE IF NOT EXISTS "main"."articles"
- (
- "articleID" TEXT PRIMARY KEY NOT NULL UNIQUE,
- "feedID" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "author" TEXT,
- "url" TEXT NOT NULL,
- "html" TEXT NOT NULL,
- "preview" TEXT NOT NULL,
- "unread" INTEGER NOT NULL,
- "marked" INTEGER NOT NULL,
- "tags" TEXT,
- "date" DATETIME NOT NULL,
- "guidHash" TEXT,
- "lastModified" INTEGER,
- "media" TEXT,
- "contentFetched" INTEGER NOT NULL
- )""");
-
- executeSQL( """CREATE TABLE IF NOT EXISTS "main"."tags"
- (
- "tagID" TEXT PRIMARY KEY NOT NULL UNIQUE,
- "title" TEXT NOT NULL,
- "exists" INTEGER,
- "color" INTEGER
- )""");
-
- executeSQL( """CREATE TABLE IF NOT EXISTS "main"."CachedActions"
- (
- "action" INTEGER NOT NULL,
- "id" TEXT NOT NULL,
- "argument" INTEGER
- )""");
-
- executeSQL( """CREATE INDEX IF NOT EXISTS "index_articles" ON "articles" ("feedID" DESC, "unread" ASC, "marked" ASC)""");
- executeSQL( """CREATE VIRTUAL TABLE IF NOT EXISTS fts_table USING fts4 (content='articles', articleID, preview, title, author)""");
- }
-
- protected void executeSQL(string sql, Sqlite.Callback? callback = null)
- {
- string errmsg;
- int ec = sqlite_db.exec(sql, null, out errmsg);
- if (ec != Sqlite.OK)
- {
- Logger.error(sql);
- Logger.error(errmsg);
- }
- }
-
- public bool uninitialized()
- {
- string query = "SELECT count(*) FROM sqlite_master WHERE type='table' AND name='articles'";
-
- int count = -1;
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query, query.length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query);
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step() == Sqlite.ROW)
- {
- count = stmt.column_int(0);
- }
- stmt.reset();
-
- if(count == 0)
- {
- Logger.warning("database uninitialized");
- return true;
- }
- else if(count == 1)
- {
- Logger.debug("database already initialized");
- return false;
- }
-
- return true;
- }
-
- public bool isEmpty()
- {
- if(!isTableEmpty("articles"))
- {
- return false;
- }
-
- if(!isTableEmpty("categories"))
- {
- return false;
- }
-
- if(!isTableEmpty("feeds"))
- {
- return false;
- }
-
- if(!isTableEmpty("tags"))
- {
- return false;
- }
-
- return true;
- }
-
- public bool isTableEmpty(string table)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.%s".printf(table));
- query.selectField("count(*)");
- query.build();
- query.print();
-
- int count = -1;
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step() == Sqlite.ROW)
- {
- count = stmt.column_int(0);
- }
- Logger.debug("count %i".printf(count));
- stmt.reset();
-
- if(count > 0)
- return false;
- else
- return true;
- }
-
- public int getArticelCount()
- {
- int count = -1;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int cols = stmt.column_count ();
- while(stmt.step() == Sqlite.ROW)
- {
- for(int i = 0; i < cols; i++)
- {
- count = stmt.column_int(i);
- }
- }
- stmt.reset();
-
- return count;
- }
-
- public uint get_unread_total()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- uint unread = 0;
- while (stmt.step () == Sqlite.ROW) {
- unread = stmt.column_int(0);
- }
-
- stmt.reset ();
- return unread;
- }
-
- public uint get_marked_total()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("marked", ArticleStatus.MARKED.to_string());
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- uint makred = 0;
- while (stmt.step () == Sqlite.ROW) {
- makred = stmt.column_int(0);
- }
-
- stmt.reset ();
- return makred;
- }
-
- public uint get_unread_uncategorized()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
- query.addCustomCondition(getUncategorizedFeedsQuery());
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int unread = 0;
- while (stmt.step() == Sqlite.ROW) {
- unread = stmt.column_int(0);
- }
- stmt.reset();
- return unread;
- }
-
- public uint get_marked_uncategorized()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("makred", ArticleStatus.MARKED.to_string());
- query.addCustomCondition(getUncategorizedFeedsQuery());
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int marked = 0;
- while (stmt.step() == Sqlite.ROW) {
- marked = stmt.column_int(0);
- }
- stmt.reset();
- return marked;
- }
-
- public int getTagColor()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.tags");
- query.selectField("count(*)");
- query.addCustomCondition("instr(tagID, \"global.\") = 0");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int tagCount = 0;
- while (stmt.step () == Sqlite.ROW) {
- tagCount = stmt.column_int(0);
- }
- stmt.reset ();
-
- return (tagCount % Constants.COLORS.length);
- }
-
- public string read_preview(string articleID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("preview");
- query.addEqualsCondition("articleID", articleID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- string result = "";
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_text(0);
- }
-
- return result;
- }
-
- public string getFeedName(string feedID)
- {
- string result = _("unknown Feed");
-
- if(feedID == "")
- return result;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("name");
- query.addEqualsCondition("feed_id", feedID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step() == Sqlite.ROW)
- {
- result = stmt.column_text(0);
- }
-
- return result;
- }
-
-
- public string? getTagName(string tagID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.tags");
- query.selectField("title");
- query.addEqualsCondition("tagID", tagID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- string result = null;
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_text(0);
- }
-
- return result;
- }
-
- public int getLastModified()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("MAX(lastModified)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int result = 0;
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_int(0);
- }
-
- return result;
- }
-
-
- public string getCategoryName(string catID)
- {
- if(catID == CategoryID.TAGS.to_string())
- return "Tags";
-
- var query = new QueryBuilder(QueryType.SELECT, "main.categories");
- query.selectField("title");
- query.addEqualsCondition("categorieID", catID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- string result = "";
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_text(0);
- }
-
- if(result == "")
- result = _("Uncategorized");
-
- return result;
- }
-
-
- public string? getCategoryID(string catname)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.categories");
- query.selectField("categorieID");
- query.addEqualsCondition("title", catname, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- string? result = null;
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_text(0);
- }
-
- return result;
- }
-
-
- public bool preview_empty(string articleID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("articleID", articleID, true, true);
- query.addEqualsCondition("preview", "", false, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int result = 1;
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_int(0);
- }
-
- if(result == 1)
- return false;
- if(result == 0)
- return true;
-
- return true;
- }
-
- public article read_article(string articleID)
- {
- Logger.debug(@"dbBase.read_article(): $articleID");
- article tmp = null;
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("ROWID");
- query.selectField("*");
- query.addEqualsCondition("articleID", articleID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step() == Sqlite.ROW)
- {
- string? author = (stmt.column_text(4) == "") ? null : stmt.column_text(4);
- tmp = new article(
- articleID,
- stmt.column_text(3),
- stmt.column_text(5),
- stmt.column_text(2),
- (ArticleStatus)stmt.column_int(8),
- (ArticleStatus)stmt.column_int(9),
- stmt.column_text(6),
- stmt.column_text(7),
- author,
- Utils.convertStringToDate(stmt.column_text(11)),
- stmt.column_int(0), // rowid (sortid)
- stmt.column_text(10), // tags
- stmt.column_text(14), // media
- stmt.column_text(12) // guid
- );
- }
- stmt.reset();
- return tmp;
- }
-
-
- public string read_article_tags(string articleID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("tags");
- query.addEqualsCondition("articleID", articleID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- return stmt.column_text(0);
- }
- stmt.reset ();
- return "";
- }
-
- public int getMaxCatLevel()
- {
- int maxCatLevel = 0;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.categories");
- query.selectField("max(Level)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- maxCatLevel = stmt.column_int(0);
- }
-
- if(maxCatLevel == 0)
- {
- maxCatLevel = 1;
- }
-
- return maxCatLevel;
- }
-
- public bool haveFeedsWithoutCat()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("count(*)");
- query.addCustomCondition(getUncategorizedQuery());
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- int count = stmt.column_int(0);
-
- if(count > 0)
- return true;
- }
- return false;
- }
-
- public bool haveCategories()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.categories");
- query.selectField("count(*)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- int count = stmt.column_int(0);
-
- if(count > 0)
- return true;
- }
-
- return false;
- }
-
- public bool article_exists(string articleID)
- {
- int result = 0;
- string query = "SELECT EXISTS(SELECT 1 FROM articles WHERE articleID = \"" + articleID + "\" LIMIT 1)";
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query, query.length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query);
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_int(0);
- }
- if(result == 1)
- return true;
-
- return false;
- }
-
- public bool category_exists(string catID)
- {
- int result = 0;
- string query = "SELECT EXISTS(SELECT 1 FROM categories WHERE categorieID = \"" + catID + "\" LIMIT 1)";
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query, query.length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query);
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_int(0);
- }
- if(result == 1)
- return true;
-
- return false;
- }
-
-
- public int getRowCountHeadlineByDate(string date)
- {
- int result = 0;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addCustomCondition("date > \"%s\"".printf(date));
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_int(0);
- }
-
- return result;
- }
-
-
- public int getArticleCountNewerThanID(string id, string ID, FeedListType selectedType, ArticleListState state, string searchTerm)
- {
- int result = 0;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("rowid");
- query.addEqualsCondition("articleID", id, true, true);
- query.build();
-
- var query2 = new QueryBuilder(QueryType.SELECT, "main.articles");
- query2.selectField("count(*)");
-
- if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
- query2.addCustomCondition("rowid < (%s)".printf(query.get()));
- else
- query2.addCustomCondition("rowid > (%s)".printf(query.get()));
-
- if(selectedType == FeedListType.FEED && ID != FeedID.ALL.to_string())
- {
- query2.addEqualsCondition("feedID", ID, true, true);
- }
- else if(selectedType == FeedListType.CATEGORY && ID != CategoryID.MASTER.to_string() && ID != CategoryID.TAGS.to_string())
- {
- query2.addRangeConditionString("feedID", getFeedIDofCategorie(ID));
- }
- else if(ID == CategoryID.TAGS.to_string())
- {
- query2.addCustomCondition(getAllTagsCondition());
- }
- else if(selectedType == FeedListType.TAG)
- {
- query2.addCustomCondition("instr(tags, \"%s\") > 0".printf(ID));
- }
-
- if(state == ArticleListState.UNREAD)
- {
- query2.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
- }
- else if(state == ArticleListState.MARKED)
- {
- query2.addEqualsCondition("marked", ArticleStatus.MARKED.to_string());
- }
-
- if(searchTerm != ""){
- if(searchTerm.has_prefix("title: "))
- {
- query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE title MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- else if(searchTerm.has_prefix("author: "))
- {
- query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE author MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- else if(searchTerm.has_prefix("content: "))
- {
- query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE preview MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- else
- {
- query2.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE fts_table MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- }
-
- string order_field = "";
- switch(Settings.general().get_enum("articlelist-sort-by"))
- {
- case ArticleListSort.RECEIVED:
- order_field = "rowid";
- break;
-
- case ArticleListSort.DATE:
- order_field = "date";
- break;
- }
-
- bool desc = true;
- if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
- desc = false;
-
- query2.orderBy(order_field, desc);
- query2.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query2.get(), query2.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query2.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_int(0);
- }
-
- return result;
- }
-
-
- public Gee.ArrayList<string> getFeedIDofCategorie(string categorieID)
- {
- var feedIDs = new Gee.ArrayList<string>();
-
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("feed_id, category_id");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step() == Sqlite.ROW) {
- string catString = stmt.column_text(1);
- string[] categories = catString.split(",");
-
- if(categorieID == "")
- {
- if((categories.length == 0)
- ||(categories.length == 1 && categories[0].contains("global.must")))
- {
- feedIDs.add(stmt.column_text(0));
- }
- }
- else
- {
- foreach(string cat in categories)
- {
- if(cat == categorieID)
- {
- feedIDs.add(stmt.column_text(0));
- }
- }
- }
- }
- return feedIDs;
- }
-
- protected virtual string getUncategorizedQuery()
- {
- return "";
- }
-
- protected virtual bool showCategory(string catID, Gee.ArrayList<feed> feeds)
- {
- return true;
- }
-
- protected string getUncategorizedFeedsQuery()
- {
- string sql = "feedID IN (%s)";
-
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("feed_id");
- query.addCustomCondition(getUncategorizedQuery());
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- string feedIDs = "";
- while (stmt.step () == Sqlite.ROW) {
- feedIDs += "\"" + stmt.column_text(0) + "\"" + ",";
- }
-
- return sql.printf(feedIDs.substring(0, feedIDs.length-1));
- }
-
-
- public string getFeedIDofArticle(string articleID)
- {
- string query = "SELECT feedID FROM \"main\".\"articles\" WHERE \"articleID\" = " + "\"" + articleID + "\"";
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query, query.length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query);
- Logger.error(sqlite_db.errmsg());
- }
-
- string id = "";
- while (stmt.step () == Sqlite.ROW) {
- id = stmt.column_text(0);
- }
- return id;
- }
-
-
- public string getNewestArticle()
- {
- string result = "";
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("articleID");
- query.addEqualsCondition("rowid", "%i".printf(getHighestRowID()));
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- result = stmt.column_text(0);
- }
- return result;
- }
-
- public int getHighestRowID()
- {
- int result = 0;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("max(rowid)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step() == Sqlite.ROW)
- {
- result = stmt.column_int(0);
- }
- return result;
- }
-
- public string getHighestFeedID()
- {
- string result = "0";
-
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("max(feed_id)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step() == Sqlite.ROW)
- {
- result = stmt.column_text(0);
- }
-
- return result;
- }
-
-
- public feed? read_feed(string feedID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("*");
- query.addEqualsCondition("feed_id", feedID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- var tmpfeed = new feed(feedID, stmt.column_text(1), stmt.column_text(2), ((stmt.column_int(3) == 1) ? true : false), getFeedUnread(feedID), stmt.column_text(4).split(","));
- return tmpfeed;
- }
-
- return null;
- }
-
-
- public Gee.ArrayList<feed> read_feeds(bool starredCount = false)
- {
- Gee.ArrayList<feed> tmp = new Gee.ArrayList<feed>();
- feed tmpfeed;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("*");
- if(Settings.general().get_enum("feedlist-sort-by") == FeedListSort.ALPHABETICAL)
- {
- query.orderBy("name", true);
- }
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- string feedID = stmt.column_text(0);
- string catString = stmt.column_text(4);
- string xmlURL = stmt.column_text(6);
- bool has_icon = ((stmt.column_int(3) == 1) ? true : false);
- string url = stmt.column_text(2);
- string name = stmt.column_text(1);
- string[] catVec = { "" };
-
- if(catString != "")
- catVec = catString.split(",");
-
- uint count = 0;
- if(starredCount)
- count = getFeedStarred(feedID);
- else
- count = getFeedUnread(feedID);
-
- tmpfeed = new feed(feedID, name, url, has_icon, count, catVec, xmlURL);
- tmp.add(tmpfeed);
- }
-
- return tmp;
- }
-
-
- public uint getFeedUnread(string feedID)
- {
- uint count = 0;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
- query.addEqualsCondition("feedID", feedID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- count = (uint)stmt.column_int(0);
- }
- return count;
- }
-
- public uint getFeedStarred(string feedID)
- {
- uint count = 0;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addEqualsCondition("marked", ArticleStatus.MARKED.to_string());
- query.addEqualsCondition("feedID", feedID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- count = (uint)stmt.column_int(0);
- }
- return count;
- }
-
-
- public Gee.ArrayList<feed> read_feeds_without_cat()
- {
- Gee.ArrayList<feed> tmp = new Gee.ArrayList<feed>();
- feed tmpfeed;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("*");
- query.addCustomCondition(getUncategorizedQuery());
- if(Settings.general().get_enum("feedlist-sort-by") == FeedListSort.ALPHABETICAL)
- {
- query.orderBy("name", true);
- }
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- string feedID = stmt.column_text(0);
- string catString = stmt.column_text(4);
- string xmlURL = stmt.column_text(6);
- bool has_icon = ((stmt.column_int(3) == 1) ? true : false);
- string url = stmt.column_text(2);
- string name = stmt.column_text(1);
- string[] catVec = { "" };
- if(catString != "")
- catVec = catString.split(",");
- tmpfeed = new feed(feedID, name, url, has_icon, getFeedUnread(feedID), catVec, xmlURL);
- tmp.add(tmpfeed);
- }
-
- return tmp;
- }
-
- public category? read_category(string catID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.categories");
- query.selectField("*");
- query.addEqualsCondition("categorieID", catID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- var tmpcategory = new category(catID, stmt.column_text(1), 0, stmt.column_int(3), stmt.column_text(4), stmt.column_int(5));
- return tmpcategory;
- }
-
- return null;
- }
-
-
- public Gee.ArrayList<tag> read_tags()
- {
- Gee.ArrayList<tag> tmp = new Gee.ArrayList<tag>();
- tag tmpTag;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.tags");
- query.selectField("*");
- query.addCustomCondition("instr(tagID, \"global.\") = 0");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- tmpTag = new tag(stmt.column_text(0), stmt.column_text(1), stmt.column_int(3));
- tmp.add(tmpTag);
- }
-
- return tmp;
- }
-
- public tag read_tag(string tagID)
- {
- tag tmpTag = null;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.tags");
- query.selectField("*");
- query.addEqualsCondition("tagID", tagID, true, true);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- tmpTag = new tag(stmt.column_text(0), stmt.column_text(1), stmt.column_int(3));
- }
-
- return tmpTag;
- }
-
- protected string getAllTagsCondition()
- {
- var tags = read_tags();
- string query = "(";
- foreach(var Tag in tags)
- {
- query += "instr(\"tags\", \"%s\") > 0 OR ".printf(Tag.getTagID());
- }
-
- int or = query.char_count()-4;
- return query.substring(0, or) + ")";
- }
-
- public int getTagCount()
- {
- int count = 0;
- var query = new QueryBuilder(QueryType.SELECT, "main.tags");
- query.addCustomCondition("instr(tagID, \"global.\") = 0");
- query.selectField("count(*)");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- count = stmt.column_int(0);
- }
-
- return count;
- }
-
- public string getMaxID(string table, string field)
- {
- string maxID = "0";
- var query = new QueryBuilder(QueryType.SELECT, table);
- query.selectField("max(%s)".printf(field));
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- maxID = stmt.column_text(0);
- }
-
- return maxID;
- }
-
- public Gee.ArrayList<category> read_categories_level(int level, Gee.ArrayList<feed>? feeds = null)
- {
- var categories = read_categories(feeds);
- var tmpCategories = new Gee.ArrayList<category>();
-
- foreach(category cat in categories)
- {
- if(cat.getLevel() == level)
- {
- tmpCategories.add(cat);
- }
- }
-
- return tmpCategories;
- }
-
- public Gee.ArrayList<category> read_categories(Gee.ArrayList<feed>? feeds = null)
- {
- Gee.ArrayList<category> tmp = new Gee.ArrayList<category>();
- category tmpcategory;
-
- var query = new QueryBuilder(QueryType.SELECT, "main.categories");
- query.selectField("*");
-
- if(Settings.general().get_enum("feedlist-sort-by") == FeedListSort.ALPHABETICAL)
- {
- query.orderBy("title", true);
- }
- else
- {
- query.orderBy("orderID", true);
- }
-
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step () == Sqlite.ROW)
- {
- string catID = stmt.column_text(0);
-
- if(feeds == null || showCategory(catID, feeds))
- {
- tmpcategory = new category(
- catID, stmt.column_text(1),
- (feeds == null) ? 0 : Utils.categoryGetUnread(catID, feeds),
- stmt.column_int(3),
- stmt.column_text(4),
- stmt.column_int(5)
- );
-
- tmp.add(tmpcategory);
- }
- }
-
- return tmp;
- }
-
- public Gee.LinkedList<article> readUnfetchedArticles()
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("articleID");
- query.selectField("url");
- query.selectField("preview");
- query.selectField("html");
- query.selectField("feedID");
-
- query.addEqualsCondition("contentFetched", "0", true, false);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
-
- var tmp = new Gee.LinkedList<article>();
- while (stmt.step () == Sqlite.ROW)
- {
- tmp.add(new article(
- stmt.column_text(0), // articleID
- "", // title
- stmt.column_text(1), // url
- stmt.column_text(4), // feedID
- ArticleStatus.UNREAD, // unread
- ArticleStatus.UNMARKED, // marked
- stmt.column_text(3), // html
- stmt.column_text(2), // preview
- "", // author
- Utils.convertStringToDate("2016-10-08 22:57:00"), // date
- 0, // sortID
- "", // tags
- "", // media
- "" // guid
- ));
- }
-
- return tmp;
- }
-
- public Gee.LinkedList<article> read_articles(string ID, FeedListType selectedType, ArticleListState state, string searchTerm, uint limit = 20, uint offset = 0, int searchRows = 0)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("ROWID");
- query.selectField("feedID");
- query.selectField("articleID");
- query.selectField("title");
- query.selectField("author");
- query.selectField("url");
- query.selectField("preview");
- query.selectField("unread");
- query.selectField("marked");
- query.selectField("tags");
- query.selectField("date");
- query.selectField("guidHash");
- query.selectField("media");
-
- if(selectedType == FeedListType.FEED && ID != FeedID.ALL.to_string())
- {
- query.addEqualsCondition("feedID", ID, true, true);
- }
- else if(selectedType == FeedListType.CATEGORY && ID != CategoryID.MASTER.to_string() && ID != CategoryID.TAGS.to_string())
- {
- query.addRangeConditionString("feedID", getFeedIDofCategorie(ID));
- }
- else if(ID == CategoryID.TAGS.to_string())
- {
- query.addCustomCondition(getAllTagsCondition());
- }
- else if(selectedType == FeedListType.TAG)
- {
- query.addCustomCondition("instr(tags, \"%s\") > 0".printf(ID));
- }
-
- if(state == ArticleListState.UNREAD)
- {
- query.addEqualsCondition("unread", ArticleStatus.UNREAD.to_string());
- }
- else if(state == ArticleListState.MARKED)
- {
- query.addEqualsCondition("marked", ArticleStatus.MARKED.to_string());
- }
-
- if(searchTerm != ""){
- if(searchTerm.has_prefix("title: "))
- {
- query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE title MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- else if(searchTerm.has_prefix("author: "))
- {
- query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE author MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- else if(searchTerm.has_prefix("content: "))
- {
- query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE preview MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- else
- {
- query.addCustomCondition("articleID IN (SELECT articleID FROM fts_table WHERE fts_table MATCH '%s')".printf(Utils.prepareSearchQuery(searchTerm)));
- }
- }
-
- if(searchRows != 0)
- {
- query.addCustomCondition("articleID in (SELECT articleID FROM main.articles ORDER BY rowid DESC LIMIT %i)".printf(searchRows));
- }
-
- string order_field = "";
- switch(Settings.general().get_enum("articlelist-sort-by"))
- {
- case ArticleListSort.RECEIVED:
- order_field = "rowid";
- break;
-
- case ArticleListSort.DATE:
- order_field = "date";
- break;
- }
-
- bool desc = true;
- if(Settings.general().get_boolean("articlelist-oldest-first") && state == ArticleListState.UNREAD)
- desc = false;
-
- query.orderBy(order_field, desc);
- query.limit(limit);
- query.offset(offset);
- query.build();
- query.print();
-
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
-
- var tmp = new Gee.LinkedList<article>();
- while (stmt.step () == Sqlite.ROW)
- {
- tmp.add(new article(
- stmt.column_text(2), // articleID
- stmt.column_text(3), // title
- stmt.column_text(5), // url
- stmt.column_text(1), // feedID
- (ArticleStatus)stmt.column_int(7), // unread
- (ArticleStatus)stmt.column_int(8), // marked
- "", // html
- stmt.column_text(6), // preview
- stmt.column_text(4), // author
- Utils.convertStringToDate(stmt.column_text(10)), // date
- stmt.column_int(0), // sortID
- stmt.column_text(9), // tags
- stmt.column_text(12), // media
- stmt.column_text(11) // guid
- ));
- }
-
- return tmp;
- }
-
-}
diff --git a/src/dbDaemon.vala b/src/dbDaemon.vala
deleted file mode 100644
index 85ac5d2a..00000000
--- a/src/dbDaemon.vala
+++ /dev/null
@@ -1,1025 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.dbDaemon : dbBase {
-
- private static dbDaemon? m_dataBase = null;
-
- public static new dbDaemon get_default()
- {
- if(m_dataBase == null)
- {
- m_dataBase = new dbDaemon();
- if(m_dataBase.uninitialized())
- m_dataBase.init();
- }
-
- return m_dataBase;
- }
-
- private dbDaemon(string dbFile = "feedreader-04.db")
- {
- base(dbFile);
- }
-
- public void checkpoint()
- {
- sqlite_db.wal_checkpoint("");
- }
-
- public bool resetDB()
- {
- Logger.warning("resetDB");
- executeSQL("DROP TABLE main.feeds");
- executeSQL("DROP TABLE main.categories");
- executeSQL("DROP TABLE main.articles");
- executeSQL("DROP TABLE main.tags");
- executeSQL("DROP TABLE main.fts_table");
- executeSQL("VACUUM");
-
- string query = "PRAGMA INTEGRITY_CHECK";
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query, query.length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query);
- Logger.error(sqlite_db.errmsg());
- }
-
-
- int cols = stmt.column_count ();
- while (stmt.step () == Sqlite.ROW) {
- for (int i = 0; i < cols; i++) {
- if(stmt.column_text(i) != "ok")
- {
- Logger.error("resetting the database failed");
- return false;
- }
- }
- }
- stmt.reset();
- return true;
- }
-
- public void updateFTS()
- {
- executeSQL("INSERT INTO fts_table(fts_table) VALUES('rebuild')");
- }
-
- public void springCleaning()
- {
- executeSQL("VACUUM");
- var now = new DateTime.now_local();
- Settings.state().set_int("last-spring-cleaning", (int)now.to_unix());
- }
-
- public void dropOldArtilces(int weeks)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("articleID");
- query.selectField("feedID");
- query.addCustomCondition("date <= datetime('now', '-%i days')".printf(weeks*7));
- query.addEqualsCondition("marked", ArticleStatus.UNMARKED.to_string());
- if(FeedServer.get_default().useMaxArticles())
- {
- int highesID = getHighestRowID();
- int syncCount = Settings.general().get_int("max-articles");
- int upper = highesID-syncCount;
- if(upper <= 0)
- return;
- query.addCustomCondition("rowid BETWEEN 1 AND %i".printf(upper));
- }
- query.build();
- query.print();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- delete_article(stmt.column_text(0), stmt.column_text(1));
- }
- }
-
- private void delete_article(string articleID, string feedID)
- {
- Logger.info("Deleting article \"%s\"".printf(articleID));
- executeSQL("DELETE FROM main.articles WHERE articleID = \"" + articleID + "\"");
- string folder_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/images/%s/%s/".printf(feedID, articleID);
- Utils.remove_directory(folder_path);
- }
-
- public void dropTag(string tagID)
- {
- var query = new QueryBuilder(QueryType.DELETE, "main.tags");
- query.addEqualsCondition("tagID", tagID, true, true);
- executeSQL(query.build());
-
- query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("tags");
- query.selectField("articleID");
- query.addCustomCondition("instr(tags, \"%s\") > 0".printf(tagID));
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- while(stmt.step () == Sqlite.ROW)
- {
- string old_tags = stmt.column_text(0);
- string articleID = stmt.column_text(1);
- string new_tags = "";
- var tagArray = old_tags.split(",");
- foreach(string tag in tagArray)
- {
- tag = tag.strip();
- if(tag != "" && tag != tagID)
- new_tags += "tag" + ",";
- }
-
- query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- query.updateValuePair("tags", "\"%s\"".printf(new_tags));
- query.addEqualsCondition("articleID", articleID, true, true);
- executeSQL(query.build());
- }
- }
-
- public void write_feeds(Gee.LinkedList<feed> feeds)
- {
- executeSQL("BEGIN TRANSACTION");
-
- var query = new QueryBuilder(QueryType.INSERT_OR_REPLACE, "main.feeds");
- query.insertValuePair("feed_id", "$FEEDID");
- query.insertValuePair("name", "$FEEDNAME");
- query.insertValuePair("url", "$FEEDURL");
- query.insertValuePair("has_icon", "$HASICON");
- query.insertValuePair("category_id", "$CATID");
- query.insertValuePair("subscribed", "1");
- query.insertValuePair("xmlURL", "$XMLURL");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error("dbDaemon: write_feeds - " + query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
-
-
- int feedID_pos = stmt.bind_parameter_index("$FEEDID");
- int feedName_pos = stmt.bind_parameter_index("$FEEDNAME");
- int feedURL_pos = stmt.bind_parameter_index("$FEEDURL");
- int hasIcon_pos = stmt.bind_parameter_index("$HASICON");
- int catID_pos = stmt.bind_parameter_index("$CATID");
- int xmlURL_pos = stmt.bind_parameter_index("$XMLURL");
- assert (feedID_pos > 0);
- assert (feedName_pos > 0);
- assert (feedURL_pos > 0);
- assert (hasIcon_pos > 0);
- assert (catID_pos > 0);
- assert (xmlURL_pos > 0);
-
- foreach(var feed_item in feeds)
- {
- string catString = "";
- foreach(string category in feed_item.getCatIDs())
- {
- catString += category + ",";
- }
-
- catString = catString.substring(0, catString.length-1);
-
- stmt.bind_text(feedID_pos, feed_item.getFeedID());
- stmt.bind_text(feedName_pos, Utils.UTF8fix(feed_item.getTitle()));
- stmt.bind_text(feedURL_pos, feed_item.getURL());
- stmt.bind_int (hasIcon_pos, feed_item.hasIcon() ? 1 : 0);
- stmt.bind_text(catID_pos, catString);
- stmt.bind_text(xmlURL_pos, feed_item.getXmlUrl());
-
- while(stmt.step() == Sqlite.ROW){}
- stmt.reset();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
- public void write_tags(Gee.LinkedList<tag> tags)
- {
- executeSQL("BEGIN TRANSACTION");
-
- var query = new QueryBuilder(QueryType.INSERT_OR_IGNORE, "main.tags");
- query.insertValuePair("tagID", "$TAGID");
- query.insertValuePair("title", "$LABEL");
- query.insertValuePair("\"exists\"", "1");
- query.insertValuePair("color", "$COLOR");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error("dbDaemon: write_tags - " + query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int tagID_position = stmt.bind_parameter_index("$TAGID");
- int label_position = stmt.bind_parameter_index("$LABEL");
- int color_position = stmt.bind_parameter_index("$COLOR");
- assert (tagID_position > 0);
- assert (label_position > 0);
- assert (color_position > 0);
-
- foreach(var tag_item in tags)
- {
- //Logger.debug("write_tags: %s %s %i".printf(tag_item.getTagID(), tag_item.getTitle(), tag_item.getColor()));
- stmt.bind_text(tagID_position, tag_item.getTagID());
- stmt.bind_text(label_position, tag_item.getTitle());
- stmt.bind_int (color_position, tag_item.getColor());
-
- while(stmt.step() == Sqlite.ROW){}
- stmt.reset ();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
- public void update_tags(Gee.LinkedList<tag> tags)
- {
- executeSQL("BEGIN TRANSACTION");
-
- var query = new QueryBuilder(QueryType.UPDATE, "main.tags");
- query.updateValuePair("title", "$TITLE");
- query.updateValuePair("\"exists\"", "1");
- query.addEqualsCondition("tagID", "$TAGID");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error("dbDaemon: update_tags - " + query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
- int title_position = stmt.bind_parameter_index("$TITLE");
- int tagID_position = stmt.bind_parameter_index("$TAGID");
- assert (title_position > 0);
- assert (tagID_position > 0);
-
- foreach(var tag_item in tags)
- {
- stmt.bind_text(title_position, tag_item.getTitle());
- stmt.bind_text(tagID_position, tag_item.getTagID());
- while (stmt.step () == Sqlite.ROW) {}
- stmt.reset ();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
-
- public void update_tag_color(string tagID, int color)
- {
- var query = new QueryBuilder(QueryType.UPDATE, "main.tags");
- query.updateValuePair("color", color.to_string());
- query.addEqualsCondition("tagID", tagID, true, true);
- executeSQL(query.build());
- }
-
-
-
-
- public void write_categories(Gee.LinkedList<category> categories)
- {
- executeSQL("BEGIN TRANSACTION");
-
- var query = new QueryBuilder(QueryType.INSERT_OR_REPLACE, "main.categories");
- query.insertValuePair("categorieID", "$CATID");
- query.insertValuePair("title", "$FEEDNAME");
- query.insertValuePair("orderID", "$ORDERID");
- query.insertValuePair("\"exists\"", "1");
- query.insertValuePair("Parent", "$PARENT");
- query.insertValuePair("Level", "$LEVEL");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error("dbDaemon: write_categories - " + query.get());
- Logger.error(sqlite_db.errmsg());
- }
-
-
- int catID_position = stmt.bind_parameter_index("$CATID");
- int feedName_position = stmt.bind_parameter_index("$FEEDNAME");
- int orderID_position = stmt.bind_parameter_index("$ORDERID");
- int parent_position = stmt.bind_parameter_index("$PARENT");
- int level_position = stmt.bind_parameter_index("$LEVEL");
- assert (catID_position > 0);
- assert (feedName_position > 0);
- assert (orderID_position > 0);
- assert (parent_position > 0);
- assert (level_position > 0);
-
- foreach(var cat_item in categories)
- {
- stmt.bind_text(catID_position, cat_item.getCatID());
- stmt.bind_text(feedName_position, cat_item.getTitle());
- stmt.bind_int (orderID_position, cat_item.getOrderID());
- stmt.bind_text(parent_position, cat_item.getParent());
- stmt.bind_int (level_position, cat_item.getLevel());
-
- while (stmt.step () == Sqlite.ROW) {}
- stmt.reset ();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
- public void updateArticlesByID(Gee.LinkedList<string> ids, string field)
- {
- // first reset all articles
- var reset_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- if(field == "unread")
- reset_query.updateValuePair(field, ArticleStatus.READ.to_string());
- else if(field == "marked")
- reset_query.updateValuePair(field, ArticleStatus.UNMARKED.to_string());
- executeSQL(reset_query.build());
-
-
- executeSQL("BEGIN TRANSACTION");
-
- // then reapply states of the synced articles
- var update_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
-
- if(field == "unread")
- update_query.updateValuePair(field, ArticleStatus.UNREAD.to_string());
- else if(field == "marked")
- update_query.updateValuePair(field, ArticleStatus.MARKED.to_string());
-
- update_query.addEqualsCondition("articleID", "$ARTICLEID");
- update_query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (update_query.get(), update_query.get().length, out stmt);
-
- if (ec != Sqlite.OK)
- {
- Logger.error(update_query.get());
- Logger.error("updateArticlesByID: " + sqlite_db.errmsg());
- }
-
- int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
- assert (articleID_position > 0);
-
-
- foreach(string id in ids)
- {
- stmt.bind_text(articleID_position, id);
- while(stmt.step() != Sqlite.DONE){}
- stmt.reset();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
- public void writeContent(article Article)
- {
- executeSQL("BEGIN TRANSACTION");
-
- var update_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- update_query.updateValuePair("html", "$HTML");
- update_query.updateValuePair("preview", "$PREVIEW");
- update_query.updateValuePair("contentFetched", "1");
- update_query.addEqualsCondition("articleID", Article.getArticleID(), true, true);
- update_query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(update_query.get(), update_query.get().length, out stmt);
-
- if(ec != Sqlite.OK)
- {
- Logger.error(update_query.get());
- Logger.error("writeContent: " + sqlite_db.errmsg());
- }
-
- int html_position = stmt.bind_parameter_index("$HTML");
- int preview_position = stmt.bind_parameter_index("$PREVIEW");
- assert (html_position > 0);
- assert (preview_position > 0);
-
-
- stmt.bind_text(html_position, Article.getHTML());
- stmt.bind_text(preview_position, Article.getPreview());
-
- while(stmt.step() != Sqlite.DONE){}
- stmt.reset();
-
- executeSQL("COMMIT TRANSACTION");
- }
-
- public void update_articles(Gee.LinkedList<article> articles)
- {
- executeSQL("BEGIN TRANSACTION");
-
- var update_query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- update_query.updateValuePair("unread", "$UNREAD");
- update_query.updateValuePair("marked", "$MARKED");
- update_query.updateValuePair("tags", "$TAGS");
- update_query.updateValuePair("lastModified", "$LASTMODIFIED");
- update_query.addEqualsCondition("articleID", "$ARTICLEID");
- update_query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(update_query.get(), update_query.get().length, out stmt);
-
- if(ec != Sqlite.OK)
- {
- Logger.error(update_query.get());
- Logger.error("update_articles: " + sqlite_db.errmsg());
- }
-
- int unread_position = stmt.bind_parameter_index("$UNREAD");
- int marked_position = stmt.bind_parameter_index("$MARKED");
- int tags_position = stmt.bind_parameter_index("$TAGS");
- int modified_position = stmt.bind_parameter_index("$LASTMODIFIED");
- int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
- assert (unread_position > 0);
- assert (marked_position > 0);
- assert (tags_position > 0);
- assert (modified_position > 0);
- assert (articleID_position > 0);
-
-
- foreach(article a in articles)
- {
- var unread = ActionCache.get_default().checkRead(a);
- var marked = ActionCache.get_default().checkStarred(a.getArticleID(), a.getMarked());
-
- if(unread != ArticleStatus.READ && unread != ArticleStatus.UNREAD)
- Logger.warning(@"dbDaemon.update_articles: writing invalid unread status $unread for article " + a.getArticleID());
-
- if(marked != ArticleStatus.MARKED && marked != ArticleStatus.UNMARKED)
- Logger.warning(@"dbDaemon.update_articles: writing invalid marked status $marked for article " + a.getArticleID());
-
- stmt.bind_int (unread_position, unread);
- stmt.bind_int (marked_position, marked);
- stmt.bind_text(tags_position, a.getTagString());
- stmt.bind_int (modified_position, a.getLastModified());
- stmt.bind_text(articleID_position, a.getArticleID());
-
- while(stmt.step() != Sqlite.DONE){}
- stmt.reset();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
-
- public void write_articles(Gee.LinkedList<article> articles)
- {
- FeedReader.UtilsDaemon.generatePreviews(articles);
- FeedReader.UtilsDaemon.checkHTML(articles);
-
- executeSQL("BEGIN TRANSACTION");
-
- var query = new QueryBuilder(QueryType.INSERT_OR_IGNORE, "main.articles");
- query.insertValuePair("articleID", "$ARTICLEID");
- query.insertValuePair("feedID", "$FEEDID");
- query.insertValuePair("title", "$TITLE");
- query.insertValuePair("author", "$AUTHOR");
- query.insertValuePair("url", "$URL");
- query.insertValuePair("html", "$HTML");
- query.insertValuePair("preview", "$PREVIEW");
- query.insertValuePair("unread", "$UNREAD");
- query.insertValuePair("marked", "$MARKED");
- query.insertValuePair("tags", "$TAGS");
- query.insertValuePair("date", "$DATE");
- query.insertValuePair("guidHash", "$GUIDHASH");
- query.insertValuePair("lastModified", "$LASTMODIFIED");
- query.insertValuePair("media", "$MEDIA");
- query.insertValuePair("contentFetched", "0");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
-
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error("write_articles: " + sqlite_db.errmsg());
- }
-
-
-
- int articleID_position = stmt.bind_parameter_index("$ARTICLEID");
- int feedID_position = stmt.bind_parameter_index("$FEEDID");
- int url_position = stmt.bind_parameter_index("$URL");
- int unread_position = stmt.bind_parameter_index("$UNREAD");
- int marked_position = stmt.bind_parameter_index("$MARKED");
- int tags_position = stmt.bind_parameter_index("$TAGS");
- int title_position = stmt.bind_parameter_index("$TITLE");
- int html_position = stmt.bind_parameter_index("$HTML");
- int preview_position = stmt.bind_parameter_index("$PREVIEW");
- int author_position = stmt.bind_parameter_index("$AUTHOR");
- int date_position = stmt.bind_parameter_index("$DATE");
- int guidHash_position = stmt.bind_parameter_index("$GUIDHASH");
- int modified_position = stmt.bind_parameter_index("$LASTMODIFIED");
- int media_position = stmt.bind_parameter_index("$MEDIA");
-
- assert (articleID_position > 0);
- assert (feedID_position > 0);
- assert (url_position > 0);
- assert (unread_position > 0);
- assert (marked_position > 0);
- assert (tags_position > 0);
- assert (title_position > 0);
- assert (html_position > 0);
- assert (preview_position > 0);
- assert (author_position > 0);
- assert (date_position > 0);
- assert (guidHash_position > 0);
- assert (modified_position > 0);
- assert (media_position > 0);
-
- foreach(var article in articles)
- {
- stmt.bind_text(articleID_position, article.getArticleID());
- stmt.bind_text(feedID_position, article.getFeedID());
- stmt.bind_text(url_position, article.getURL());
- stmt.bind_int (unread_position, article.getUnread());
- stmt.bind_int (marked_position, article.getMarked());
- stmt.bind_text(tags_position, article.getTagString());
- stmt.bind_text(title_position, article.getTitle());
- stmt.bind_text(html_position, article.getHTML());
- stmt.bind_text(preview_position, article.getPreview());
- stmt.bind_text(author_position, article.getAuthor());
- stmt.bind_text(date_position, article.getDateStr());
- stmt.bind_text(guidHash_position, article.getHash());
- stmt.bind_int (modified_position, article.getLastModified());
- stmt.bind_text(media_position, article.getMediaString());
-
- while(stmt.step() != Sqlite.DONE){}
- stmt.reset();
- }
-
- executeSQL("COMMIT TRANSACTION");
- }
-
- public void set_article_tags(string articleID, string tags)
- {
- var query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- query.updateValuePair("tags", "\"%s\"".printf(tags));
- query.addEqualsCondition("articleID", articleID, true, true);
- executeSQL(query.build());
- }
-
- public bool tag_still_used(string tagID)
- {
- var query = new QueryBuilder(QueryType.SELECT, "main.articles");
- query.selectField("count(*)");
- query.addCustomCondition("instr(tags, \"%s\") > 0".printf(tagID));
- query.limit(2);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error("tag_still_used: " + sqlite_db.errmsg());
- }
-
- while (stmt.step () == Sqlite.ROW) {
- if(stmt.column_int(0) > 1)
- return true;
- }
-
- return false;
- }
-
- public void update_article(string articleIDs, string field, int field_value)
- {
- var id_array = articleIDs.split(",");
- var id_list = new Gee.ArrayList<string>();
- foreach(string id in id_array)
- {
- id_list.add(id);
- }
-
- var query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- query.updateValuePair(field, field_value.to_string());
- query.addRangeConditionString("articleID", id_list);
- executeSQL(query.build());
- }
-
- public void markCategorieRead(string catID)
- {
- var query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- query.updateValuePair("unread", ArticleStatus.READ.to_string());
- query.addRangeConditionString("feedID", getFeedIDofCategorie(catID));
- executeSQL(query.build());
- }
-
- public void markFeedRead(string feedID)
- {
- var query = new QueryBuilder(QueryType.UPDATE, "main.articles");
- query.updateValuePair("unread", ArticleStatus.READ.to_string());
- query.addEqualsCondition("feedID", feedID, true, true);
- executeSQL(query.build());
- }
-
- public void markAllRead()
- {
- var query1 = new QueryBuilder(QueryType.UPDATE, "main.articles");
- query1.updateValuePair("unread", ArticleStatus.READ.to_string());
- executeSQL(query1.build());
- }
-
- public void reset_subscribed_flag()
- {
- executeSQL("UPDATE main.feeds SET \"subscribed\" = 0");
- }
-
- public void reset_exists_tag()
- {
- executeSQL("UPDATE main.tags SET \"exists\" = 0");
- }
-
- public void reset_exists_flag()
- {
- executeSQL("UPDATE main.categories SET \"exists\" = 0");
- }
-
- public void delete_unsubscribed_feeds()
- {
- Logger.warning("dbDaemon: Deleting unsibscribed feeds");
- executeSQL("DELETE FROM main.feeds WHERE \"subscribed\" = 0");
- }
-
-
- public void delete_nonexisting_categories()
- {
- Logger.warning("dbDaemon: Deleting nonexisting categories");
- executeSQL("DELETE FROM main.categories WHERE \"exists\" = 0");
- }
-
- public void delete_nonexisting_tags()
- {
- Logger.warning("dbDaemon: Deleting nonexisting tags");
- executeSQL("DELETE FROM main.tags WHERE \"exists\" = 0");
- }
-
- public void delete_articles_without_feed()
- {
- Logger.warning("dbDaemon: Deleting articles without feed");
- var query = new QueryBuilder(QueryType.SELECT, "main.feeds");
- query.selectField("feed_id");
- query.addEqualsCondition("subscribed", "0", true, false);
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error("dbDaemon: delete_articles_without_feed: %d: %s".printf(sqlite_db.errcode(), sqlite_db.errmsg()));
- }
-
- while(stmt.step () == Sqlite.ROW)
- {
- delete_articles(stmt.column_text(0));
- }
- }
-
- public void delete_articles(string feedID)
- {
- Logger.warning("dbDaemon: Deleting all articles of feed \"%s\"".printf(feedID));
- executeSQL("DELETE FROM main.articles WHERE feedID = \"" + feedID + "\"");
- string folder_path = GLib.Environment.get_user_data_dir() + "/feedreader/data/images/%s/".printf(feedID);
- Utils.remove_directory(folder_path);
- }
-
- public void delete_category(string catID)
- {
- executeSQL("DELETE FROM main.categories WHERE categorieID = \"" + catID + "\"");
-
- if(FeedServer.get_default().supportMultiCategoriesPerFeed())
- {
- var query = new QueryBuilder(QueryType.SELECT, "feeds");
- query.selectField("feed_id, category_id");
- query.addCustomCondition("instr(category_id, \"%s\") > 0".printf(catID));
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error("delete_articles: " + sqlite_db.errmsg());
- }
-
- while(stmt.step () == Sqlite.ROW)
- {
- string feedID = stmt.column_text(0);
- string catIDs = stmt.column_text(0).replace(catID + ",", "");
-
- executeSQL("UPDATE main.feeds set category_id = \"" + catIDs + "\" WHERE feed_id = \"" + feedID + "\"");
- }
- }
- else
- {
- executeSQL("UPDATE main.feeds set category_id = \"%s\" WHERE category_id = \"%s\"".printf(FeedServer.get_default().uncategorizedID(), catID));
-
- if(FeedServer.get_default().supportMultiLevelCategories())
- {
- executeSQL("UPDATE main.categories set Parent = \"-2\" WHERE categorieID = \"" + catID + "\"");
- }
- }
- }
-
- public void rename_category(string catID, string newName)
- {
-
- if(FeedServer.get_default().tagIDaffectedByNameChange())
- {
- var cat = read_category(catID);
- string newID = catID.replace(cat.getTitle(), newName);
- var query2 = new QueryBuilder(QueryType.UPDATE, "categories");
- query2.updateValuePair("categorieID", newID, true);
- query2.addEqualsCondition("categorieID", catID, true, true);
- executeSQL(query2.build());
- query2.print();
-
- var query3 = new QueryBuilder(QueryType.UPDATE, "feeds");
- query3.updateValuePair("category_id", "replace(category_id, '%s', '%s')".printf(catID, newID));
- query3.addCustomCondition("instr(category_id, '%s')".printf(catID));
- executeSQL(query3.build());
- query3.print();
-
- var query = new QueryBuilder(QueryType.UPDATE, "categories");
- query.updateValuePair("title", newName, true);
- query.addEqualsCondition("categorieID", newID, true, true);
- executeSQL(query.build());
- }
- else
- {
- var query = new QueryBuilder(QueryType.UPDATE, "categories");
- query.updateValuePair("title", newName, true);
- query.addEqualsCondition("categorieID", catID, true, true);
- executeSQL(query.build());
- }
-
-
- }
-
- public void move_category(string catID, string newParentID)
- {
- var parent = read_category(newParentID);
- var query = new QueryBuilder(QueryType.UPDATE, "categories");
- query.updateValuePair("Parent", newParentID);
- query.updateValuePair("Level", "%i".printf(parent.getLevel()+1));
- query.addEqualsCondition("categorieID", catID);
- executeSQL(query.build());
- }
-
- public void rename_feed(string feedID, string newName)
- {
- var query = new QueryBuilder(QueryType.UPDATE, "feeds");
- query.updateValuePair("name", newName, true);
- query.addEqualsCondition("feed_id", feedID, true, true);
- executeSQL(query.build());
- }
-
- public void move_feed(string feedID, string currentCatID, string? newCatID = null)
- {
- var Feed = dbDaemon.get_default().read_feed(feedID);
- var catArray = Feed.getCatIDs();
-
- if(Feed.hasCat(currentCatID))
- {
- string[] newCatArray = {};
-
- foreach(string catID in catArray)
- {
- if(catID != currentCatID)
- {
- newCatArray += catID;
- }
- }
-
- catArray = newCatArray;
- }
-
- if(newCatID != null)
- catArray += newCatID;
-
- string catString = "";
-
- for(int i = 0; i < catArray.length; i++)
- {
- catString += catArray[i];
- if(i < catArray.length-1)
- catString += ",";
- }
-
- var query = new QueryBuilder(QueryType.UPDATE, "feeds");
- query.updateValuePair("category_id", catString, true);
- query.addEqualsCondition("feed_id", feedID, true, true);
- executeSQL(query.build());
- }
-
- public void rename_tag(string tagID, string newName)
- {
- if(FeedServer.get_default().tagIDaffectedByNameChange())
- {
- var tag = read_tag(tagID);
- string newID = tagID.replace(tag.getTitle(), newName);
- var query2 = new QueryBuilder(QueryType.UPDATE, "tags");
- query2.updateValuePair("tagID", newID, true);
- query2.addEqualsCondition("tagID", tagID, true, true);
- executeSQL(query2.build());
- query2.print();
-
- var query3 = new QueryBuilder(QueryType.UPDATE, "articles");
- query3.updateValuePair("tags", "replace(tags, '%s', '%s')".printf(tagID, newID));
- query3.addCustomCondition("instr(tags, '%s')".printf(tagID));
- executeSQL(query3.build());
- query3.print();
-
- var query = new QueryBuilder(QueryType.UPDATE, "tags");
- query.updateValuePair("title", newName, true);
- query.addEqualsCondition("tagID", newID, true, true);
- executeSQL(query.build());
- }
- else
- {
- var query = new QueryBuilder(QueryType.UPDATE, "tags");
- query.updateValuePair("title", newName, true);
- query.addEqualsCondition("tagID", tagID, true, true);
- executeSQL(query.build());
- }
- }
-
- public void removeCatFromFeed(string feedID, string catID)
- {
- var feed = read_feed(feedID);
- var query = new QueryBuilder(QueryType.UPDATE, "feeds");
- query.updateValuePair("category_id", feed.getCatString().replace(catID + ",", ""), true);
- query.addEqualsCondition("feed_id", feedID, true, true);
- executeSQL(query.build());
- }
-
- public void delete_feed(string feedID)
- {
- executeSQL("DELETE FROM feeds WHERE feed_id = \"%s\"".printf(feedID));
- delete_articles(feedID);
- }
-
- public void addCachedAction(CachedActions action, string id, string? argument = "")
- {
- executeSQL("BEGIN TRANSACTION");
-
- var query = new QueryBuilder(QueryType.INSERT_OR_IGNORE, "main.CachedActions");
- query.insertValuePair("action", "$ACTION");
- query.insertValuePair("id", "$ID");
- query.insertValuePair("argument", "$ARGUMENT");
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2 (query.get(), query.get().length, out stmt);
- if (ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error("addCachedAction: " + sqlite_db.errmsg());
- }
-
-
- int action_position = stmt.bind_parameter_index("$ACTION");
- int id_position = stmt.bind_parameter_index("$ID");
- int argument_position = stmt.bind_parameter_index("$ARGUMENT");
- assert (action_position > 0);
- assert (id_position > 0);
- assert (argument_position > 0);
-
- stmt.bind_int (action_position, action);
- stmt.bind_text(id_position, id);
- stmt.bind_text(argument_position, argument);
-
- while (stmt.step () == Sqlite.ROW) {}
- stmt.reset ();
-
- executeSQL("COMMIT TRANSACTION");
- }
-
-
- public Gee.ArrayList<CachedAction> readCachedActions()
- {
- Gee.ArrayList<CachedAction> tmp = new Gee.ArrayList<CachedAction>();
-
- var query = new QueryBuilder(QueryType.SELECT, "CachedActions");
- query.selectField("*");
- query.build();
- query.print();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error(query.get());
- Logger.error("readCachedActions: " + sqlite_db.errmsg());
- }
-
- while(stmt.step () == Sqlite.ROW)
- {
- var action = new CachedAction((CachedActions)stmt.column_int(0), stmt.column_text(1), stmt.column_text(2));
- action.print();
- tmp.add(action);
- }
-
- return tmp;
- }
-
- public void resetCachedActions()
- {
- Logger.warning("resetCachedActions");
- executeSQL("DELETE FROM CachedActions");
- }
-
- public bool cachedActionNecessary(CachedAction action)
- {
- var query = new QueryBuilder(QueryType.SELECT, "CachedActions");
- query.selectField("count(*)");
- query.addEqualsCondition("argument", action.getArgument(), true, true);
- query.addEqualsCondition("id", action.getID(), true, true);
- query.addEqualsCondition("action", "%i".printf(action.opposite()));
- query.build();
-
- Sqlite.Statement stmt;
- int ec = sqlite_db.prepare_v2(query.get(), query.get().length, out stmt);
- if(ec != Sqlite.OK)
- {
- Logger.error("cachedActionNecessary - %s".printf(sqlite_db.errmsg()));
- Logger.error(query.get());
- }
-
- while(stmt.step () == Sqlite.ROW)
- {
- if(stmt.column_int(0) > 0)
- return false;
- }
-
- return true;
- }
-
- public void deleteOppositeCachedAction(CachedAction action)
- {
- var query = new QueryBuilder(QueryType.DELETE, "CachedActions");
- query.addEqualsCondition("argument", action.getArgument(), true, true);
- query.addEqualsCondition("id", action.getID(), true, true);
- query.addEqualsCondition("action", "%i".printf(action.opposite()));
- executeSQL(query.build());
- query.print();
- }
-
- protected override bool showCategory(string catID, Gee.ArrayList<feed> feeds)
- {
- if(FeedServer.get_default().hideCagetoryWhenEmtpy(catID)
- && !Utils.categoryIsPopulated(catID, feeds))
- {
- return false;
- }
- return true;
- }
-
- protected override string getUncategorizedQuery()
- {
- string catID = FeedServer.get_default().uncategorizedID();
- return "category_id = \"%s\"".printf(catID);
- }
-
-}
diff --git a/src/dbUI.vala b/src/dbUI.vala
deleted file mode 100644
index 7c95dffd..00000000
--- a/src/dbUI.vala
+++ /dev/null
@@ -1,70 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see <http://www.gnu.org/licenses/>.
-
-public class FeedReader.dbUI : dbBase {
-
- private static dbUI? m_dataBase = null;
-
- public static new dbUI get_default()
- {
- if(m_dataBase == null)
- {
- m_dataBase = new dbUI();
- if(m_dataBase.uninitialized())
- m_dataBase.init();
- }
-
-
- return m_dataBase;
- }
-
- public dbUI(string dbFile = "feedreader-04.db")
- {
- base(dbFile);
- }
-
- protected override bool showCategory(string catID, Gee.ArrayList<feed> feeds)
- {
- try
- {
- if(DBusConnection.get_default().hideCagetoryWhenEmtpy(catID)
- && !Utils.categoryIsPopulated(catID, feeds))
- {
- return false;
- }
- }
- catch(GLib.Error e)
- {
- Logger.error("dbUI.showCategory: %s".printf(e.message));
- }
- return true;
- }
-
- protected override string getUncategorizedQuery()
- {
- try
- {
- string catID = DBusConnection.get_default().uncategorizedID();
- return "category_id = \"%s\"".printf(catID);
- }
- catch(GLib.Error e)
- {
- Logger.error("dbUI.showCategory: %s".printf(e.message));
- }
-
- return "";
- }
-
-}
diff --git a/update_pot.sh b/update_pot.sh
deleted file mode 100755
index 0810cc4e..00000000
--- a/update_pot.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/sh
-# A modified code from the Terminix project<https://github.com/gnunn1/terminix/>.
-DOMAIN=FeedReader
-BASEDIR=$(dirname $0)
-OUTPUT_FILE=${BASEDIR}/po/${DOMAIN}.pot
-
-echo "Extracting translatable strings... "
-
-find ${BASEDIR}/ -name '*.vala' | xgettext \
- --output $OUTPUT_FILE \
- --files-from=- \
- --directory=$BASEDIR \
- --language=Vala \
- --keyword=C_:1c,2 \
- --from-code=utf-8
- --from-code=utf-8
-
-xgettext \
- --join-existing \
- --output $OUTPUT_FILE \
- --default-domain=$DOMAIN \
- --package-name=$DOMAIN \
- --directory=$BASEDIR \
- --foreign-user \
- --language=Desktop \
- ${BASEDIR}/data/feedreader.desktop.in
-
-xgettext \
- --join-existing \
- --output $OUTPUT_FILE \
- --default-domain=$DOMAIN \
- --package-name=$DOMAIN \
- --directory=$BASEDIR \
- --foreign-user \
- --language=Desktop \
- ${BASEDIR}/data/feedreader-autostart.desktop.in
-
-xgettext \
- --join-existing \
- --output $OUTPUT_FILE \
- --default-domain=$DOMAIN \
- --package-name=$DOMAIN \
- --directory=$BASEDIR \
- --foreign-user \
- --language=appdata \
- ${BASEDIR}/data/feedreader.appdata.xml.in
-
-# Merge the messages with existing po files
-echo "Merging with existing translations... "
-for file in ${BASEDIR}/po/*.po
-do
- echo -n $file
- msgmerge --update $file $OUTPUT_FILE
-done
diff --git a/vapi/gtkimageview.vapi b/vapi/gtkimageview.vapi
index a7ab5366..fb421699 100644
--- a/vapi/gtkimageview.vapi
+++ b/vapi/gtkimageview.vapi
@@ -3,28 +3,28 @@
namespace Gtk {
[CCode (cheader_filename = "gtkimageview.h")]
public class ImageView : Gtk.Widget {
- public ImageView ();
+ public ImageView ();
- public bool fit_allocation { get; set; }
- public bool scale_set { get; }
- public bool transitions_enabled { get; set; }
- public bool zoomable { get; set; }
- public bool rotatable { get; set; }
- public bool snap_angle { get; set; }
- public double angle { get; set; }
- public double scale { get; set; }
+ public bool fit_allocation { get; set; }
+ public bool scale_set { get; }
+ public bool transitions_enabled { get; set; }
+ public bool zoomable { get; set; }
+ public bool rotatable { get; set; }
+ public bool snap_angle { get; set; }
+ public double angle { get; set; }
+ public double scale { get; set; }
- public async void load_from_stream_async (GLib.InputStream input_stream,
- int scale_factor,
- GLib.Cancellable? cancellable = null);
+ public async void load_from_stream_async (GLib.InputStream input_stream,
+ int scale_factor,
+ GLib.Cancellable? cancellable = null);
- public async void load_from_file_async (GLib.File file,
- int scale_factor,
- GLib.Cancellable? cancellable = null) throws GLib.Error;
+ public async void load_from_file_async (GLib.File file,
+ int scale_factor,
+ GLib.Cancellable? cancellable = null) throws GLib.Error;
- public void set_animation (Gdk.PixbufAnimation animation);
- public void set_pixbuf (Gdk.Pixbuf pixbuf);
- public void set_surface (Cairo.Surface? surface);
+ public void set_animation (Gdk.PixbufAnimation animation);
+ public void set_pixbuf (Gdk.Pixbuf pixbuf);
+ public void set_surface (Cairo.Surface? surface);
}
}
diff --git a/vapi/libvilistextum.vapi b/vapi/libvilistextum.vapi
index bab31274..b8be5548 100644
--- a/vapi/libvilistextum.vapi
+++ b/vapi/libvilistextum.vapi
@@ -1,5 +1,5 @@
[CCode(cheader_filename = "vilistextum.h")]
namespace libVilistextum {
- [CCode(cname = "vilistextum")]
- public string? parse(string text, int extractText);
+ [CCode(cname = "vilistextum")]
+ public static string? parse(string text, int extractText);
}
diff --git a/vapi/sqlite3.vapi b/vapi/sqlite3.vapi
new file mode 100644
index 00000000..9925ff1a
--- /dev/null
+++ b/vapi/sqlite3.vapi
@@ -0,0 +1,460 @@
+/* sqlite3.vala
+ *
+ * Copyright (C) 2007 Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Jürg Billeter <j@bitron.ch>
+ */
+
+[CCode (lower_case_cprefix = "sqlite3_", cheader_filename = "sqlite3.h")]
+namespace Sqlite {
+ /* Database Connection Handle */
+ [Compact]
+ [CCode (free_function = "sqlite3_close", cname = "sqlite3", cprefix = "sqlite3_")]
+ public class Database {
+ public int busy_timeout (int ms);
+ public int changes ();
+ [CCode (cname = "sqlite3_exec")]
+ public int _exec (string sql, Callback? callback = null, [CCode (type = "char**")] out unowned string? errmsg = null);
+ [CCode (cname = "_sqlite3_exec")]
+ public int exec (string sql, Callback? callback = null, out string? errmsg = null) {
+ unowned string? sqlite_errmsg;
+ var ec = this._exec (sql, callback, out sqlite_errmsg);
+ if (&errmsg != null) {
+ errmsg = sqlite_errmsg;
+ }
+ Sqlite.Memory.free ((void*) sqlite_errmsg);
+ return ec;
+ }
+ public int extended_result_codes (int onoff);
+ public int get_autocommit ();
+ public void interrupt ();
+ public int64 last_insert_rowid ();
+ public int limit (Sqlite.Limit id, int new_val);
+ public int total_changes ();
+ public int complete (string sql);
+ [CCode (cname = "sqlite3_get_table")]
+ public int _get_table (string sql, [CCode (array_length = false)] out unowned string[] resultp, out int nrow, out int ncolumn, [CCode (type = "char**")] out unowned string? errmsg = null);
+ private static void free_table ([CCode (array_length = false)] string[] result);
+ [CCode (cname = "_sqlite3_get_table")]
+ public int get_table (string sql, out string[] resultp, out int nrow, out int ncolumn, out string? errmsg = null) {
+ unowned string? sqlite_errmsg;
+ unowned string[] sqlite_resultp;
+
+ var ec = this._get_table (sql, out sqlite_resultp, out nrow, out ncolumn, out sqlite_errmsg);
+
+ resultp = new string[(nrow + 1) * ncolumn];
+ for (var entry = 0 ; entry < resultp.length ; entry++ ) {
+ resultp[entry] = sqlite_resultp[entry];
+ }
+ Sqlite.Database.free_table (sqlite_resultp);
+
+ if (&errmsg != null) {
+ errmsg = sqlite_errmsg;
+ }
+ Sqlite.Memory.free ((void*) sqlite_errmsg);
+ return ec;
+ }
+ public static int open (string filename, out Database db);
+ public static int open_v2 (string filename, out Database db, int flags = OPEN_READWRITE | OPEN_CREATE, string? zVfs = null);
+ public int errcode ();
+ public unowned string errmsg ();
+ public unowned Sqlite.Statement next_stmt (Sqlite.Statement? current);
+ public int prepare (string sql, int n_bytes, out Statement stmt, out unowned string tail = null);
+ public int prepare_v2 (string sql, int n_bytes, out Statement stmt, out unowned string tail = null);
+ public int set_authorizer (AuthorizeCallback? auth);
+ [CCode (cname = "sqlite3_db_status")]
+ public int status (Sqlite.DatabaseStatus op, out int pCurrent, out int pHighwater, int resetFlag = 0);
+ public int table_column_metadata (string db_name, string table_name, string column_name, out string? data_type, out string? collation_sequence, out int? not_null, out int? primary_key, out int? auto_increment);
+ public void trace (TraceCallback? xtrace);
+ public void profile (ProfileCallback? xprofile);
+ public void progress_handler (int n_opcodes, Sqlite.ProgressCallback? progress_handler);
+ public void commit_hook (CommitCallback? commit_hook);
+ public void rollback_hook (RollbackCallback? rollback_hook);
+ public void update_hook (UpdateCallback? update_hook);
+ public int create_function (string zFunctionName, int nArg, int eTextRep, void * user_data, UserFuncCallback? xFunc, UserFuncCallback? xStep, UserFuncFinishCallback? xFinal);
+ public int create_function_v2 (string zFunctionName, int nArg, int eTextRep, void * user_data, UserFuncCallback? xFunc, UserFuncCallback? xStep, UserFuncFinishCallback? xFinal, GLib.DestroyNotify? destroy = null);
+ public int create_collation (string zName, int eTextRep, [CCode (delegate_target_pos = 2.9, type = "int (*)(void *, int, const void *, int, const void *)")] CompareCallback xCompare);
+
+ public int wal_autocheckpoint (int N);
+ public int wal_checkpoint (string zDb);
+ public void* wal_hook (WALHookCallback cb, string db_name, int page_count);
+ }
+
+ [CCode (instance_pos = 0)]
+ public delegate int AuthorizeCallback (Sqlite.Action action, string? p1, string? p2, string db_name, string? responsible);
+ [CCode (instance_pos = 0)]
+ public delegate void TraceCallback (string message);
+ [CCode (instance_pos = 0)]
+ public delegate void ProfileCallback (string sql, uint64 time);
+ public delegate int ProgressCallback ();
+ public delegate int CommitCallback ();
+ public delegate void RollbackCallback ();
+ [CCode (has_target = false)]
+ public delegate void UserFuncCallback (Sqlite.Context context, [CCode (array_length_pos = 1.1)] Sqlite.Value[] values);
+ [CCode (has_target = false)]
+ public delegate void UserFuncFinishCallback (Sqlite.Context context);
+ [CCode (instance_pos = 0)]
+ public delegate void UpdateCallback (Sqlite.Action action, string dbname, string table, int64 rowid);
+ [CCode (instance_pos = 0)]
+ public delegate int CompareCallback (int alen, void* a, int blen, void* b);
+ [CCode (instance_pos = 0)]
+ public delegate int WALHookCallback (Sqlite.Database db, string dbname, int pages);
+
+ public unowned string? compileoption_get (int n);
+ public int compileoption_used (string option_name);
+ public static int complete (string sql);
+ [CCode (sentinel = "")]
+ public static int config (Sqlite.Config op, ...);
+ public unowned string libversion ();
+ public int libversion_number ();
+ [PrintfFormat]
+ public void log (int error_code, string format, ...);
+ public unowned string sourceid ();
+ public static int status (Sqlite.Status op, out int pCurrent, out int pHighwater, int resetFlag = 0);
+ public static int threadsafe ();
+
+ [CCode (cname = "SQLITE_VERSION")]
+ public const string VERSION;
+ [CCode (cname = "SQLITE_VERSION_NUMBER")]
+ public const int VERSION_NUMBER;
+ [CCode (cname = "SQLITE_SOURCE_ID")]
+ public const string SOURCE_ID;
+
+ /* Dynamically Typed Value Object */
+ [Compact]
+ [Immutable]
+ [CCode (cname = "sqlite3_value", copy_function = "sqlite3_value_dup", free_function = "sqlite3_value_free")]
+ public class Value {
+ [CCode (cname = "sqlite3_value_blob")]
+ public void* to_blob ();
+ [CCode (cname = "sqlite3_value_bytes")]
+ public int to_bytes ();
+ [CCode (cname = "sqlite3_value_double")]
+ public double to_double ();
+ [CCode (cname = "sqlite3_value_int")]
+ public int to_int ();
+ [CCode (cname = "sqlite3_value_int64")]
+ public int64 to_int64 ();
+ [CCode (cname = "sqlite3_value_text")]
+ public unowned string to_string ();
+ [CCode (cname = "sqlite3_value_type")]
+ public int to_type ();
+ [CCode (cname = "sqlite3_value_numeric_type")]
+ public int to_numeric_type ();
+ [CCode (cname = "sqlite3_value_dup")]
+ public Value copy ();
+ }
+
+ [CCode (cname = "sqlite3_callback", instance_pos = 0)]
+ public delegate int Callback (int n_columns, [CCode (array_length = false)] string[] values, [CCode (array_length = false)] string[] column_names);
+
+ [CCode (cname = "SQLITE_OK")]
+ public const int OK;
+ [CCode (cname = "SQLITE_ERROR")]
+ public const int ERROR;
+ [CCode (cname = "SQLITE_INTERNAL")]
+ public const int INTERNAL;
+ [CCode (cname = "SQLITE_PERM")]
+ public const int PERM;
+ [CCode (cname = "SQLITE_ABORT")]
+ public const int ABORT;
+ [CCode (cname = "SQLITE_BUSY")]
+ public const int BUSY;
+ [CCode (cname = "SQLITE_LOCKED")]
+ public const int LOCKED;
+ [CCode (cname = "SQLITE_NOMEM")]
+ public const int NOMEM;
+ [CCode (cname = "SQLITE_READONLY")]
+ public const int READONLY;
+ [CCode (cname = "SQLITE_INTERRUPT")]
+ public const int INTERRUPT;
+ [CCode (cname = "SQLITE_IOERR")]
+ public const int IOERR;
+ [CCode (cname = "SQLITE_CORRUPT")]
+ public const int CORRUPT;
+ [CCode (cname = "SQLITE_NOTFOUND")]
+ public const int NOTFOUND;
+ [CCode (cname = "SQLITE_FULL")]
+ public const int FULL;
+ [CCode (cname = "SQLITE_CANTOPEN")]
+ public const int CANTOPEN;
+ [CCode (cname = "SQLITE_PROTOCOL")]
+ public const int PROTOCOL;
+ [CCode (cname = "SQLITE_EMPTY")]
+ public const int EMPTY;
+ [CCode (cname = "SQLITE_SCHEMA")]
+ public const int SCHEMA;
+ [CCode (cname = "SQLITE_TOOBIG")]
+ public const int TOOBIG;
+ [CCode (cname = "SQLITE_CONSTRAINT")]
+ public const int CONSTRAINT;
+ [CCode (cname = "SQLITE_MISMATCH")]
+ public const int MISMATCH;
+ [CCode (cname = "SQLITE_MISUSE")]
+ public const int MISUSE;
+ [CCode (cname = "SQLITE_NOLFS")]
+ public const int NOLFS;
+ [CCode (cname = "SQLITE_AUTH")]
+ public const int AUTH;
+ [CCode (cname = "SQLITE_FORMAT")]
+ public const int FORMAT;
+ [CCode (cname = "SQLITE_RANGE")]
+ public const int RANGE;
+ [CCode (cname = "SQLITE_NOTADB")]
+ public const int NOTADB;
+ [CCode (cname = "SQLITE_ROW")]
+ public const int ROW;
+ [CCode (cname = "SQLITE_DONE")]
+ public const int DONE;
+ [CCode (cname = "SQLITE_OPEN_READONLY")]
+ public const int OPEN_READONLY;
+ [CCode (cname = "SQLITE_OPEN_READWRITE")]
+ public const int OPEN_READWRITE;
+ [CCode (cname = "SQLITE_OPEN_CREATE")]
+ public const int OPEN_CREATE;
+ [CCode (cname = "SQLITE_INTEGER")]
+ public const int INTEGER;
+ [CCode (cname = "SQLITE_FLOAT")]
+ public const int FLOAT;
+ [CCode (cname = "SQLITE_BLOB")]
+ public const int BLOB;
+ [CCode (cname = "SQLITE_NULL")]
+ public const int NULL;
+ [CCode (cname = "SQLITE3_TEXT")]
+ public const int TEXT;
+ [CCode (cname = "SQLITE_MUTEX_FAST")]
+ public const int MUTEX_FAST;
+ [CCode (cname = "SQLITE_MUTEX_RECURSIVE")]
+ public const int MUTEX_RECURSIVE;
+ [CCode (cname = "SQLITE_UTF8")]
+ public const int UTF8;
+ [CCode (cname = "SQLITE_UTF16LE")]
+ public const int UTF16LE;
+ [CCode (cname = "SQLITE_UTF16BE")]
+ public const int UTF16BE;
+ [CCode (cname = "SQLITE_UTF16")]
+ public const int UTF16;
+ [CCode (cname = "SQLITE_ANY")]
+ public const int ANY;
+ [CCode (cname = "SQLITE_UTF16_ALIGNED")]
+ public const int UTF16_ALIGNED;
+
+ [CCode (cname = "int", cprefix = "SQLITE_", has_type_id = false)]
+ public enum Action {
+ CREATE_INDEX,
+ CREATE_TABLE,
+ CREATE_TEMP_INDEX,
+ CREATE_TEMP_TABLE,
+ CREATE_TEMP_TRIGGER,
+ CREATE_TEMP_VIEW,
+ CREATE_TRIGGER,
+ CREATE_VIEW,
+ DELETE,
+ DROP_INDEX,
+ DROP_TABLE,
+ DROP_TEMP_INDEX,
+ DROP_TEMP_TABLE,
+ DROP_TEMP_TRIGGER,
+ DROP_TEMP_VIEW,
+ DROP_TRIGGER,
+ DROP_VIEW,
+ INSERT,
+ PRAGMA,
+ READ,
+ SELECT,
+ TRANSACTION,
+ UPDATE,
+ ATTACH,
+ DETACH,
+ ALTER_TABLE,
+ REINDEX,
+ ANALYZE,
+ CREATE_VTABLE,
+ DROP_VTABLE,
+ FUNCTION,
+ SAVEPOINT,
+ COPY
+ }
+
+ [CCode (cname = "int", cprefix = "SQLITE_CONFIG_", has_type_id = false)]
+ public enum Config {
+ SINGLETHREAD,
+ MULTITHREAD,
+ SERIALIZED,
+ MALLOC,
+ GETMALLOC,
+ SCRATCH,
+ PAGECACHE,
+ HEAP,
+ MEMSTATUS,
+ MUTEX,
+ GETMUTEX,
+ LOOKASIDE,
+ PCACHE,
+ GETPCACHE,
+ LOG,
+ }
+
+ [CCode (cname = "int", cprefix = "SQLITE_DBSTATUS_", has_type_id = false)]
+ public enum DatabaseStatus {
+ LOOKASIDE_USED
+ }
+
+ [CCode (cname = "int", cprefix = "SQLITE_LIMIT_", has_type_id = false)]
+ public enum Limit {
+ LENGTH,
+ SQL_LENGTH,
+ COLUMN,
+ EXPR_DEPTH,
+ COMPOUND_SELECT,
+ VDBE_OP,
+ FUNCTION_ARG,
+ ATTACHED,
+ LIKE_PATTERN_LENGTH,
+ VARIABLE_NUMBER,
+ TRIGGER_DEPTH
+ }
+
+ [CCode (cname = "int", cprefix = "SQLITE_STMTSTATUS_", has_type_id = false)]
+ public enum StatementStatus {
+ FULLSCAN_STEP,
+ SORT
+ }
+
+ [CCode (cname = "int", cprefix = "SQLITE_STATUS_", has_type_id = false)]
+ public enum Status {
+ MEMORY_USED,
+ PAGECACHE_USED,
+ PAGECACHE_OVERFLOW,
+ SCRATCH_USED,
+ SCRATCH_OVERFLOW,
+ MALLOC_SIZE,
+ PARSER_STACK,
+ PAGECACHE_SIZE,
+ SCRATCH_SIZE
+ }
+
+ /* SQL Statement Object */
+ [Compact]
+ [CCode (free_function = "sqlite3_finalize", cname = "sqlite3_stmt", cprefix = "sqlite3_")]
+ public class Statement {
+ public int bind_parameter_count ();
+ public int bind_parameter_index (string name);
+ public unowned string bind_parameter_name (int index);
+ public int clear_bindings ();
+ public int column_count ();
+ public int data_count ();
+ public unowned Database db_handle ();
+ public int reset ();
+ [CCode (cname = "sqlite3_stmt_status")]
+ public int status (Sqlite.StatementStatus op, int resetFlg = 0);
+ public int step ();
+ public int bind_blob (int index, void* value, int n, GLib.DestroyNotify? destroy_notify = null);
+ public int bind_double (int index, double value);
+ public int bind_int (int index, int value);
+ public int bind_int64 (int index, int64 value);
+ public int bind_null (int index);
+ [CCode (cname = "sqlite3_bind_text")]
+ public int _bind_text (int index, string value, int n = -1, GLib.DestroyNotify? destroy_notify = null);
+ public int bind_text (int index, owned string value, int n = -1, GLib.DestroyNotify destroy_notify = GLib.g_free);
+ public int bind_value (int index, Value value);
+ public int bind_zeroblob (int index, int n);
+ public void* column_blob (int col);
+ public int column_bytes (int col);
+ public double column_double (int col);
+ public int column_int (int col);
+ public int64 column_int64 (int col);
+ public unowned string? column_text (int col);
+ public int column_type (int col);
+ public unowned Value column_value (int col);
+ public unowned string column_name (int index);
+ public unowned string column_database_name (int col);
+ public unowned string column_table_name (int col);
+ public unowned string column_origin_name (int col);
+ public unowned string sql ();
+ }
+
+ namespace Memory {
+ [CCode (cname = "sqlite3_malloc")]
+ public static void* malloc (int n_bytes);
+ [CCode (cname = "sqlite3_realloc")]
+ public static void* realloc (void* mem, int n_bytes);
+ [CCode (cname = "sqlite3_free")]
+ public static void free (void* mem);
+ [CCode (cname = "sqlite3_release_memory")]
+ public static int release (int bytes);
+ [CCode (cname = "sqlite3_memory_used")]
+ public static int64 used ();
+ [CCode (cname = "sqlite3_memory_highwater")]
+ public static int64 highwater (int reset = 0);
+ [Version (deprecated_since = "3.7.2", replacement = "Sqlite.Memory.soft_heap_limit64")]
+ [CCode (cname = "sqlite3_soft_heap_limit")]
+ public static void soft_heap_limit (int limit);
+ [CCode (cname = "sqlite3_soft_heap_limit64")]
+ public static int64 soft_heap_limit64 (int64 limit = -1);
+ }
+
+ [Compact]
+ [CCode (cname = "sqlite3_mutex")]
+ public class Mutex {
+ [CCode (cname = "sqlite3_mutex_alloc")]
+ public Mutex (int mutex_type = MUTEX_RECURSIVE);
+ public void enter ();
+ public int held ();
+ public int notheld ();
+ public int @try ();
+ public void leave ();
+ }
+
+ [Compact, CCode (cname = "sqlite3_context", cprefix = "sqlite3_")]
+ public class Context {
+ public void result_blob (owned uint8[] data, GLib.DestroyNotify? destroy_notify = GLib.g_free);
+ public void result_double (double value);
+ public void result_error (string value, int error_code);
+ public void result_error_toobig ();
+ public void result_error_nomem ();
+ public void result_error_code (int error_code);
+ public void result_int (int value);
+ public void result_int64 (int64 value);
+ public void result_null ();
+ public void result_text (owned string value, int length = -1, GLib.DestroyNotify? destroy_notify = GLib.g_free);
+ public void result_value (Sqlite.Value value);
+ public void result_zeroblob (int n);
+
+ [CCode (simple_generics = true)]
+ public unowned T user_data<T> ();
+ [CCode (simple_generics = true)]
+ public void set_auxdata<T> (int N, owned T data);
+ [CCode (simple_generics = true)]
+ public unowned T get_auxdata<T> (int N);
+ [CCode (cname = "sqlite3_context_db_handle")]
+ public unowned Database db_handle ();
+ [CCode (cname = "sqlite3_aggregate_context")]
+ public void * aggregate (int n_bytes);
+ }
+
+ [Compact, CCode (cname = "sqlite3_backup", free_function = "sqlite3_backup_finish", cprefix = "sqlite3_backup_")]
+ public class Backup {
+ [CCode (cname = "sqlite3_backup_init")]
+ public Backup (Database dest, string dest_name, Database source, string source_name);
+ public int step (int nPage);
+ public int remaining ();
+ public int pagecount ();
+ }
+}
+