Merge branch 'master' of github.com:martinrotter/rssguard

This commit is contained in:
Martin Rotter 2017-04-21 21:29:06 +02:00
commit 338f03228d
32 changed files with 361 additions and 151 deletions

View File

@ -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>&amp;Mark all items as read</source>
<translation type="unfinished"/>
<translation>&amp;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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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&apos;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>

View File

@ -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>

View File

@ -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>&amp;Mark all items as read</source>
<translation type="unfinished"/>
<translation>Žymėti visus elementus kaip &amp;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 į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 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>

View File

@ -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>&amp;Mark all items as read</source>
<translation type="unfinished"/>
<translation>&amp;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>

View File

@ -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>

View File

@ -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>&amp;Mark all items as read</source>
<translation type="unfinished"/>
<translation>&amp;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>

View File

@ -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>&amp;Mark all items as read</source>
<translation type="unfinished"/>
<translation>&amp;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> 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -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 \

View File

@ -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)) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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();

View File

@ -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;

View 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() {
}

View 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

View File

@ -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);
}

View File

@ -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);

View File

@ -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) {

View File

@ -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);
}

View File

@ -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"));
}

View File

@ -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();

View File

@ -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;