mirror of
https://github.com/martinrotter/rssguard.git
synced 2025-01-25 13:38:44 +01:00
Merge branch 'master' of github.com:martinrotter/rssguard
This commit is contained in:
commit
338f03228d
@ -283,22 +283,24 @@ Klikněte sem pro otevření nadřazeného adresáře.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Status auto-aktualizace: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>nepoužívá auto-aktualizace</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>používá globální nastavení (%n minuta do další aktualizace)</numerusform><numerusform>používá globální nastavení (%n minuty do další aktualizace)</numerusform><numerusform>používá globální nastavení (%n minut do další aktualizace)</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses specific settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>používá specifické nastavení (%n minuta do další aktualizace)</numerusform><numerusform>používá specifické nastavení (%n minuty do další aktualizace)</numerusform><numerusform>používá specifické nastavení (%n minut do další aktualizace)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -531,7 +533,7 @@ or this functionality is not implemented yet.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>NOT portable</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>NEportable</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1666,7 +1668,7 @@ or this functionality is not implemented yet.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Mark all items as read</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Označit všechny zprávy jako přečtené</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2194,32 +2196,33 @@ Musíte ho nainstalovat manuálně.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Historie verzí</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Dostupné soubory</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download selected update</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Stáhnout vybranou aktualizaci</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to application website to get update packages manually.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Přejděte na web aplikace pro získání balíčku aktualizace manuálně.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (size </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available update files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Dostupné soubory aktualizace</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Package was downloaded successfully.
|
||||
You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Balíček byl úspěšně stažen.
|
||||
Nyní ho můžete nainstalovat.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2244,7 +2247,7 @@ You can install it now.</source>
|
||||
<name>MessageBox</name>
|
||||
<message>
|
||||
<source>Do not show this dialog again.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Znovu toto upozornění nezobrazovat.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2294,8 +2297,8 @@ You can install it now.</source>
|
||||
<translation>obrázek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation>Vždy otevírat odkazy v ext. prohlížeči.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2884,7 +2887,7 @@ File filter for external e-mail selection dialog.</extracomment>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always open links from simple internal text browser in external web browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Odkazy z jednoduchého interního prohlížeče vždy otevírat v externím webovém prohlížeči.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3498,7 +3501,7 @@ ID účtu: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> bytes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>bajtů</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -284,7 +284,7 @@ Auto-update status: %3</source>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>bruger ikke automatisk ajourføring</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
@ -2184,7 +2184,7 @@ You must install it manually.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ændringslog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2284,7 +2284,7 @@ You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -281,12 +281,14 @@ Click here to open parent directory.</source>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Status der automatische Aktualisierung: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>keine automatische Aktualisierung</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
@ -2191,7 +2193,7 @@ You must install it manually.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Changelog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2291,7 +2293,7 @@ You can install it now.</source>
|
||||
<translation>Graphik</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -2320,7 +2320,7 @@ You can install it now.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -2284,7 +2284,7 @@ You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -285,7 +285,7 @@ Auto-update status: %3</source>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ne pas utiliser la mise à jour automatique</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
@ -2189,7 +2189,7 @@ You must install it manually.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Changelog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2289,7 +2289,7 @@ You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -2284,7 +2284,7 @@ You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -281,12 +281,14 @@ Klik disini untuk membuka direktori induk.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Status pembaruan otomatis: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>tidak menggunakan pembaruan otomatis</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
@ -2195,7 +2197,7 @@ Anda harus instal secara manual.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Daftar perubahan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2295,7 +2297,7 @@ You can install it now.</source>
|
||||
<translation>gambar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -282,12 +282,14 @@ Fai clic qui per aprire la cartella genitrice.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Stato aggiornamento automatico: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>non utilizza l'auto-aggiornamento</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
@ -2195,7 +2197,7 @@ Devi installarlo manualmente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Changelog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2295,7 +2297,7 @@ You can install it now.</source>
|
||||
<translation>immagine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -2184,7 +2184,7 @@ You must install it manually.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>変更履歴</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2284,7 +2284,7 @@ You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -283,22 +283,24 @@ Spustelėkite čia, kad atvertumėte virškatalogį.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Automatinio atnaujinimo būsena: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>nenaudoja automatinio atnaujinimo</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>naudoja visuotinius nustatymus (%n minutė iki kito automatinio atnaujinimo)</numerusform><numerusform>naudoja visuotinius nustatymus (%n minutės iki kito automatinio atnaujinimo)</numerusform><numerusform>naudoja visuotinius nustatymus (%n minučių iki kito automatinio atnaujinimo)</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses specific settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>naudoja specifinius nustatymus (%n minutė iki kito automatinio atnaujinimo)</numerusform><numerusform>naudoja specifinius nustatymus (%n minutės iki kito automatinio atnaujinimo)</numerusform><numerusform>naudoja specifinius nustatymus (%n minučių iki kito automatinio atnaujinimo)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -532,7 +534,7 @@ arba šis funkcionalumas dar nėra įgyvendintas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NOT portable</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>NEPERKELIAMI</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1667,7 +1669,7 @@ arba šis funkcionalumas dar nėra įgyvendintas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Mark all items as read</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Žymėti visus elementus kaip &skaitytus</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2197,32 +2199,33 @@ Jūs privalote jį įdiegti rankiniu būdu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Keitimų žurnalas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Prieinami failai</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download selected update</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Atsisiųsti pasirinktą atnaujinimą</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to application website to get update packages manually.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Pereikite į programos svetainę, kad rankiniu būdu gautumėte atnaujinimo paketus.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (size </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation> (dydis </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available update files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Prieinami atnaujinimo failai</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Package was downloaded successfully.
|
||||
You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Paketas buvo sėkmingai atsisiųstas.
|
||||
Jūs dabar galite jį įdiegti.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2247,7 +2250,7 @@ You can install it now.</source>
|
||||
<name>MessageBox</name>
|
||||
<message>
|
||||
<source>Do not show this dialog again.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Daugiau neberodyti šio dialogo.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2297,7 +2300,7 @@ You can install it now.</source>
|
||||
<translation>paveikslas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@ -2887,7 +2890,7 @@ File filter for external e-mail selection dialog.</extracomment>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always open links from simple internal text browser in external web browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visada atverti nuorodas iš paprastos vidinės tekstų naršyklės į išorinę saityno naršyklę</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3501,7 +3504,7 @@ Paskyros ID: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> bytes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation> baitų</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -283,22 +283,24 @@ Klik hier om map te openen.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Auto update status: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>automatisch bijwerken niet gebruiken</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>gebruik algemene instellingen (%n minuut(en) tot volgende auto-update)</numerusform><numerusform>gebruik globale instellingen (%n minut(en) voor volgende automatische update)</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses specific settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>gebruik specifieke instellingen (%n minuut(en) tot volgende auto-update)</numerusform><numerusform>gebruik specifieke instellingen (%n minut(en) tot volgende auto-update)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -532,7 +534,7 @@ of deze functie bestaat nog niet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NOT portable</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>NIET portable</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1667,7 +1669,7 @@ of deze functie bestaat nog niet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Mark all items as read</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Markeer alle items als gelezen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2197,32 +2199,33 @@ Je moet het handmatig installeren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Changelog</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Beschikbare bestanden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download selected update</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Download geselecteerde update</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to application website to get update packages manually.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ga naar Rssguard website om update handmatig te verkrijgen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (size </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(grootte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available update files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Beschikbare update bestanden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Package was downloaded successfully.
|
||||
You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Pakket was succesvol gedownload.
|
||||
Installeer het nu.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2247,7 +2250,7 @@ You can install it now.</source>
|
||||
<name>MessageBox</name>
|
||||
<message>
|
||||
<source>Do not show this dialog again.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Laat deze dialoog niet meer zien</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2297,7 +2300,7 @@ You can install it now.</source>
|
||||
<translation>Beeld</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@ -2885,7 +2888,7 @@ File filter for external e-mail selection dialog.</extracomment>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always open links from simple internal text browser in external web browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Open links altijd van een simpele interne tekstbrowser in de externe browser.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3500,7 +3503,7 @@ Account ID: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> bytes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>bytes</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -284,12 +284,14 @@ Kliknij tutaj, aby otworzyć katalog nadrzędny.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Stan auto-aktualizacji: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>nie używa auto-aktualizacji</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
@ -2198,7 +2200,7 @@ Musisz go zainstalować ręcznie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lista zmian</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
@ -2298,7 +2300,7 @@ You can install it now.</source>
|
||||
<translation>Obraz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -282,22 +282,24 @@ Clique para abrir a pasta de destino.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Status da atualização automática: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>não usa a atualização automática</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>usa configurações globais (%n minuto(s) para a próxima atualização automática)</numerusform><numerusform>usa configurações globais (%n minuto(s) para a próxima atualização automática)</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses specific settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>usa configurações específicas (%n minuto(s) para a próxima atualização automática)</numerusform><numerusform>usa configurações específicas (%n minuto(s) para a próxima atualização automática)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -531,7 +533,7 @@ ou esta função ainda não foi implementada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NOT portable</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>NÃO portátil</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1666,7 +1668,7 @@ ou esta função ainda não foi implementada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Mark all items as read</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Marcar todos os itens como lidos</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2196,32 +2198,33 @@ Você precisa instalá-lo manualmente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Log de alterações</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Arquivos disponíveis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download selected update</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Baixar atualização selecionada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to application website to get update packages manually.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Acesse o site do aplicativo para obter os pacotes de atualização manualmente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (size </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(tamanho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available update files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Arquivos de atualização disponíveis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Package was downloaded successfully.
|
||||
You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O pacote foi baixado com sucesso.
|
||||
Você pode instalá-lo agora.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2246,7 +2249,7 @@ You can install it now.</source>
|
||||
<name>MessageBox</name>
|
||||
<message>
|
||||
<source>Do not show this dialog again.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Não exibir novamente.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2296,7 +2299,7 @@ You can install it now.</source>
|
||||
<translation>imagem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@ -2884,7 +2887,7 @@ File filter for external e-mail selection dialog.</extracomment>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always open links from simple internal text browser in external web browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Sempre abrir links do navegador de texto interno simples no navegador externo.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3498,7 +3501,7 @@ ID da Conta: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> bytes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>bytes</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -282,22 +282,24 @@ Klicka här för att öppna målmappen.</translation>
|
||||
|
||||
Auto-update status: %3</source>
|
||||
<extracomment>Tooltip for feed.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1%2
|
||||
|
||||
Autouppdateringsstatus: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>does not use auto-update</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>uppdateras inte automatiskt</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses global settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>använder global inställning (%n minut till nästa automatiska uppdatering)</numerusform><numerusform>använder globala inställningar (%n minuter till nästa automatiska uppdatering)</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>uses specific settings (%n minute(s) to next auto-update)</source>
|
||||
<extracomment>Describes feed auto-update status.</extracomment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>använder specifik inställning (%n minut till nästa automatiska uppdatering)</numerusform><numerusform>använder specifika inställningar (%n minuter till nästa automatiska uppdatering)</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -531,7 +533,7 @@ att funktionen inte är implementerad än.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NOT portable</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>INTE portabel</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1666,7 +1668,7 @@ att funktionen inte är implementerad än.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Mark all items as read</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Märk alla objekt som lästa</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2195,32 +2197,33 @@ Du måste installera det manuellt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changelog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ändringslogg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tillgängliga filer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download selected update</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ladda ner vald uppdatering</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to application website to get update packages manually.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gå till programmets webbsida för att hämta uppdateringspaketet manuellt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (size </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(storlek</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available update files</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tillgängliga uppdateringsfiler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Package was downloaded successfully.
|
||||
You can install it now.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Paketet har laddats ner.
|
||||
Du kan installera det nu.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2245,7 +2248,7 @@ You can install it now.</source>
|
||||
<name>MessageBox</name>
|
||||
<message>
|
||||
<source>Do not show this dialog again.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visa inte denna dialog igen.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2295,7 +2298,7 @@ You can install it now.</source>
|
||||
<translation>bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Alway open links in external browser.</source>
|
||||
<source>Always open links in external browser.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@ -2881,7 +2884,7 @@ File filter for external e-mail selection dialog.</extracomment>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always open links from simple internal text browser in external web browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Öppna alltid länkar från intern textläsare, i extern webbläsare.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3496,7 +3499,7 @@ Konto-ID: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> bytes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>byte</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
BIN
resources/graphics/misc/nextcloud.png
Executable file
BIN
resources/graphics/misc/nextcloud.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 7.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.7 KiB |
@ -326,7 +326,8 @@ HEADERS += src/core/feeddownloader.h \
|
||||
src/services/standard/atomparser.h \
|
||||
src/services/standard/feedparser.h \
|
||||
src/services/standard/rdfparser.h \
|
||||
src/services/standard/rssparser.h
|
||||
src/services/standard/rssparser.h \
|
||||
src/miscellaneous/serviceoperator.h
|
||||
|
||||
SOURCES += src/core/feeddownloader.cpp \
|
||||
src/core/feedsmodel.cpp \
|
||||
@ -444,7 +445,8 @@ SOURCES += src/core/feeddownloader.cpp \
|
||||
src/services/standard/atomparser.cpp \
|
||||
src/services/standard/feedparser.cpp \
|
||||
src/services/standard/rdfparser.cpp \
|
||||
src/services/standard/rssparser.cpp
|
||||
src/services/standard/rssparser.cpp \
|
||||
src/miscellaneous/serviceoperator.cpp
|
||||
|
||||
FORMS += src/gui/toolbareditor.ui \
|
||||
src/network-web/downloaditem.ui \
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <QToolButton>
|
||||
#include <QLabel>
|
||||
#include <QProgressBar>
|
||||
#include <QThread>
|
||||
|
||||
|
||||
StatusBar::StatusBar(QWidget *parent) : QStatusBar(parent), m_mutex(new Mutex(QMutex::NonRecursive, this)) {
|
||||
|
@ -35,7 +35,6 @@
|
||||
#include "services/owncloud/owncloudserviceentrypoint.h"
|
||||
|
||||
#include <QSessionManager>
|
||||
#include <QThread>
|
||||
#include <QProcess>
|
||||
|
||||
#if defined(USE_WEBENGINE)
|
||||
@ -373,7 +372,7 @@ void Application::onAboutToQuit() {
|
||||
system()->removeTrolltechJunkRegistryKeys();
|
||||
#endif
|
||||
|
||||
qApp->feedReader()->stop();
|
||||
qApp->feedReader()->quit();
|
||||
database()->saveDatabase();
|
||||
|
||||
if (mainForm() != nullptr) {
|
||||
|
@ -23,6 +23,8 @@
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <chrono>
|
||||
#include <ctime>
|
||||
|
||||
|
||||
Debugging::Debugging() {
|
||||
@ -31,13 +33,18 @@ Debugging::Debugging() {
|
||||
void Debugging::performLog(const char *message, QtMsgType type, const char *file, const char *function, int line) {
|
||||
const char *type_string = typeToString(type);
|
||||
|
||||
std::time_t t = std::time(nullptr);
|
||||
char mbstr[32];
|
||||
|
||||
std::strftime(mbstr, sizeof(mbstr), "%y/%d/%m %H:%M:%S", std::localtime(&t));
|
||||
|
||||
// Write to console.
|
||||
if (file == 0 || function == 0 || line < 0) {
|
||||
fprintf(stderr, "[%s] %s: %s\n", APP_LOW_NAME, type_string, message);
|
||||
fprintf(stderr, "[%s] %s: %s (%s)\n", APP_LOW_NAME, type_string, message, mbstr);
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "[%s] %s\n Type: %s\n File: %s (line %d)\n Function: %s\n\n",
|
||||
APP_LOW_NAME, message, type_string, file, line, function);
|
||||
fprintf(stderr, "[%s] %s (%s)\n Type: %s\n File: %s (line %d)\n Function: %s\n\n",
|
||||
APP_LOW_NAME, message, mbstr, type_string, file, line, function);
|
||||
}
|
||||
|
||||
if (type == QtFatalMsg) {
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "services/standard/standardserviceentrypoint.h"
|
||||
#include "services/owncloud/owncloudserviceentrypoint.h"
|
||||
#include "services/tt-rss/ttrssserviceentrypoint.h"
|
||||
#include "services/abstract/serviceroot.h"
|
||||
|
||||
#include "core/feedsmodel.h"
|
||||
#include "core/feedsproxymodel.h"
|
||||
@ -32,10 +33,12 @@
|
||||
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
#include <QtConcurrent/QtConcurrentRun>
|
||||
|
||||
|
||||
FeedReader::FeedReader(QObject *parent)
|
||||
: QObject(parent), m_feedServices(QList<ServiceEntryPoint*>()), m_autoUpdateTimer(new QTimer(this)),
|
||||
: QObject(parent), m_feedServices(QList<ServiceEntryPoint*>()),
|
||||
m_cacheSaveFutureWatcher(new QFutureWatcher<void>(this)), m_autoUpdateTimer(new QTimer(this)),
|
||||
m_feedDownloaderThread(nullptr), m_feedDownloader(nullptr),
|
||||
m_dbCleanerThread(nullptr), m_dbCleaner(nullptr) {
|
||||
m_feedsModel = new FeedsModel(this);
|
||||
@ -43,8 +46,10 @@ FeedReader::FeedReader(QObject *parent)
|
||||
m_messagesModel = new MessagesModel(this);
|
||||
m_messagesProxyModel = new MessagesProxyModel(m_messagesModel, this);
|
||||
|
||||
connect(m_cacheSaveFutureWatcher, &QFutureWatcher<void>::finished, this, &FeedReader::asyncCacheSaveFinished);
|
||||
connect(m_autoUpdateTimer, &QTimer::timeout, this, &FeedReader::executeNextAutoUpdate);
|
||||
updateAutoUpdateStatus();
|
||||
asyncCacheSaveFinished();
|
||||
|
||||
if (qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateOnStartup)).toBool()) {
|
||||
qDebug("Requesting update for all feeds on application startup.");
|
||||
@ -209,11 +214,60 @@ void FeedReader::executeNextAutoUpdate() {
|
||||
}
|
||||
}
|
||||
|
||||
void FeedReader::stop() {
|
||||
void FeedReader::checkServicesForAsyncOperations() {
|
||||
checkServicesForAsyncOperations(false);
|
||||
}
|
||||
|
||||
void FeedReader::checkServicesForAsyncOperations(bool wait_for_future) {
|
||||
if (m_cacheSaveFutureWatcher->future().isRunning()) {
|
||||
qDebug("Previous future is still running.");
|
||||
|
||||
|
||||
// If we want to wait for future synchronously, we want to make sure that
|
||||
// we save all cached data (app exit).
|
||||
if (wait_for_future) {
|
||||
qWarning("Waiting for previously started saving of cached service data.");
|
||||
m_cacheSaveFutureWatcher->future().waitForFinished();
|
||||
}
|
||||
else {
|
||||
qWarning("Some cached service data are being saved now, so aborting this saving cycle.");
|
||||
// Some cache saving is now running.
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
QFuture<void> future = QtConcurrent::run([&] {
|
||||
foreach (ServiceRoot *service, m_feedsModel->serviceRoots()) {
|
||||
// Store any cached data.
|
||||
service->saveAllCachedData();
|
||||
}
|
||||
});
|
||||
|
||||
if (wait_for_future) {
|
||||
qDebug("Waiting for saving of cached service data to finish.");
|
||||
future.waitForFinished();
|
||||
}
|
||||
else {
|
||||
m_cacheSaveFutureWatcher->setFuture(future);
|
||||
}
|
||||
}
|
||||
|
||||
void FeedReader::asyncCacheSaveFinished() {
|
||||
qDebug("I will start next check for cached service data in 30 seconds.");
|
||||
|
||||
QTimer::singleShot(30000, [&] {
|
||||
qDebug("Starting next check for cached service data in NOW.");
|
||||
checkServicesForAsyncOperations(false);
|
||||
});
|
||||
}
|
||||
|
||||
void FeedReader::quit() {
|
||||
if (m_autoUpdateTimer->isActive()) {
|
||||
m_autoUpdateTimer->stop();
|
||||
}
|
||||
|
||||
checkServicesForAsyncOperations(true);
|
||||
|
||||
// Close worker threads.
|
||||
if (m_feedDownloaderThread != nullptr && m_feedDownloaderThread->isRunning()) {
|
||||
m_feedDownloader->stopRunningUpdate();
|
||||
|
@ -23,12 +23,15 @@
|
||||
#include "services/abstract/feed.h"
|
||||
#include "core/feeddownloader.h"
|
||||
|
||||
#include <QFutureWatcher>
|
||||
|
||||
|
||||
class FeedsModel;
|
||||
class MessagesModel;
|
||||
class MessagesProxyModel;
|
||||
class FeedsProxyModel;
|
||||
class ServiceEntryPoint;
|
||||
class ServiceOperator;
|
||||
class DatabaseCleaner;
|
||||
class QTimer;
|
||||
|
||||
@ -69,11 +72,14 @@ class FeedReader : public QObject {
|
||||
// Schedules all feeds from all accounts for update.
|
||||
void updateAllFeeds();
|
||||
void stopRunningFeedUpdate();
|
||||
void stop();
|
||||
void quit();
|
||||
|
||||
private slots:
|
||||
// Is executed when next auto-update round could be done.
|
||||
void executeNextAutoUpdate();
|
||||
void checkServicesForAsyncOperations();
|
||||
void checkServicesForAsyncOperations(bool wait_for_future);
|
||||
void asyncCacheSaveFinished();
|
||||
|
||||
signals:
|
||||
void feedUpdatesStarted();
|
||||
@ -88,12 +94,16 @@ class FeedReader : public QObject {
|
||||
MessagesModel *m_messagesModel;
|
||||
MessagesProxyModel *m_messagesProxyModel;
|
||||
|
||||
QFutureWatcher<void> *m_cacheSaveFutureWatcher;
|
||||
|
||||
// Auto-update stuff.
|
||||
QTimer *m_autoUpdateTimer;
|
||||
bool m_globalAutoUpdateEnabled;
|
||||
int m_globalAutoUpdateInitialInterval;
|
||||
int m_globalAutoUpdateRemainingInterval;
|
||||
|
||||
ServiceOperator *m_serviceOperator;
|
||||
|
||||
QThread *m_feedDownloaderThread;
|
||||
FeedDownloader *m_feedDownloader;
|
||||
|
||||
|
25
src/miscellaneous/serviceoperator.cpp
Executable file
25
src/miscellaneous/serviceoperator.cpp
Executable file
@ -0,0 +1,25 @@
|
||||
// This file is part of RSS Guard.
|
||||
//
|
||||
// Copyright (C) 2011-2017 by Martin Rotter <rotter.martinos@gmail.com>
|
||||
//
|
||||
// RSS Guard 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.
|
||||
//
|
||||
// RSS Guard 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 RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "miscellaneous/serviceoperator.h"
|
||||
|
||||
|
||||
ServiceOperator::ServiceOperator(QObject *parent) : QObject(parent) {
|
||||
}
|
||||
|
||||
ServiceOperator::~ServiceOperator() {
|
||||
}
|
36
src/miscellaneous/serviceoperator.h
Executable file
36
src/miscellaneous/serviceoperator.h
Executable file
@ -0,0 +1,36 @@
|
||||
// This file is part of RSS Guard.
|
||||
//
|
||||
// Copyright (C) 2011-2017 by Martin Rotter <rotter.martinos@gmail.com>
|
||||
//
|
||||
// RSS Guard 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.
|
||||
//
|
||||
// RSS Guard 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 RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef SERVICEOPERATOR_H
|
||||
#define SERVICEOPERATOR_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
|
||||
class ServiceOperator : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ServiceOperator(QObject *parent = 0);
|
||||
virtual ~ServiceOperator();
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
};
|
||||
|
||||
#endif // SERVICEOPERATOR_H
|
@ -192,6 +192,9 @@ QList<Message> ServiceRoot::undeletedMessages() const {
|
||||
return DatabaseQueries::getUndeletedMessagesForAccount(database, accountId());
|
||||
}
|
||||
|
||||
void ServiceRoot::saveAllCachedData() {
|
||||
}
|
||||
|
||||
void ServiceRoot::itemChanged(const QList<RootItem*> &items) {
|
||||
emit dataChanged(items);
|
||||
}
|
||||
|
@ -59,6 +59,7 @@ class ServiceRoot : public RootItem {
|
||||
// NOTE: Caller does NOT take ownership of created menu!
|
||||
virtual QList<QAction*> addItemMenu();
|
||||
|
||||
// Returns actions to display as context menu.
|
||||
QList<QAction*> contextMenu();
|
||||
|
||||
// Returns list of specific actions to be shown in main window menu
|
||||
@ -83,6 +84,8 @@ class ServiceRoot : public RootItem {
|
||||
virtual void start(bool freshly_activated) = 0;
|
||||
virtual void stop() = 0;
|
||||
|
||||
virtual void saveAllCachedData();
|
||||
|
||||
// Account ID corresponds with DB attribute Accounts (id).
|
||||
int accountId() const;
|
||||
void setAccountId(int account_id);
|
||||
|
@ -89,15 +89,8 @@ bool OwnCloudFeed::removeItself() {
|
||||
}
|
||||
|
||||
bool OwnCloudFeed::markAsReadUnread(RootItem::ReadStatus status) {
|
||||
QStringList ids = getParentServiceRoot()->customIDSOfMessagesForItem(this);
|
||||
QNetworkReply::NetworkError response = serviceRoot()->network()->markMessagesRead(status, ids);
|
||||
|
||||
if (response != QNetworkReply::NoError) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
return getParentServiceRoot()->markFeedsReadUnread(QList<Feed*>() << this, status);
|
||||
}
|
||||
serviceRoot()->addMessageStatesToCache(getParentServiceRoot()->customIDSOfMessagesForItem(this), status);
|
||||
return getParentServiceRoot()->markFeedsReadUnread(QList<Feed*>() << this, status);
|
||||
}
|
||||
|
||||
bool OwnCloudFeed::cleanMessages(bool clear_only_read) {
|
||||
|
@ -34,13 +34,6 @@ OwnCloudServiceRoot *OwnCloudRecycleBin::serviceRoot() {
|
||||
}
|
||||
|
||||
bool OwnCloudRecycleBin::markAsReadUnread(RootItem::ReadStatus status) {
|
||||
QStringList ids = getParentServiceRoot()->customIDSOfMessagesForItem(this);
|
||||
QNetworkReply::NetworkError response = serviceRoot()->network()->markMessagesRead(status, ids);
|
||||
|
||||
if (response != QNetworkReply::NoError) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
return RecycleBin::markAsReadUnread(status);
|
||||
}
|
||||
serviceRoot()->addMessageStatesToCache(getParentServiceRoot()->customIDSOfMessagesForItem(this), status);
|
||||
return RecycleBin::markAsReadUnread(status);
|
||||
}
|
||||
|
@ -38,7 +38,6 @@ ServiceRoot *OwnCloudServiceEntryPoint::createNewRoot() const {
|
||||
}
|
||||
|
||||
QList<ServiceRoot*> OwnCloudServiceEntryPoint::initializeSubtree() const {
|
||||
// Check DB if standard account is enabled.
|
||||
QSqlDatabase database = qApp->database()->connection(QSL("OwnCloudServiceEntryPoint"), DatabaseFactory::FromSettings);
|
||||
|
||||
return DatabaseQueries::getOwnCloudAccounts(database);
|
||||
@ -49,7 +48,7 @@ bool OwnCloudServiceEntryPoint::isSingleInstanceService() const {
|
||||
}
|
||||
|
||||
QString OwnCloudServiceEntryPoint::name() const {
|
||||
return QSL("ownCloud News");
|
||||
return QSL("NextCloud News");
|
||||
}
|
||||
|
||||
QString OwnCloudServiceEntryPoint::code() const {
|
||||
@ -57,7 +56,7 @@ QString OwnCloudServiceEntryPoint::code() const {
|
||||
}
|
||||
|
||||
QString OwnCloudServiceEntryPoint::description() const {
|
||||
return QObject::tr("The News app is an RSS/Atom feed aggregator. It is part of ownCloud suite. This plugin implements %1 API.").arg(API_VERSION);
|
||||
return QObject::tr("The News app is an RSS/Atom feed aggregator. It is part of Nextcloud suite. This plugin implements %1 API.").arg(API_VERSION);
|
||||
}
|
||||
|
||||
QString OwnCloudServiceEntryPoint::version() const {
|
||||
@ -69,6 +68,6 @@ QString OwnCloudServiceEntryPoint::author() const {
|
||||
}
|
||||
|
||||
QIcon OwnCloudServiceEntryPoint::icon() const {
|
||||
return qApp->icons()->miscIcon(QSL("owncloud"));
|
||||
return qApp->icons()->miscIcon(QSL("nextcloud"));
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,8 @@
|
||||
|
||||
|
||||
OwnCloudServiceRoot::OwnCloudServiceRoot(RootItem *parent)
|
||||
: ServiceRoot(parent), m_recycleBin(new OwnCloudRecycleBin(this)),
|
||||
: ServiceRoot(parent), m_cacheSaveMutex(new Mutex(QMutex::NonRecursive, this)), m_cachedStatesRead(QMap<RootItem::ReadStatus, QStringList>()),
|
||||
m_cachedStatesImportant(QMap<RootItem::Importance, QStringList>()), m_recycleBin(new OwnCloudRecycleBin(this)),
|
||||
m_actionSyncIn(nullptr), m_serviceMenu(QList<QAction*>()), m_network(new OwnCloudNetworkFactory()) {
|
||||
setIcon(OwnCloudServiceEntryPoint().icon());
|
||||
}
|
||||
@ -112,12 +113,64 @@ OwnCloudNetworkFactory *OwnCloudServiceRoot::network() const {
|
||||
return m_network;
|
||||
}
|
||||
|
||||
void OwnCloudServiceRoot::addMessageStatesToCache(const QStringList &ids_of_messages, RootItem::ReadStatus read) {
|
||||
m_cacheSaveMutex->lock();
|
||||
|
||||
QStringList &list_act = m_cachedStatesRead[read];
|
||||
QStringList &list_other = m_cachedStatesRead[read == RootItem::Read ? RootItem::Unread : RootItem::Read];
|
||||
|
||||
// Store changes, they will be sent to server later.
|
||||
list_act.append(ids_of_messages);
|
||||
|
||||
QSet<QString> set_act = list_act.toSet();
|
||||
QSet<QString> set_other = list_other.toSet();
|
||||
|
||||
// Now, we want to remove all IDS from list_other, which are contained in list.
|
||||
set_other -= set_act;
|
||||
|
||||
list_act.clear(); list_act.append(set_act.toList());
|
||||
list_other.clear(); list_other.append(set_other.toList());
|
||||
|
||||
m_cacheSaveMutex->unlock();
|
||||
}
|
||||
|
||||
void OwnCloudServiceRoot::saveAllCachedData() {
|
||||
if (m_cachedStatesRead.isEmpty() && m_cachedStatesImportant.isEmpty()) {
|
||||
// No cached changes.
|
||||
return;
|
||||
}
|
||||
|
||||
m_cacheSaveMutex->lock();
|
||||
|
||||
// Make copy of changes.
|
||||
QMap<RootItem::ReadStatus, QStringList> cached_data_read = m_cachedStatesRead;
|
||||
cached_data_read.detach();
|
||||
|
||||
QMap<RootItem::Importance, QStringList> cached_data_imp = m_cachedStatesImportant;
|
||||
cached_data_imp.detach();
|
||||
|
||||
m_cachedStatesRead.clear();
|
||||
m_cachedStatesImportant.clear();
|
||||
|
||||
m_cacheSaveMutex->unlock();
|
||||
|
||||
// Save the actual data.
|
||||
for (int i = 0; i < cached_data_read.size(); i++) {
|
||||
auto key = cached_data_read.keys().at(i);
|
||||
QStringList ids = cached_data_read[key];
|
||||
|
||||
if (!ids.isEmpty()) {
|
||||
network()->markMessagesRead(key, ids);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool OwnCloudServiceRoot::onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages,
|
||||
RootItem::ReadStatus read) {
|
||||
Q_UNUSED(selected_item)
|
||||
|
||||
QNetworkReply::NetworkError reply = network()->markMessagesRead(read, customIDsOfMessages(messages));
|
||||
return reply == QNetworkReply::NoError;
|
||||
addMessageStatesToCache(customIDsOfMessages(messages), read);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OwnCloudServiceRoot::onBeforeSwitchMessageImportance(RootItem *selected_item,
|
||||
@ -185,8 +238,8 @@ void OwnCloudServiceRoot::saveAccountDataToDatabase() {
|
||||
|
||||
if (saved) {
|
||||
if (DatabaseQueries::createOwnCloudAccount(database, id_to_assign, m_network->authUsername(),
|
||||
m_network->authPassword(), m_network->url(),
|
||||
m_network->forceServerSideUpdate())) {
|
||||
m_network->authPassword(), m_network->url(),
|
||||
m_network->forceServerSideUpdate())) {
|
||||
setId(id_to_assign);
|
||||
setAccountId(id_to_assign);
|
||||
updateTitle();
|
||||
|
@ -20,9 +20,12 @@
|
||||
|
||||
#include "services/abstract/serviceroot.h"
|
||||
|
||||
#include <QMap>
|
||||
|
||||
|
||||
class OwnCloudNetworkFactory;
|
||||
class OwnCloudRecycleBin;
|
||||
class Mutex;
|
||||
|
||||
class OwnCloudServiceRoot : public ServiceRoot {
|
||||
Q_OBJECT
|
||||
@ -45,17 +48,25 @@ class OwnCloudServiceRoot : public ServiceRoot {
|
||||
|
||||
OwnCloudNetworkFactory *network() const;
|
||||
|
||||
void addMessageStatesToCache(const QStringList &ids_of_messages, ReadStatus read);
|
||||
|
||||
bool onBeforeSetMessagesRead(RootItem *selected_item, const QList<Message> &messages, ReadStatus read);
|
||||
bool onBeforeSwitchMessageImportance(RootItem *selected_item, const QList<ImportanceChange> &changes);
|
||||
|
||||
void updateTitle();
|
||||
void saveAccountDataToDatabase();
|
||||
|
||||
void saveAllCachedData();
|
||||
|
||||
public slots:
|
||||
void addNewFeed(const QString &url);
|
||||
void addNewCategory();
|
||||
|
||||
private:
|
||||
Mutex *m_cacheSaveMutex;
|
||||
QMap<RootItem::ReadStatus, QStringList> m_cachedStatesRead;
|
||||
QMap<RootItem::Importance, QStringList> m_cachedStatesImportant;
|
||||
|
||||
QMap<int,QVariant> storeCustomFeedsData();
|
||||
void restoreCustomFeedsData(const QMap<int,QVariant> &data, const QHash<int,Feed*> &feeds);
|
||||
RootItem *obtainNewTreeForSyncIn() const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user