Merge remote-tracking branch 'nextcloud/master' into master-merge

Signed-off-by: Devlin Junker <devlin.junker@gmail.com>
This commit is contained in:
Devlin Junker 2023-10-22 13:57:14 -07:00
commit 3e35d781cf
53 changed files with 859 additions and 408 deletions

View File

@ -19,7 +19,7 @@ module.exports = {
'@nextcloud',
'plugin:@typescript-eslint/recommended',
],
ignorePatterns: ['*.d.ts'],
ignorePatterns: ['*.d.ts', 'l10n/*.js'],
rules: {
'no-console': 'warn',
'@typescript-eslint/no-var-requires': 'off',

View File

@ -43,7 +43,7 @@ jobs:
experimental: true
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
submodules: recursive

View File

@ -18,7 +18,7 @@ jobs:
name: "phpstan: Nextcloud ${{ matrix.nextcloud }} with ${{ matrix.php-versions }}"
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up php
uses: shivammathur/setup-php@master
with:

View File

@ -14,9 +14,15 @@ jobs:
database: ['sqlite']
experimental: [false]
codecoverage: [false]
include:
- php-versions: 8.2
nextcloud: stable27
database: sqlite
experimental: false
codecoverage: true
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 2 # https://github.com/codecov/codecov-action/issues/190#issuecomment-790729633

View File

@ -19,17 +19,17 @@ jobs:
database: ['sqlite']
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@afefcaf556d98dc7896cca380e181decb609ca44
uses: shivammathur/setup-php@7fdd3ece872ec7ec4c098ae5ab7637d5e0a96067 #2.26.0
with:
php-version: ${{ matrix.php-versions }}
extensions: pdo_sqlite,pdo_mysql,pdo_pgsql,gd,zip
coverage: none
- name: Set up server non MySQL
uses: SMillerDev/nextcloud-actions/setup-nextcloud@main
uses: SMillerDev/nextcloud-actions/setup-nextcloud@1e38cb369e2193642279c64ee140fc93ddd4fa77
with:
cron: false
version: ${{ matrix.nextcloud }}
@ -39,7 +39,7 @@ jobs:
run: make
- name: Configure server with app
uses: SMillerDev/nextcloud-actions/setup-nextcloud-app@main
uses: SMillerDev/nextcloud-actions/setup-nextcloud-app@1e38cb369e2193642279c64ee140fc93ddd4fa77
with:
app: ${{ env.APP_NAME }}
check-code: false
@ -52,7 +52,7 @@ jobs:
app_public_crt: ${{ secrets.APP_PUBLIC_CRT }}
- name: Upload app tarball to release
uses: svenstaro/upload-release-action@2b9d2847a97b04d02ad5c3df2d3a27baa97ce689
uses: svenstaro/upload-release-action@1beeb572c19a9242f4361f4cee78f8e0d9aec5df
id: attach_to_release
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout master
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Deploy docs
uses: mhausenblas/mkdocs-deploy-gh-pages@master

View File

@ -15,7 +15,7 @@ jobs:
experimental: [false]
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2

View File

@ -22,7 +22,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@v2.2

View File

@ -7,18 +7,20 @@ jobs:
php:
runs-on: ubuntu-latest
continue-on-error: false
name: "Coverage: Nextcloud PHP ${{ matrix.php-versions }}"
name: "Coverage: Nextcloud ${{ matrix.nextcloud }} PHP ${{ matrix.php-version }}"
strategy:
matrix:
nextcloud: ['stable27']
codecoverage: [true]
php-version: ["8.1"]
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
php-version: ${{ matrix.php-version }}
### Back to normal setup
- name: Set up server non MySQL
@ -39,7 +41,11 @@ jobs:
- name: Prep PHP tests
run: cd ../server/apps/news && make php-test-dependencies
- name: Unittests
run: cd ../server/apps/news && make unit-test
env:
CODECOVERAGE: ${{ matrix.codecoverage }}
- name: Upload codecoverage
run: cd ../server/apps/news && bash <(curl -s https://codecov.io/bash) -f build/php-unit.clover

View File

@ -22,7 +22,7 @@ jobs:
experimental: [false]
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
submodules: recursive

3
.gitignore vendored
View File

@ -13,6 +13,9 @@ coverage
#bats
tests/api/helpers/settings-override.bash
tests/test_helper/feeds/test.xml
tests/test_helper/feeds/feed1.xml
tests/test_helper/feeds/feed2.xml
#bats
tests/api/helpers/settings-override.bash

View File

@ -3,13 +3,37 @@ All notable changes to this project will be documented in this file.
The format is mostly based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), older entries don't fully match.
# Unreleased
## [23.x.x]
## [25.x.x]
### Changed
- Vue Rewrite
- Add Typescript
- Add Jest for Unit Tests
# Releases
## [24.x.x]
### Changed
- Set User Agent for curl in Scraper
### Fixed
# Releases
## [24.0.0] - 2023-09-26
No major changes compared to 24.0.0-beta1.
## [24.0.0-beta1] - 2023-08-26
### Changed
- Drop support for Nextcloud 25, Supported: 26, 27 (#2316)
- Add a new command for occ `./occ news:updater:job` allows to check and reset the update job (#2166)
- Check for available http(s) compression options and use them (gzip, deflate, brotli) (#2328)
- Change and unify [cache](https://nextcloud.github.io/news/install/#cache) to use the instance ID of Nextcloud (#2331)
## [23.0.0] - 2023-08-16
No notable changes compared to 23.0.0-beta1
## [23.0.0-beta1] - 2023-08-09
### Changed
- Drop support for PHP 7.4 new min. version is php 8.0 (#2237)
- Upgrade feed-io to v5.1.3 (#2238)
### Fixed
- Some feeds missing items (#2236)
## [22.0.0] - 2023-07-23
### Changed
- Support deflate and gzip compression for HTTP response bodies (#2269)
@ -48,7 +72,7 @@ The format is mostly based on [Keep a Changelog](https://keepachangelog.com/en/1
- Use httpLastModified field for If-Modified-Since header when fetching feed updates (#2119)
## [21.1.0] - 2023-03-20
No notable changes compared 21.1.0-beta1
No notable changes compared to 21.1.0-beta1
## [21.1.0-beta1] - 2023-03-13
### Changed
@ -56,7 +80,7 @@ No notable changes compared 21.1.0-beta1
- (Nextcloud 26+) Add info card to the admin settings, showing last job execution (#2141)
## [21.0.0] - 2023-02-28
No notable changes compared 21.0.0-beta1
No notable changes compared to 21.0.0-beta1
## [21.0.0-beta1] - 2023-02-14
### Changed

View File

@ -25,7 +25,7 @@ Read this when you want to:
* Disable all browser add-ons to make sure that it's not a plugin's fault (adblockers, especially cosmetic filters)
* Clear your PHP opcode cache if you use any by restarting your webserver.
* [Check if they have already been reported](https://github.com/nextcloud/news/issues?state=open)
* [Check if your problem is covered in the FAQ section]( https://nextcloud.github.io/news/faq)
* [Check if your problem is covered in the Troubleshooting section](https://nextcloud.github.io/news/troubleshooting/)
### Debugging issues
* Enable debug mode in your **config/config.php**:

View File

@ -21,7 +21,7 @@ Create a [feature request](https://github.com/nextcloud/news/discussions/new)
Report a [feed issue](https://github.com/nextcloud/news/discussions/new)
]]></description>
<version>22.0.0</version>
<version>24.0.0</version>
<licence>agpl</licence>
<author>Benjamin Brahmer</author>
<author>Sean Molenaar</author>
@ -43,7 +43,7 @@ Report a [feed issue](https://github.com/nextcloud/news/discussions/new)
<screenshot small-thumbnail="https://raw.githubusercontent.com/nextcloud/news/master/screenshots/2-small.png">https://raw.githubusercontent.com/nextcloud/news/master/screenshots/2.png</screenshot>
<screenshot small-thumbnail="https://raw.githubusercontent.com/nextcloud/news/master/screenshots/3-small.png">https://raw.githubusercontent.com/nextcloud/news/master/screenshots/3.png</screenshot>
<dependencies>
<php min-version="7.4" min-int-size="64"/>
<php min-version="8.0" min-int-size="64"/>
<database min-version="10">pgsql</database>
<database>sqlite</database>
<database min-version="8.0">mysql</database>
@ -75,6 +75,7 @@ Report a [feed issue](https://github.com/nextcloud/news/discussions/new)
<command>OCA\News\Command\Updater\UpdateUser</command>
<command>OCA\News\Command\Updater\BeforeUpdate</command>
<command>OCA\News\Command\Updater\AfterUpdate</command>
<command>OCA\News\Command\Updater\Job</command>
<command>OCA\News\Command\Config\FolderList</command>
<command>OCA\News\Command\Config\FolderAdd</command>
<command>OCA\News\Command\Config\FolderDelete</command>

View File

@ -44,7 +44,7 @@
"ezyang/htmlpurifier": "^4.16.0",
"pear/net_url2": "^2.2.2",
"riimu/kit-pathjoin": "^1.2.0",
"debril/feed-io": "^v4.9.12",
"debril/feed-io": "^v5.3.1",
"arthurhoaro/favicon": "^1.3.3",
"fivefilters/readability.php": "^3.1",
"ext-json": "*",
@ -56,14 +56,14 @@
"require-dev": {
"phpunit/phpunit": "9.6.*",
"squizlabs/php_codesniffer": "^3.7.2",
"phpstan/phpstan": "^1.10.26",
"phpstan/phpstan-doctrine": "^1.3.40",
"phpstan/phpstan": "^1.10.39",
"phpstan/phpstan-doctrine": "^1.3.43",
"phpstan/phpstan-strict-rules": "^1.5.1",
"phpstan/phpstan-phpunit": "^1.3.13",
"phpstan/phpstan-phpunit": "^1.3.15",
"phpstan/extension-installer": "^1.3.1",
"phpstan/phpstan-deprecation-rules": "^1.1",
"guzzlehttp/guzzle": "^7.3.0",
"doctrine/dbal": "^3.6.5",
"doctrine/dbal": "^3.7.1",
"symfony/console": "^4.4.19",
"psr/log": "^1.1.0"
},

419
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -93,7 +93,6 @@ Using automatic container assembly you can then use it from your code by simply
# TODO: Update the following
If your plugin integrates with another Nextcloud app, make sure to also require it be installed. If you depend on the Bookmarks app for instance use:
@ -201,10 +200,4 @@ Then open the **newspluing/css/style.css** file and add the following CSS:
Reload the News app and click the three dots menu, sit back and enjoy :)
### Examples
Client-side plugins:
* [Mail Share](https://github.com/cosenal/mailsharenewsplugin): Client-side plugin to share articles by email
Server-side plugins:
* [Feed Central](https://github.com/Raydiation/feedcentral): Publish your feeds as RSS

View File

@ -2,8 +2,8 @@
## Dependencies
* 64bit OS (starting with News 16.0.0)
* PHP >= 7.3
* Nextcloud 22
* PHP >= 8.0
* Nextcloud (current stable version)
* libxml >= 2.7.8
You also need some PHP extensions:
@ -27,10 +27,19 @@ Also see the [Nextcloud documentation](https://docs.nextcloud.com/server/stable/
* Use MySQL/MariaDB or PostgreSQL for better database performance
* Use the [updater script to thread and speed up the update](https://github.com/nextcloud/news-updater)
## Cache
News and it's libraries require a writeable temporary directory used as cache. The base directory depends on your system.
You can [configure a custom directory](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html?highlight=temp#tempdirectory) if you want.
In most cases the base directory will be `/tmp`. News will create a folder `news-$instanceID` the [instance ID is defined by Nextcloud](https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/config_sample_php_parameters.html?highlight=temp#instanceid).
Inside that folder a subfolder `cache` is created, inside this cache folder news and libraries will try to create cache directories for caching images, html and more.
You need to ensure that your web-server user can write to that directory.
## Before you install/update the News app
Before you install the app do the following:
* Check that your **nextcloud/data/** directory is owned by your web server user and that it is write/readable
* Check that your installation fulfills the [requirements listed above](#dependencies)
* [Set up Nextcloud Background Jobs](https://docs.nextcloud.org/server/latest/admin_manual/configuration_server/background_jobs_configuration.html#cron) to enable feed updates.

View File

@ -32,7 +32,6 @@ Since an attacker can not execute code in contrast to mixed active content, but
### Why don't you simply use an HTTPS image/audio/video proxy?
For the same reason that we can't fix non HTTPS websites: It does not fix the underlying issue, but only silences it. If you are using an image HTTPS proxy, an attacker can simply attack your image proxy since the proxy fetches insecure content. **Even worse**: if your image proxy serves these images from the same domain as your Nextcloud installation, you are [vulnerable to XSS via SVG images](https://www.owasp.org/images/0/03/Mario_Heiderich_OWASP_Sweden_The_image_that_called_me.pdf). In addition, people feel safe when essentially they are not.
Since most people don't understand mixed content and don't have two domains and a standalone server for the image proxy, it is very likely they will choose to host it under the same domain.
@ -50,25 +49,80 @@ This is very often caused by missing or old files, e.g. by failing to upload all
Feeds can be updated using Nextcloud's system cron or an external updater via the API. **The feed update is not run in Webcron and AJAX cron mode!**
### Validating Using System Cron
!!! info
This requires Nextcloud 26 or newer and News 24.0.0 or newer.
Follow this checklist:
- Check admin settings of Nextcloud, was the last cron execution ok.
- Check the logs for errors.
- Does your [cache configuration](install.md#cache) work?
- Check the News admin settings, system cron is used to update news.
- You should see a info card at the top, which will tell you when the last job execution was.
- If the card is red it is very likely that the update job is stuck.
- If it is green then maybe only some feeds are failing to update, check the Nextcloud logs.
If you believe the job is stuck you can reset it. For further steps you need to use occ.
You can check again the status of the job.
(replace www-data with your httpd user)
```bash
sudo -u www-data php ./occ news:updater:job
Checking update Status
Last Execution was 2023-03-20 12:20:03 UTC
```
If you think the job is stuck you can reset it, this may lead to issues if the job is currently running!
```bash
sudo -u www-data php ./occ news:updater:job --reset
Checking update Status
Last Execution was 2023-03-20 12:20:03 UTC
Attempting to reset the job.
Done, job should execute on next schedule.
```
The output of the command should have changed.
```bash
sudo -u www-data php ./occ news:updater:job
Checking update Status
Last Execution was 1970-01-01 00:00:00 UTC
```
After some time has passed the timestamp should be close to the current time.
If this did not help, check the logs and open a issue or discussion on GitHub.
#### Outdated Steps
Follow these steps if you are running an older version of News and Nextcloud.
* Check if you are using the system cron (Cron) setting on the admin page. AJAX and Web cron will not update feeds
* Check if the cronjob exists with crontab -u www-data -e (replace www-data with your httpd user)
* Check if the cronjob exists with `crontab -u www-data -e` (replace www-data with your httpd user)
* Check the file permissions of the cron.php file and if www-data (or whatever your httpd user is called like) can read and execute that script
* Check if you can execute the cron with sudo -u www-data php -f nextcloud/cron.php (replace www-data with your httpd user)
* Check your data/nextcloud.log for errors
* Check if the cronjob is ever executed by placing an error_log('updating'); in the background job file. If the cronjob runs, there should be an updating log statement in your httpd log.
* Check if you can execute the cron with `sudo -u www-data php -f nextcloud/cron.php` (replace www-data with your httpd user)
* Check your `data/nextcloud.log` for errors
* Check if the cronjob is ever executed by placing an `error_log('updating');` in the [background job file](https://github.com/nextcloud/news/blob/master/lib/Service/UpdaterService.php#L55). If the cronjob runs, there should be an updating log statement in your httpd log.
* If there is no updating statement in your logs check if your cronjob is executed by executing a different script
* Check if the oc_jobs table has a reserved_at entry with a value other than 0. If it does for whatever reason, set it to 0. You can check this by executing:
#### Info
```sql
SELECT * from oc_jobs WHERE class LIKE '%News%' ORDER BY id;
```
* In newer versions of News (21.x.x) the old job OCA\News\Cron\Updater was removed from the DB.
You will get two rows where column class will be `OCA\News\Cron\Updater` and `OCA\News\Cron\UpdaterJob`.
Reset the reserved_at by executing:
!!! info
sql UPDATE oc_jobs SET reserved_at = 0 WHERE id = < id from above SELECT statement > ;
In newer versions of News (21.x.x) the old job OCA\News\Cron\Updater was removed from the DB.
If your cron works fine, but Nextcloud's cronjobs are never executed, file a bug in [server](https://github.com/nextcloud/server/).
Reset the reserved_at by executing
```sql
UPDATE oc_jobs SET reserved_at = 0 WHERE id = <id from above SELECT statement>;
```
If your cron works fine, but Nextcloud's cronjobs are never executed, file a bug in [server](https://github.com/nextcloud/server/)
### Using External Updater

View File

@ -11,6 +11,7 @@ OC.L10N.register(
"Delete" : "Desaniciar",
"Settings" : "Configuración",
"Help" : "Ayuda",
"Keyboard shortcuts" : "Atayos del tecláu",
"Documentation" : "Documentación"
},
"nplurals=2; plural=(n != 1);");

View File

@ -9,6 +9,7 @@
"Delete" : "Desaniciar",
"Settings" : "Configuración",
"Help" : "Ayuda",
"Keyboard shortcuts" : "Atayos del tecláu",
"Documentation" : "Documentación"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@ -3,8 +3,8 @@ OC.L10N.register(
{
"Request failed, network connection unavailable!" : "La sol·licitud ha fallat, la connexió de xarxa no està disponible!",
"Request unauthorized. Are you logged in?" : "Sol·licitud no autoritzada. Heu iniciat la sessió?",
"Request forbidden. Are you an administrator?" : "Petició prohibida. Ets administrador?",
"Token expired or app not enabled! Reload the page!" : "El Token està caducat o l'aplicació no està activada! Torneu a carregar la pàgina!",
"Request forbidden. Are you an administrator?" : "Sol·licitud prohibida. Ets administrador?",
"Token expired or app not enabled! Reload the page!" : "El Testimoni està caducat o l'aplicació no està habilitada! Torneu a carregar la pàgina!",
"Internal server error! Please check your data/nextcloud.log file for additional information!" : "Error intern servidor! Consulteu el fitxer data/nextcloud.log per obtenir informació addicional!",
"Request failed, Nextcloud is in currently in maintenance mode!" : "La sol·licitud ha fallat, Nextcloud és actualment en mode de manteniment!",
"News feeds" : "Fonts de notícies",
@ -18,11 +18,11 @@ OC.L10N.register(
"Last job execution ran {relativeTime}. Something seems wrong." : "L'última execució del treball s'ha executat el dia {relativeTime}. Alguna cosa sembla malament.",
"Last job ran {relativeTime}." : "L'última tasca es va executar {relativeTime}.",
"Use system cron for updates" : "Feu servir el sistema cron per a les actualitzacions",
"Disable this if you use a custom updater." : "Desactiveu-ho si feu servir un actualitzador personalitzat.",
"Disable this if you use a custom updater." : "Inhabiliteu-ho si feu servir un actualitzador personalitzat.",
"Maximum read count per feed" : "Màxim nombre de lectures per font",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Defineix la quantitat màxima d'articles que es poden llegir per canal que no s'eliminaran pel treball de neteja; si els articles antics reapareixen després de ser llegits, augmenta aquest valor; valors negatius com -1 desactivaran aquesta funció.",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Defineix la quantitat màxima d'articles que es poden llegir per canal que no es suprimiran pel treball de neteja; si els articles antics reapareixen després de ser llegits, augmenta aquest valor; valors negatius com -1 desactivaran aquesta funció.",
"Delete unread articles automatically" : "Suprimeix automàticament els articles no llegits",
"Enable this if you also want to delete unread articles." : "Activeu-ho si també voleu suprimir articles no llegits.",
"Enable this if you also want to delete unread articles." : "Habiliteu-ho si també voleu suprimir articles no llegits.",
"Maximum redirects" : "Màxim de redirigits",
"How many redirects the feed fetcher should follow." : "Quantes redireccions hauria de suportar el descarregador de fonts.",
"Feed fetcher timeout" : "Temps d'espera exhaurit per a la descàrrega de la font",
@ -42,7 +42,7 @@ OC.L10N.register(
"Star article" : "Destaca l'article",
"Unstar article" : "Deixa de destacar l'article",
"Keep article unread" : "Manté l'article com a no llegit",
"Remove keep article unread" : "Elimineu mantenir l'article no llegit",
"Remove keep article unread" : "Suprimir mantenir l'article no llegit",
"Share" : "Compartir",
"Share with users" : "Comparteix amb els usuaris",
"Username" : "Nom d'usuari",
@ -55,12 +55,12 @@ OC.L10N.register(
"from" : "des de",
"shared by" : "compartit per",
"Play audio" : "Reprodueix l'àudio",
"Download audio" : "Descarrega l'àudio",
"Download video" : "Descarrega el vídeo",
"Download audio" : "Baixada de l'àudio",
"Download video" : "Baixada del vídeo",
"Keyboard shortcut" : "Drecera de teclat",
"Description" : "Descripció",
"right" : "dreta",
"Jump to next article" : "Vés al proper article",
"Jump to next article" : "Vés al següent article",
"left" : "esquerra",
"Jump to previous article" : "Vés a l'article anterior",
"Toggle star article" : "Commuta l'article com a destacat",
@ -105,20 +105,20 @@ OC.L10N.register(
"Newest first" : "Més nou primer",
"Oldest first" : "Més antic primer",
"Default order" : "Ordre per defecte",
"Enable full text" : "Activa el text complet",
"Disable full text" : "Desactiva el text complet",
"Enable full text" : "Habilita el text complet",
"Disable full text" : "Inhabilita el text complet",
"Unread updated" : "Actualització no llegida",
"Ignore updated" : "Ignora l'actualització",
"Open feed URL" : "Obre l'URL del canal",
"Delete" : "Suprimeix",
"Dismiss" : "Rebutja",
"Dismiss" : "Descarta",
"Collapse" : "Replega",
"Deleted folder" : "Carpeta suprimida",
"Undo delete folder" : "Desfés la supressió de la carpeta",
"Starred" : "Destacats",
"All articles" : "Tots els articles",
"Settings" : "Paràmetres",
"Disable mark read through scrolling" : "Desactiva la marca de lectura mitjançant el desplaçament",
"Disable mark read through scrolling" : "Inhabilita la marca de lectura mitjançant el desplaçament",
"Compact view" : "Vista compacta",
"Expand articles on key navigation" : "Amplia els articles sobre la navegació per tecles",
"Show all articles" : "Mostra tots els articles",

View File

@ -1,8 +1,8 @@
{ "translations": {
"Request failed, network connection unavailable!" : "La sol·licitud ha fallat, la connexió de xarxa no està disponible!",
"Request unauthorized. Are you logged in?" : "Sol·licitud no autoritzada. Heu iniciat la sessió?",
"Request forbidden. Are you an administrator?" : "Petició prohibida. Ets administrador?",
"Token expired or app not enabled! Reload the page!" : "El Token està caducat o l'aplicació no està activada! Torneu a carregar la pàgina!",
"Request forbidden. Are you an administrator?" : "Sol·licitud prohibida. Ets administrador?",
"Token expired or app not enabled! Reload the page!" : "El Testimoni està caducat o l'aplicació no està habilitada! Torneu a carregar la pàgina!",
"Internal server error! Please check your data/nextcloud.log file for additional information!" : "Error intern servidor! Consulteu el fitxer data/nextcloud.log per obtenir informació addicional!",
"Request failed, Nextcloud is in currently in maintenance mode!" : "La sol·licitud ha fallat, Nextcloud és actualment en mode de manteniment!",
"News feeds" : "Fonts de notícies",
@ -16,11 +16,11 @@
"Last job execution ran {relativeTime}. Something seems wrong." : "L'última execució del treball s'ha executat el dia {relativeTime}. Alguna cosa sembla malament.",
"Last job ran {relativeTime}." : "L'última tasca es va executar {relativeTime}.",
"Use system cron for updates" : "Feu servir el sistema cron per a les actualitzacions",
"Disable this if you use a custom updater." : "Desactiveu-ho si feu servir un actualitzador personalitzat.",
"Disable this if you use a custom updater." : "Inhabiliteu-ho si feu servir un actualitzador personalitzat.",
"Maximum read count per feed" : "Màxim nombre de lectures per font",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Defineix la quantitat màxima d'articles que es poden llegir per canal que no s'eliminaran pel treball de neteja; si els articles antics reapareixen després de ser llegits, augmenta aquest valor; valors negatius com -1 desactivaran aquesta funció.",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Defineix la quantitat màxima d'articles que es poden llegir per canal que no es suprimiran pel treball de neteja; si els articles antics reapareixen després de ser llegits, augmenta aquest valor; valors negatius com -1 desactivaran aquesta funció.",
"Delete unread articles automatically" : "Suprimeix automàticament els articles no llegits",
"Enable this if you also want to delete unread articles." : "Activeu-ho si també voleu suprimir articles no llegits.",
"Enable this if you also want to delete unread articles." : "Habiliteu-ho si també voleu suprimir articles no llegits.",
"Maximum redirects" : "Màxim de redirigits",
"How many redirects the feed fetcher should follow." : "Quantes redireccions hauria de suportar el descarregador de fonts.",
"Feed fetcher timeout" : "Temps d'espera exhaurit per a la descàrrega de la font",
@ -40,7 +40,7 @@
"Star article" : "Destaca l'article",
"Unstar article" : "Deixa de destacar l'article",
"Keep article unread" : "Manté l'article com a no llegit",
"Remove keep article unread" : "Elimineu mantenir l'article no llegit",
"Remove keep article unread" : "Suprimir mantenir l'article no llegit",
"Share" : "Compartir",
"Share with users" : "Comparteix amb els usuaris",
"Username" : "Nom d'usuari",
@ -53,12 +53,12 @@
"from" : "des de",
"shared by" : "compartit per",
"Play audio" : "Reprodueix l'àudio",
"Download audio" : "Descarrega l'àudio",
"Download video" : "Descarrega el vídeo",
"Download audio" : "Baixada de l'àudio",
"Download video" : "Baixada del vídeo",
"Keyboard shortcut" : "Drecera de teclat",
"Description" : "Descripció",
"right" : "dreta",
"Jump to next article" : "Vés al proper article",
"Jump to next article" : "Vés al següent article",
"left" : "esquerra",
"Jump to previous article" : "Vés a l'article anterior",
"Toggle star article" : "Commuta l'article com a destacat",
@ -103,20 +103,20 @@
"Newest first" : "Més nou primer",
"Oldest first" : "Més antic primer",
"Default order" : "Ordre per defecte",
"Enable full text" : "Activa el text complet",
"Disable full text" : "Desactiva el text complet",
"Enable full text" : "Habilita el text complet",
"Disable full text" : "Inhabilita el text complet",
"Unread updated" : "Actualització no llegida",
"Ignore updated" : "Ignora l'actualització",
"Open feed URL" : "Obre l'URL del canal",
"Delete" : "Suprimeix",
"Dismiss" : "Rebutja",
"Dismiss" : "Descarta",
"Collapse" : "Replega",
"Deleted folder" : "Carpeta suprimida",
"Undo delete folder" : "Desfés la supressió de la carpeta",
"Starred" : "Destacats",
"All articles" : "Tots els articles",
"Settings" : "Paràmetres",
"Disable mark read through scrolling" : "Desactiva la marca de lectura mitjançant el desplaçament",
"Disable mark read through scrolling" : "Inhabilita la marca de lectura mitjançant el desplaçament",
"Compact view" : "Vista compacta",
"Expand articles on key navigation" : "Amplia els articles sobre la navegació per tecles",
"Show all articles" : "Mostra tots els articles",

View File

@ -11,13 +11,18 @@ OC.L10N.register(
"Unread articles" : "Ulæste artikler",
"News" : "Nyheder",
"News folders" : "Nyhedsmapper",
"News articles" : "Nyheds artikler",
"Shared with me" : "Delt med mig",
"An RSS/Atom feed reader" : "En RSS/Atom-feedlæser",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 En RSS/Atom Feed-læser-app til Nextcloud\n\n- 📲 Synkroniser dine feeds med flere mobile eller desktop [klienter](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatiske opdateringer af dine nyhedsfeeds\n- 🆓 Gratis og open source under AGPLv3, ingen annoncer eller premium-funktioner\n\n**System Cron er i øjeblikket påkrævet for at denne app kan fungere**\n\nKravene kan findes [her](https://nextcloud.github.io/news/install/#dependencies)\n\nÆndringsloggen er tilgængelig [her](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nOpret en [fejlrapport](https://github.com/nextcloud/news/issues/new/choose)\n\nOpret en [funktionsanmodning](https://github.com/nextcloud/news/discussions/new)\n\nRapporter et [feedproblem](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Sidste jobudførelse kørte {relativeTime}. Noget gik galt.",
"Last job ran {relativeTime}." : "Sidste job kørte {relativeTime}.",
"Use system cron for updates" : "Benyt system cron til opdateringer",
"Disable this if you use a custom updater." : "Deaktiver dette, hvis du bruger en brugerdefineret opdatering.",
"Maximum read count per feed" : "Det maksimale antal læsninger per feed",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Definerer den maksimale mængde af artikler, der kan læses pr. feed, som ikke vil blive slettet af oprydningsjobbet; hvis gamle artikler dukker op igen efter at være blevet læst, skal du øge denne værdi; negative værdier såsom -1 vil slå denne funktion fra.",
"Delete unread articles automatically" : "Slet automatisk ulæste artikler",
"Enable this if you also want to delete unread articles." : "Aktivere dette hvis du også vil slette ulæste artikler.",
"Maximum redirects" : "Maksimum for videredirigeringer",
"How many redirects the feed fetcher should follow." : "Hvor mange omdirigeringer feedhenteren skal følge.",
"Feed fetcher timeout" : "Tidsudløb for feed-indhenter",

View File

@ -9,13 +9,18 @@
"Unread articles" : "Ulæste artikler",
"News" : "Nyheder",
"News folders" : "Nyhedsmapper",
"News articles" : "Nyheds artikler",
"Shared with me" : "Delt med mig",
"An RSS/Atom feed reader" : "En RSS/Atom-feedlæser",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 En RSS/Atom Feed-læser-app til Nextcloud\n\n- 📲 Synkroniser dine feeds med flere mobile eller desktop [klienter](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatiske opdateringer af dine nyhedsfeeds\n- 🆓 Gratis og open source under AGPLv3, ingen annoncer eller premium-funktioner\n\n**System Cron er i øjeblikket påkrævet for at denne app kan fungere**\n\nKravene kan findes [her](https://nextcloud.github.io/news/install/#dependencies)\n\nÆndringsloggen er tilgængelig [her](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nOpret en [fejlrapport](https://github.com/nextcloud/news/issues/new/choose)\n\nOpret en [funktionsanmodning](https://github.com/nextcloud/news/discussions/new)\n\nRapporter et [feedproblem](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Sidste jobudførelse kørte {relativeTime}. Noget gik galt.",
"Last job ran {relativeTime}." : "Sidste job kørte {relativeTime}.",
"Use system cron for updates" : "Benyt system cron til opdateringer",
"Disable this if you use a custom updater." : "Deaktiver dette, hvis du bruger en brugerdefineret opdatering.",
"Maximum read count per feed" : "Det maksimale antal læsninger per feed",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Definerer den maksimale mængde af artikler, der kan læses pr. feed, som ikke vil blive slettet af oprydningsjobbet; hvis gamle artikler dukker op igen efter at være blevet læst, skal du øge denne værdi; negative værdier såsom -1 vil slå denne funktion fra.",
"Delete unread articles automatically" : "Slet automatisk ulæste artikler",
"Enable this if you also want to delete unread articles." : "Aktivere dette hvis du også vil slette ulæste artikler.",
"Maximum redirects" : "Maksimum for videredirigeringer",
"How many redirects the feed fetcher should follow." : "Hvor mange omdirigeringer feedhenteren skal følge.",
"Feed fetcher timeout" : "Tidsudløb for feed-indhenter",

View File

@ -3,20 +3,39 @@ OC.L10N.register(
{
"Request failed, network connection unavailable!" : "درخواست انجام نشد ، اتصال به شبکه در دسترس نیست!",
"Request unauthorized. Are you logged in?" : "درخواست غیر مجاز. آیا وارد سیستم شده اید؟",
"Request forbidden. Are you an administrator?" : "Request forbidden. Are you an administrator?",
"Token expired or app not enabled! Reload the page!" : "گفتگوی منقضی شده یا برنامه فعال نشده است! بارگیری مجدد صفحه!",
"Internal server error! Please check your data/nextcloud.log file for additional information!" : "خطای سرور داخلی! لطفاً برای اطلاعات بیشتر ، پرونده / nextcloud.log خود را بررسی کنید!",
"Request failed, Nextcloud is in currently in maintenance mode!" : "درخواست انجام نشد، نکست‌کلود در حال حاضر در حالت تعمیر و نگهداری است!",
"News feeds" : "News feeds",
"Unread articles" : "مطالب خوانده نشده",
"News" : "اخبار",
"News folders" : "News folders",
"News articles" : "News articles",
"Shared with me" : "Shared with me",
"An RSS/Atom feed reader" : "An RSS/Atom feed reader",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Last job execution ran {relativeTime}. Something seems wrong.",
"Last job ran {relativeTime}." : "آخرین کار در {time} اجرا شد.",
"Use system cron for updates" : "برای بروزرسانی ها از سیستم cron استفاده کنید",
"Disable this if you use a custom updater." : "Disable this if you use a custom updater.",
"Maximum read count per feed" : "حداکثر تعداد خواندن در هر خوراک",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off.",
"Delete unread articles automatically" : "Delete unread articles automatically",
"Enable this if you also want to delete unread articles." : "Enable this if you also want to delete unread articles.",
"Maximum redirects" : "حداکثر تغییر مسیرها",
"How many redirects the feed fetcher should follow." : "How many redirects the feed fetcher should follow.",
"Feed fetcher timeout" : "خاتمه دادن به فست فایر",
"Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted." : "Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted.",
"Explore Service URL" : "URL سرویس را کاوش کنید",
"If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty." : "If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty.",
"Update interval" : "Update interval",
"Interval in seconds in which the feeds will be updated." : "Interval in seconds in which the feeds will be updated.",
"Successfully updated news configuration" : "Successfully updated news configuration",
"Unable to update news config" : "Unable to update news config",
"Download" : "دانلود",
"Close" : "بستن",
"Subscribe to" : "Subscribe to",
"No articles available" : "هیچ مقاله‌ای موجود نیست",
"No unread articles available" : "هیچ مقاله‌ی خوانده‌ نشده‌ای موجود نیست",
"Open website" : "باز کردن وب‌سایت",
@ -25,9 +44,16 @@ OC.L10N.register(
"Keep article unread" : "مقاله را نخوانید",
"Remove keep article unread" : "مقاله را نخوانید حذف کنید",
"Share" : "هم‌رسانی",
"Share with users" : "Share with users",
"Username" : "نام کاربری",
"No users found" : "No users found",
"Error while searching for users" : "Error while searching for users",
"Share on social media" : "Share on social media",
"I wanted you to see this article" : "I wanted you to see this article",
"Check out this article" : "Check out this article",
"by" : "با",
"from" : "از",
"shared by" : "shared by",
"Play audio" : "پخش صوت",
"Download audio" : "دانلود صوت",
"Download video" : "دانلود ویدئو",
@ -64,6 +90,7 @@ OC.L10N.register(
"Credentials" : "اعتبارهای",
"HTTP Basic Auth credentials must be stored unencrypted! Everyone with access to the server or database will be able to access them!" : "اعتبارنامه HTTP Basic Auth باید بدون رمزگذاری ذخیره شود! هر کس با دسترسی به سرور یا بانک اطلاعاتی قادر به دسترسی به آنها خواهد بود!",
"Password" : "گذرواژه",
"Auto discover Feed" : "Auto discover Feed",
"New Folder" : "پوشه جدید",
"Create" : "ایجاد کردن",
"Explore" : "کاوش",

View File

@ -1,20 +1,39 @@
{ "translations": {
"Request failed, network connection unavailable!" : "درخواست انجام نشد ، اتصال به شبکه در دسترس نیست!",
"Request unauthorized. Are you logged in?" : "درخواست غیر مجاز. آیا وارد سیستم شده اید؟",
"Request forbidden. Are you an administrator?" : "Request forbidden. Are you an administrator?",
"Token expired or app not enabled! Reload the page!" : "گفتگوی منقضی شده یا برنامه فعال نشده است! بارگیری مجدد صفحه!",
"Internal server error! Please check your data/nextcloud.log file for additional information!" : "خطای سرور داخلی! لطفاً برای اطلاعات بیشتر ، پرونده / nextcloud.log خود را بررسی کنید!",
"Request failed, Nextcloud is in currently in maintenance mode!" : "درخواست انجام نشد، نکست‌کلود در حال حاضر در حالت تعمیر و نگهداری است!",
"News feeds" : "News feeds",
"Unread articles" : "مطالب خوانده نشده",
"News" : "اخبار",
"News folders" : "News folders",
"News articles" : "News articles",
"Shared with me" : "Shared with me",
"An RSS/Atom feed reader" : "An RSS/Atom feed reader",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Last job execution ran {relativeTime}. Something seems wrong.",
"Last job ran {relativeTime}." : "آخرین کار در {time} اجرا شد.",
"Use system cron for updates" : "برای بروزرسانی ها از سیستم cron استفاده کنید",
"Disable this if you use a custom updater." : "Disable this if you use a custom updater.",
"Maximum read count per feed" : "حداکثر تعداد خواندن در هر خوراک",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off.",
"Delete unread articles automatically" : "Delete unread articles automatically",
"Enable this if you also want to delete unread articles." : "Enable this if you also want to delete unread articles.",
"Maximum redirects" : "حداکثر تغییر مسیرها",
"How many redirects the feed fetcher should follow." : "How many redirects the feed fetcher should follow.",
"Feed fetcher timeout" : "خاتمه دادن به فست فایر",
"Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted." : "Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted.",
"Explore Service URL" : "URL سرویس را کاوش کنید",
"If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty." : "If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty.",
"Update interval" : "Update interval",
"Interval in seconds in which the feeds will be updated." : "Interval in seconds in which the feeds will be updated.",
"Successfully updated news configuration" : "Successfully updated news configuration",
"Unable to update news config" : "Unable to update news config",
"Download" : "دانلود",
"Close" : "بستن",
"Subscribe to" : "Subscribe to",
"No articles available" : "هیچ مقاله‌ای موجود نیست",
"No unread articles available" : "هیچ مقاله‌ی خوانده‌ نشده‌ای موجود نیست",
"Open website" : "باز کردن وب‌سایت",
@ -23,9 +42,16 @@
"Keep article unread" : "مقاله را نخوانید",
"Remove keep article unread" : "مقاله را نخوانید حذف کنید",
"Share" : "هم‌رسانی",
"Share with users" : "Share with users",
"Username" : "نام کاربری",
"No users found" : "No users found",
"Error while searching for users" : "Error while searching for users",
"Share on social media" : "Share on social media",
"I wanted you to see this article" : "I wanted you to see this article",
"Check out this article" : "Check out this article",
"by" : "با",
"from" : "از",
"shared by" : "shared by",
"Play audio" : "پخش صوت",
"Download audio" : "دانلود صوت",
"Download video" : "دانلود ویدئو",
@ -62,6 +88,7 @@
"Credentials" : "اعتبارهای",
"HTTP Basic Auth credentials must be stored unencrypted! Everyone with access to the server or database will be able to access them!" : "اعتبارنامه HTTP Basic Auth باید بدون رمزگذاری ذخیره شود! هر کس با دسترسی به سرور یا بانک اطلاعاتی قادر به دسترسی به آنها خواهد بود!",
"Password" : "گذرواژه",
"Auto discover Feed" : "Auto discover Feed",
"New Folder" : "پوشه جدید",
"Create" : "ایجاد کردن",
"Explore" : "کاوش",

View File

@ -67,7 +67,7 @@ OC.L10N.register(
"Star article and jump to next one" : "Destacar o artigo e ir ao seguinte",
"Toggle keep current article unread" : "Conservar/retirar o artigo actual como non lido",
"Open article in new tab" : "Abrir o artigo nunha nova lapela",
"Toggle expand article in compact view" : "Expandir/contraer o artigo en vista compacta",
"Toggle expand article in compact view" : "Estender/contraer o artigo en vista compacta",
"Refresh" : "Actualizar",
"Load next feed" : "Cargar a seguinte fonte",
"Load previous feed" : "Cargar a fonte anterior",
@ -120,7 +120,7 @@ OC.L10N.register(
"Settings" : "Axustes",
"Disable mark read through scrolling" : "Desactivar o marcado como lido co desprazamento",
"Compact view" : "Vista compacta",
"Expand articles on key navigation" : "Expandir artigos na tecla de navegación",
"Expand articles on key navigation" : "Estender artigos na tecla de navegación",
"Show all articles" : "Amosar todos os artigos",
"Reverse ordering (oldest on top)" : "Ordenado inverso (máis vellos enriba)",
"Subscriptions (OPML)" : "Subscricións (OPML)",

View File

@ -65,7 +65,7 @@
"Star article and jump to next one" : "Destacar o artigo e ir ao seguinte",
"Toggle keep current article unread" : "Conservar/retirar o artigo actual como non lido",
"Open article in new tab" : "Abrir o artigo nunha nova lapela",
"Toggle expand article in compact view" : "Expandir/contraer o artigo en vista compacta",
"Toggle expand article in compact view" : "Estender/contraer o artigo en vista compacta",
"Refresh" : "Actualizar",
"Load next feed" : "Cargar a seguinte fonte",
"Load previous feed" : "Cargar a fonte anterior",
@ -118,7 +118,7 @@
"Settings" : "Axustes",
"Disable mark read through scrolling" : "Desactivar o marcado como lido co desprazamento",
"Compact view" : "Vista compacta",
"Expand articles on key navigation" : "Expandir artigos na tecla de navegación",
"Expand articles on key navigation" : "Estender artigos na tecla de navegación",
"Show all articles" : "Amosar todos os artigos",
"Reverse ordering (oldest on top)" : "Ordenado inverso (máis vellos enriba)",
"Subscriptions (OPML)" : "Subscricións (OPML)",

View File

@ -14,6 +14,8 @@ OC.L10N.register(
"News articles" : "Nyhetsartikler",
"Shared with me" : "Delt med meg",
"An RSS/Atom feed reader" : "En RSS/Atom-leser",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 En RSS/Atom Feed leseapp for Nextcloud\n\n- 📲 Synkroniser feed'ene dine med flere mobil eller desktop [klienter](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatisk oppdatering av nyhetsfeeder\n- 🆓 Gratis og open source under AGPLv3, ingen reklame eller premium funksjoner\n\n**System Cron er for øyeblikket påkrevet for at denne appen skal fungere**\n\nKrav kan bli funnet [her](https://nextcloud.github.io/news/install/#dependencies)\n\nEndringslogg er tilgjengelig [her](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nOpprett en [bug rapport](https://github.com/nextcloud/news/issues/new/choose)\n\nOpprett en [feature request](https://github.com/nextcloud/news/discussions/new)\n\nRapporter ett [feed problem](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Siste jobb kjørte {tid}. Noe virker galt.",
"Last job ran {relativeTime}." : "Siste jobb kjørte {relativeTime}.",
"Use system cron for updates" : "Bruk system-cron for oppdateringer",
"Disable this if you use a custom updater." : "Deaktiver dette hvis du bruker en egen oppdaterer.",

View File

@ -12,6 +12,8 @@
"News articles" : "Nyhetsartikler",
"Shared with me" : "Delt med meg",
"An RSS/Atom feed reader" : "En RSS/Atom-leser",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 En RSS/Atom Feed leseapp for Nextcloud\n\n- 📲 Synkroniser feed'ene dine med flere mobil eller desktop [klienter](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatisk oppdatering av nyhetsfeeder\n- 🆓 Gratis og open source under AGPLv3, ingen reklame eller premium funksjoner\n\n**System Cron er for øyeblikket påkrevet for at denne appen skal fungere**\n\nKrav kan bli funnet [her](https://nextcloud.github.io/news/install/#dependencies)\n\nEndringslogg er tilgjengelig [her](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nOpprett en [bug rapport](https://github.com/nextcloud/news/issues/new/choose)\n\nOpprett en [feature request](https://github.com/nextcloud/news/discussions/new)\n\nRapporter ett [feed problem](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Siste jobb kjørte {tid}. Noe virker galt.",
"Last job ran {relativeTime}." : "Siste jobb kjørte {relativeTime}.",
"Use system cron for updates" : "Bruk system-cron for oppdateringer",
"Disable this if you use a custom updater." : "Deaktiver dette hvis du bruker en egen oppdaterer.",

View File

@ -14,6 +14,7 @@ OC.L10N.register(
"Shared with me" : "Zdieľané so mnou",
"An RSS/Atom feed reader" : "RSS/Atom čítačka",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "Reader Aplikácia na čítanie kanálov RSS/Atom pre Nextcloud\n\n- 📲 Synchronizujte svoje kanály s viacerými [klientmi] pre mobily alebo počítače (https://nextcloud.github.io/news/clients/)\n- 🔄 Automatické aktualizácie vašich spravodajských kanálov\n- 🆓 Voľný a otvorený zdroj pod AGPLv3, žiadne reklamy ani prémiové funkcie\n\n** Na to, aby táto aplikácia fungovala, je momentálne potrebný Systemový Cron **\n\nPožiadavky nájdete [tu] (https://nextcloud.github.io/news/install/#dependencies)\n\nZoznam zmien je k dispozícii [tu] (https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nVytvorte [hlásenie chyby] (https://github.com/nextcloud/news/issues/new/choose)\n\nVytvorte [žiadosť o funkciu] (https://github.com/nextcloud/news/discussions/new)\n\nNahlásiť [problém s kanálom] (https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Posledná úloha prebehla {relativeTime}. Zdá sa, že niečo nie je v poriadku.",
"Last job ran {relativeTime}." : "Posledná úloha bežala {relativeTime}.",
"Use system cron for updates" : "Použiť systémový plánovač cron pre aktualizácie",
"Disable this if you use a custom updater." : "Toto vypnite ak používate vlastný updater.",
@ -44,7 +45,7 @@ OC.L10N.register(
"Share" : "Zdieľať",
"Share with users" : "Zdieľať s užívateľmi",
"Username" : "Používateľské meno",
"No users found" : "Žiadny užívatelia nenájdený",
"No users found" : "Žiadni používatelia nenájdení",
"Error while searching for users" : "Chyba pri vyhľadávaní užívateľov",
"Share on social media" : "Zdieľať cez sociálne médiá",
"I wanted you to see this article" : "Chcel by som, aby ste videli tento článok",
@ -85,7 +86,7 @@ OC.L10N.register(
"Folder name" : "Názov priečinka",
"Go back" : "Ísť späť",
"Folder exists already!" : "Priečinok už existuje!",
"Credentials" : "Prihlasovanie údaje",
"Credentials" : "Prihlasovacie údaje",
"HTTP Basic Auth credentials must be stored unencrypted! Everyone with access to the server or database will be able to access them!" : "Prihlasovacie údaje pre HTTP Basic Auth musia byť uložené nezašifrované! Každý s prístupom k serveru alebo databáze si ich bude môcť prečítať!",
"Password" : "Heslo",
"Auto discover Feed" : "Automaticky objavovať Informačný kanál",
@ -109,7 +110,7 @@ OC.L10N.register(
"Ignore updated" : "Ignorovať aktualizáciu",
"Open feed URL" : "Otvoriť adresu zdroja",
"Delete" : "Zmazať",
"Dismiss" : "Odmietnuť",
"Dismiss" : "Zatvoriť",
"Collapse" : "Zvinúť",
"Deleted folder" : "Zmazaný priečinok",
"Undo delete folder" : "Obnoviť zmazaný priečinok",

View File

@ -12,6 +12,7 @@
"Shared with me" : "Zdieľané so mnou",
"An RSS/Atom feed reader" : "RSS/Atom čítačka",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "Reader Aplikácia na čítanie kanálov RSS/Atom pre Nextcloud\n\n- 📲 Synchronizujte svoje kanály s viacerými [klientmi] pre mobily alebo počítače (https://nextcloud.github.io/news/clients/)\n- 🔄 Automatické aktualizácie vašich spravodajských kanálov\n- 🆓 Voľný a otvorený zdroj pod AGPLv3, žiadne reklamy ani prémiové funkcie\n\n** Na to, aby táto aplikácia fungovala, je momentálne potrebný Systemový Cron **\n\nPožiadavky nájdete [tu] (https://nextcloud.github.io/news/install/#dependencies)\n\nZoznam zmien je k dispozícii [tu] (https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nVytvorte [hlásenie chyby] (https://github.com/nextcloud/news/issues/new/choose)\n\nVytvorte [žiadosť o funkciu] (https://github.com/nextcloud/news/discussions/new)\n\nNahlásiť [problém s kanálom] (https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Posledná úloha prebehla {relativeTime}. Zdá sa, že niečo nie je v poriadku.",
"Last job ran {relativeTime}." : "Posledná úloha bežala {relativeTime}.",
"Use system cron for updates" : "Použiť systémový plánovač cron pre aktualizácie",
"Disable this if you use a custom updater." : "Toto vypnite ak používate vlastný updater.",
@ -42,7 +43,7 @@
"Share" : "Zdieľať",
"Share with users" : "Zdieľať s užívateľmi",
"Username" : "Používateľské meno",
"No users found" : "Žiadny užívatelia nenájdený",
"No users found" : "Žiadni používatelia nenájdení",
"Error while searching for users" : "Chyba pri vyhľadávaní užívateľov",
"Share on social media" : "Zdieľať cez sociálne médiá",
"I wanted you to see this article" : "Chcel by som, aby ste videli tento článok",
@ -83,7 +84,7 @@
"Folder name" : "Názov priečinka",
"Go back" : "Ísť späť",
"Folder exists already!" : "Priečinok už existuje!",
"Credentials" : "Prihlasovanie údaje",
"Credentials" : "Prihlasovacie údaje",
"HTTP Basic Auth credentials must be stored unencrypted! Everyone with access to the server or database will be able to access them!" : "Prihlasovacie údaje pre HTTP Basic Auth musia byť uložené nezašifrované! Každý s prístupom k serveru alebo databáze si ich bude môcť prečítať!",
"Password" : "Heslo",
"Auto discover Feed" : "Automaticky objavovať Informačný kanál",
@ -107,7 +108,7 @@
"Ignore updated" : "Ignorovať aktualizáciu",
"Open feed URL" : "Otvoriť adresu zdroja",
"Delete" : "Zmazať",
"Dismiss" : "Odmietnuť",
"Dismiss" : "Zatvoriť",
"Collapse" : "Zvinúť",
"Deleted folder" : "Zmazaný priečinok",
"Undo delete folder" : "Obnoviť zmazaný priečinok",

View File

@ -3,6 +3,7 @@ OC.L10N.register(
{
"Request failed, network connection unavailable!" : "Zahteva je spodletela. Omrežna povezava trenutno ni na voljo!",
"Request unauthorized. Are you logged in?" : "Zahteva ni ustrezno overjena. Ali ste prijavljeni?",
"Request forbidden. Are you an administrator?" : "Zahteve ni dovoljeno izvesti. Ali so na voljo skrbniška dovoljena?",
"Token expired or app not enabled! Reload the page!" : "Žeton je pretekel ali pa program ni omogočen! Poskusite osvežiti stran!",
"Internal server error! Please check your data/nextcloud.log file for additional information!" : "Notranja napaka strežnika! Preverite datoteko data/nextcloud.log za podrobnosti!",
"Request failed, Nextcloud is in currently in maintenance mode!" : "Zahteva je spodletela! Okolje Nextcloud je trenutno v vzdrževalnem načinu!",
@ -10,20 +11,28 @@ OC.L10N.register(
"Unread articles" : "Neprebrani prispevki",
"News" : "Novice",
"News folders" : "Mape novic",
"News articles" : "Novičarski prispevki",
"Shared with me" : "V souporabi z mano",
"An RSS/Atom feed reader" : "Bralnik virov RSS/Atom",
"Last job ran {relativeTime}." : "osvežitev je bila nazadnje izvedena {relativeTime}.",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 Bralnik virov RSS/Atom za okolje Nextcloud\n\n- 📲 Omogoča sočasno usklajevanje virov z več mobilnimi in namiznimi [programi](https://nextcloud.github.io/news/clients/)\n- 🔄 Samodejno posodablja vire novic\n- 🆓 Je prosto in brezplačno orodje, objavljeno pod pogoji dovoljenjaAGPLv3, brez oglasov, brez dodatnih plačljivih možnosti\n\n**Za delovanje mora biti zagnano okolje Cron**\n\nZahteve programa so objavljene med podrobnostmi [namestitve](https://nextcloud.github.io/news/install/#dependencies)\n\nPodrobnosti objave so na voljo v datoteki [Changelog.md](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nPoročila o hroščih pa se zbirajo na spletišču [GitHub](https://github.com/nextcloud/news/issues/new/choose)\n\nO [predlogih novih zmožnosti](https://github.com/nextcloud/news/discussions/new) razpravlja živahna skupnost\n\nNapake objave vira, pa je mogoče objavljati med [pogovori](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Zadnji poskus izvedbe je bil izveden {relativeTime}. Kaže, da je prišlo do napake.",
"Last job ran {relativeTime}." : "Osvežitev je bila nazadnje izvedena {relativeTime}.",
"Use system cron for updates" : "Za posodobitve uporabi sistemski program »cron«",
"Disable this if you use a custom updater." : "Možnost onemogočite, če uporabljate posodabljalnik po meri.",
"Maximum read count per feed" : "Največje število prikazanih virov",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Določa največje število prispevkov vira, ki bodo ostali vidni po čiščenju zgodovine. Če se pojavljajo starejši prispevki, je določilo nastavljeno prenizko. Vrednost -1 onemogoči izvajanje možnosti.",
"Delete unread articles automatically" : "Samodejno izbriši neprebrane prispevke",
"Enable this if you also want to delete unread articles." : "Možnost omogoča brisanje neprebranih prispevkov.",
"Maximum redirects" : "Največje število preusmeritev",
"How many redirects the feed fetcher should follow." : "Koliko preusmeritvam naj sledi bralnik virov",
"Feed fetcher timeout" : "Pridobivanje vira je časovno poteklo",
"Feed fetcher timeout" : "Časovni pretek pridobivanja vira",
"Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted." : "Čas, namenjen nalaganju virov RSS in Atom. Če traja dlje je nalaganje virov prekinjeno.",
"Explore Service URL" : "Razišči spletni naslov storitve",
"If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty." : "Če je podan, bo prek tega naslova URL storitve potekala poizvedba za vire in njihov izbor. Za preklop v vgrajeno storitev določevanja, mora biti polje prazno.",
"Update interval" : "Razmik posodobitev",
"Interval in seconds in which the feeds will be updated." : "Časovni zamik v sekundah za posodabljanje spletnih virov.",
"Successfully updated news configuration" : "Nastavitve novic so uspešno posodobljene",
"Unable to update news config" : "Ni mogoče posodobiti nastavitev novic",
"Download" : "Prejmi",
"Close" : "Zapri",
"Subscribe to" : "Naročnina na",

View File

@ -1,6 +1,7 @@
{ "translations": {
"Request failed, network connection unavailable!" : "Zahteva je spodletela. Omrežna povezava trenutno ni na voljo!",
"Request unauthorized. Are you logged in?" : "Zahteva ni ustrezno overjena. Ali ste prijavljeni?",
"Request forbidden. Are you an administrator?" : "Zahteve ni dovoljeno izvesti. Ali so na voljo skrbniška dovoljena?",
"Token expired or app not enabled! Reload the page!" : "Žeton je pretekel ali pa program ni omogočen! Poskusite osvežiti stran!",
"Internal server error! Please check your data/nextcloud.log file for additional information!" : "Notranja napaka strežnika! Preverite datoteko data/nextcloud.log za podrobnosti!",
"Request failed, Nextcloud is in currently in maintenance mode!" : "Zahteva je spodletela! Okolje Nextcloud je trenutno v vzdrževalnem načinu!",
@ -8,20 +9,28 @@
"Unread articles" : "Neprebrani prispevki",
"News" : "Novice",
"News folders" : "Mape novic",
"News articles" : "Novičarski prispevki",
"Shared with me" : "V souporabi z mano",
"An RSS/Atom feed reader" : "Bralnik virov RSS/Atom",
"Last job ran {relativeTime}." : "osvežitev je bila nazadnje izvedena {relativeTime}.",
"📰 A RSS/Atom Feed reader App for Nextcloud\n\n- 📲 Synchronize your feeds with multiple mobile or desktop [clients](https://nextcloud.github.io/news/clients/)\n- 🔄 Automatic updates of your news feeds\n- 🆓 Free and open source under AGPLv3, no ads or premium functions\n\n**System Cron is currently required for this app to work**\n\nRequirements can be found [here](https://nextcloud.github.io/news/install/#dependencies)\n\nThe Changelog is available [here](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nCreate a [bug report](https://github.com/nextcloud/news/issues/new/choose)\n\nCreate a [feature request](https://github.com/nextcloud/news/discussions/new)\n\nReport a [feed issue](https://github.com/nextcloud/news/discussions/new)" : "📰 Bralnik virov RSS/Atom za okolje Nextcloud\n\n- 📲 Omogoča sočasno usklajevanje virov z več mobilnimi in namiznimi [programi](https://nextcloud.github.io/news/clients/)\n- 🔄 Samodejno posodablja vire novic\n- 🆓 Je prosto in brezplačno orodje, objavljeno pod pogoji dovoljenjaAGPLv3, brez oglasov, brez dodatnih plačljivih možnosti\n\n**Za delovanje mora biti zagnano okolje Cron**\n\nZahteve programa so objavljene med podrobnostmi [namestitve](https://nextcloud.github.io/news/install/#dependencies)\n\nPodrobnosti objave so na voljo v datoteki [Changelog.md](https://github.com/nextcloud/news/blob/master/CHANGELOG.md)\n\nPoročila o hroščih pa se zbirajo na spletišču [GitHub](https://github.com/nextcloud/news/issues/new/choose)\n\nO [predlogih novih zmožnosti](https://github.com/nextcloud/news/discussions/new) razpravlja živahna skupnost\n\nNapake objave vira, pa je mogoče objavljati med [pogovori](https://github.com/nextcloud/news/discussions/new)",
"Last job execution ran {relativeTime}. Something seems wrong." : "Zadnji poskus izvedbe je bil izveden {relativeTime}. Kaže, da je prišlo do napake.",
"Last job ran {relativeTime}." : "Osvežitev je bila nazadnje izvedena {relativeTime}.",
"Use system cron for updates" : "Za posodobitve uporabi sistemski program »cron«",
"Disable this if you use a custom updater." : "Možnost onemogočite, če uporabljate posodabljalnik po meri.",
"Maximum read count per feed" : "Največje število prikazanih virov",
"Defines the maximum amount of articles that can be read per feed which will not be deleted by the cleanup job; if old articles reappear after being read, increase this value; negative values such as -1 will turn this feature off." : "Določa največje število prispevkov vira, ki bodo ostali vidni po čiščenju zgodovine. Če se pojavljajo starejši prispevki, je določilo nastavljeno prenizko. Vrednost -1 onemogoči izvajanje možnosti.",
"Delete unread articles automatically" : "Samodejno izbriši neprebrane prispevke",
"Enable this if you also want to delete unread articles." : "Možnost omogoča brisanje neprebranih prispevkov.",
"Maximum redirects" : "Največje število preusmeritev",
"How many redirects the feed fetcher should follow." : "Koliko preusmeritvam naj sledi bralnik virov",
"Feed fetcher timeout" : "Pridobivanje vira je časovno poteklo",
"Feed fetcher timeout" : "Časovni pretek pridobivanja vira",
"Maximum number of seconds to wait for an RSS or Atom feed to load; if it takes longer the update will be aborted." : "Čas, namenjen nalaganju virov RSS in Atom. Če traja dlje je nalaganje virov prekinjeno.",
"Explore Service URL" : "Razišči spletni naslov storitve",
"If given, this service's URL will be queried for displaying the feeds in the explore feed section. To fall back to the built in explore service, leave this input empty." : "Če je podan, bo prek tega naslova URL storitve potekala poizvedba za vire in njihov izbor. Za preklop v vgrajeno storitev določevanja, mora biti polje prazno.",
"Update interval" : "Razmik posodobitev",
"Interval in seconds in which the feeds will be updated." : "Časovni zamik v sekundah za posodabljanje spletnih virov.",
"Successfully updated news configuration" : "Nastavitve novic so uspešno posodobljene",
"Unable to update news config" : "Ni mogoče posodobiti nastavitev novic",
"Download" : "Prejmi",
"Close" : "Zapri",
"Subscribe to" : "Naročnina na",

View File

@ -24,11 +24,11 @@ use OCA\News\Hooks\UserDeleteHook;
use OCA\News\Search\FeedSearchProvider;
use OCA\News\Search\FolderSearchProvider;
use OCA\News\Search\ItemSearchProvider;
use OCA\News\Utility\Cache;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\ITempManager;
use OCP\AppFramework\App;
use OCA\News\Fetcher\FeedFetcher;
@ -92,15 +92,9 @@ class Application extends App implements IBootstrap
$context->registerParameter('exploreDir', __DIR__ . '/../Explore/feeds');
$context->registerService(HTMLPurifier::class, function (ContainerInterface $c): HTMLPurifier {
$directory = $c->get(ITempManager::class)->getTempBaseDir() . '/news/cache/purifier';
if (!is_dir($directory)) {
mkdir($directory, 0770, true);
}
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.ForbiddenAttributes', 'class');
$config->set('Cache.SerializerPath', $directory);
$config->set('Cache.SerializerPath', $c->get(Cache::class)->getCache("purifier"));
$config->set('HTML.SafeIframe', true);
$config->set(
'URI.SafeIframeRegexp',
@ -140,7 +134,7 @@ class Application extends App implements IBootstrap
$context->registerService(Favicon::class, function (ContainerInterface $c): Favicon {
$favicon = new Favicon();
$favicon->cache(['dir' => $c->get(ITempManager::class)->getTempBaseDir()]);
$favicon->cache(['dir' => $c->get(Cache::class)->getCache("feedFavicon")]);
return $favicon;
});
}

View File

@ -0,0 +1,76 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*/
namespace OCA\News\Command\Updater;
use DateTime;
use OCP\Util;
use OCA\News\Service\StatusService;
use OCA\News\Service\UpdaterService;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Job extends Command
{
/**
* @var StatusService Status service
*/
private $statusService;
/**
* @var UpdaterService Update service
*/
private $updaterService;
public function __construct(StatusService $statusService, UpdaterService $updaterService)
{
parent::__construct();
$this->statusService = $statusService;
$this->updaterService = $updaterService;
}
/**
* @return void
*/
protected function configure()
{
$this->setName('news:updater:job')
->addOption(
'reset',
null,
InputOption::VALUE_NONE,
'If the job should be reset, warning this might lead to issues.'
)
->setDescription('Console API for checking the update job status and to reset it.');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$reset = (bool) $input->getOption('reset');
[$major, $minor, $micro] = Util::getVersion();
if ($major < 26) {
$output->writeln("Error: This only works with Nextcloud 26 or newer.");
return 1;
}
$output->writeln("Checking update Status");
$date = new DateTime();
$date->setTimestamp($this->statusService->getUpdateTime());
$output->writeln("Last Execution was ".$date->format('Y-m-d H:i:s e'));
if ($reset) {
$output->writeln("Attempting to reset the job.");
$this->updaterService->reset();
$output->writeln("Done, job should execute on next schedule.");
}
return 0;
}
}

View File

@ -94,6 +94,29 @@ class FetcherConfig
return $this;
}
/**
* Checks for available encoding options
*
* @return String list of supported encoding types
*/
public function checkEncoding()
{
$supportedEncoding = [];
// check curl features
$curl_features = curl_version()["features"];
$bitfields = array('CURL_VERSION_LIBZ' => ['gzip', 'deflate'], 'CURL_VERSION_BROTLI' => ['br']);
foreach ($bitfields as $feature => $header) {
// checking available features via the 'features' bitmask and adding available types to the list
if (defined($feature) && $curl_features & constant($feature)) {
$supportedEncoding = array_merge($supportedEncoding, $header);
}
}
return implode(", ", $supportedEncoding);
}
/**
* Configure a guzzle client
*
@ -106,7 +129,7 @@ class FetcherConfig
'headers' => [
'User-Agent' => static::DEFAULT_USER_AGENT,
'Accept' => static::DEFAULT_ACCEPT,
'Accept-Encoding' => 'gzip, deflate',
'Accept-Encoding' => $this->checkEncoding()
],
];

View File

@ -96,6 +96,7 @@ class PageController extends Controller
$csp->addAllowedImageDomain('*')
->addAllowedMediaDomain('*')
->addAllowedConnectDomain('*')// chrome breaks on audio elements
->allowEvalScript(true)
->addAllowedFrameDomain('https://youtube.com')
->addAllowedFrameDomain('https://www.youtube.com')
->addAllowedFrameDomain('https://player.vimeo.com')

View File

@ -38,14 +38,14 @@ class FeedIoClient implements ClientInterface
}
/**
* @param string $url
* @param DateTime $modifiedSince
* @param string $url
* @param DateTime|null $modifiedSince
*
* @return ResponseInterface
* @throws ServerErrorException|GuzzleException
* @throws NotFoundException
*/
public function getResponse(string $url, DateTime $modifiedSince) : ResponseInterface
public function getResponse(string $url, ?DateTime $modifiedSince = null) : ResponseInterface
{
$modifiedSince->setTimezone(new \DateTimeZone('GMT'));
try {
@ -65,7 +65,7 @@ class FeedIoClient implements ClientInterface
case 404:
throw new NotFoundException($e->getMessage());
default:
throw new ServerErrorException($e->getMessage());
throw new ServerErrorException($e->getResponse());
}
}
}

View File

@ -30,6 +30,7 @@ use OCP\ITempManager;
use OCA\News\Db\Item;
use OCA\News\Db\Feed;
use OCA\News\Utility\Time;
use OCA\News\Utility\Cache;
use OCA\News\Scraper\Scraper;
use OCA\News\Config\FetcherConfig;
use Psr\Log\LoggerInterface;
@ -58,11 +59,6 @@ class FeedFetcher implements IFeedFetcher
*/
private $l10n;
/**
* @var ITempManager
*/
private $ITempManager;
/**
* @var Time
*/
@ -73,22 +69,34 @@ class FeedFetcher implements IFeedFetcher
*/
private $logger;
/**
* @var FetcherConfig
*/
private $fetcherConfig;
/**
* @var Cache
*/
private $cache;
public function __construct(
FeedIo $fetcher,
Favicon $favicon,
Scraper $scraper,
IL10N $l10n,
ITempManager $ITempManager,
Time $time,
LoggerInterface $logger
LoggerInterface $logger,
FetcherConfig $fetcherConfig,
Cache $cache
) {
$this->reader = $fetcher;
$this->faviconFactory = $favicon;
$this->scraper = $scraper;
$this->l10n = $l10n;
$this->ITempManager = $ITempManager;
$this->time = $time;
$this->logger = $logger;
$this->fetcherConfig = $fetcherConfig;
$this->cache = $cache;
}
@ -127,7 +135,6 @@ class FeedFetcher implements IFeedFetcher
$lastModified = null;
}
$url = $url2->getNormalizedURL();
$this->reader->resetFilters();
$resource = $this->reader->read($url, null, $lastModified);
$location = $resource->getUrl();
@ -388,8 +395,10 @@ class FeedFetcher implements IFeedFetcher
return is_string($return) ? $return : null;
}
// logo will be saved in the tmp folder provided by Nextcloud, file is named as md5 of the url
$favicon_path = join(DIRECTORY_SEPARATOR, [$this->ITempManager->getTempBaseDir(), md5($favicon)]);
$logo_cache = $this->cache->getCache("feedLogo");
// file name of the logo is md5 of the url
$favicon_path = join(DIRECTORY_SEPARATOR, [$logo_cache, md5($favicon)]);
$downloaded = false;
if (file_exists($favicon_path)) {
@ -409,17 +418,18 @@ class FeedFetcher implements IFeedFetcher
'headers' => [
'User-Agent' => FetcherConfig::DEFAULT_USER_AGENT,
'Accept' => 'image/*',
'If-Modified-Since' => date(DateTime::RFC7231, $last_modified)
'If-Modified-Since' => date(DateTime::RFC7231, $last_modified),
'Accept-Encoding' => $this->fetcherConfig->checkEncoding()
]
]
);
$downloaded = true;
$this->logger->debug(
"Feed:{url} Logo:{logo} Status:{status}",
"Feed:{feed} Logo:{logo} Status:{status}",
[
'status' => $response->getStatusCode(),
'url' => $favicon_path,
'feed' => $url,
'logo' => $favicon
]
);
@ -437,6 +447,14 @@ class FeedFetcher implements IFeedFetcher
// check if file is actually an image
if (!$is_image) {
$this->logger->debug(
"Downloaded file:{file} from {url} is not an image",
[
'file' => $favicon_path,
'url' => $favicon
]
);
$return = $this->faviconFactory->get($base_url);
return is_string($return) ? $return : null;
}
@ -444,6 +462,13 @@ class FeedFetcher implements IFeedFetcher
list($width, $height, $type, $attr) = getimagesize($favicon_path);
// check if image is square else fall back to favicon
if ($width !== $height) {
$this->logger->debug(
"Downloaded file:{file} from {url} is not square",
[
'file' => $favicon_path,
'url' => $favicon
]
);
$return = $this->faviconFactory->get($base_url);
return is_string($return) ? $return : null;
}

View File

@ -16,6 +16,7 @@ use fivefilters\Readability\Configuration;
use fivefilters\Readability\ParseException;
use League\Uri\Exceptions\SyntaxError;
use Psr\Log\LoggerInterface;
use OCA\News\Config\FetcherConfig;
class Scraper implements IScraper
{
@ -37,7 +38,7 @@ class Scraper implements IScraper
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // do not return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
//CURLOPT_USERAGENT => "php-news", // who am i
CURLOPT_USERAGENT => FetcherConfig::DEFAULT_USER_AGENT, // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response

View File

@ -92,12 +92,8 @@ class StatusService
$time = 0;
[$major, $minor, $micro] = Util::getVersion();
if ($major >= 26) {
$myJobList = $this->jobList->getJobsIterator(UpdaterJob::class, 1, 0);
$time = $myJobList->current()->getLastRun();
}
$myJobList = $this->jobList->getJobsIterator(UpdaterJob::class, 1, 0);
$time = $myJobList->current()->getLastRun();
return $time;
}

View File

@ -14,6 +14,9 @@
namespace OCA\News\Service;
use OCP\BackgroundJob\IJobList;
use OCA\News\Cron\UpdaterJob;
class UpdaterService
{
@ -32,14 +35,19 @@ class UpdaterService
*/
private $itemService;
/** @var IJobList */
private $jobList;
public function __construct(
FolderServiceV2 $folderService,
FeedServiceV2 $feedService,
ItemServiceV2 $itemService
ItemServiceV2 $itemService,
IJobList $jobList
) {
$this->folderService = $folderService;
$this->feedService = $feedService;
$this->itemService = $itemService;
$this->jobList = $jobList;
}
@ -60,4 +68,14 @@ class UpdaterService
{
$this->itemService->purgeOverThreshold();
}
public function reset(): int
{
$myJobList = $this->jobList->getJobsIterator(UpdaterJob::class, 1, 0);
$job = $myJobList->current();
$this->jobList->resetBackgroundJob($job);
return 0;
}
}

59
lib/Utility/Cache.php Normal file
View File

@ -0,0 +1,59 @@
<?php
/**
* Nextcloud - News
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Benjamin Brahmer <info@b-brahmer.de>
* @copyright 2023 Benjamin Brahmer
*/
namespace OCA\News\Utility;
use OCP\ITempManager;
use OCP\IConfig;
class Cache
{
/**
* @var ITempManager
*/
private $ITempManager;
/**
* @var IConfig
*/
private $IConfig;
public function __construct(
ITempManager $ITempManager,
IConfig $IConfig
) {
$this->ITempManager = $ITempManager;
$this->IConfig = $IConfig;
}
/**
* Get a news app cache directory
*
* @param String $name for the sub-directory, is created if not existing
*
* @return String $directory The path for the cache
*/
public function getCache(String $name): String
{
$baseDir = $this->ITempManager->getTempBaseDir();
$instanceID = $this->IConfig->getSystemValue('instanceid');
$directory = join(DIRECTORY_SEPARATOR, [$baseDir, "news-" . $instanceID, 'cache', $name]);
if (!is_dir($directory)) {
mkdir($directory, 0770, true);
}
return $directory;
}
}

View File

@ -11,8 +11,9 @@ nav:
- clients.md
- admin.md
- developer.md
- faq.md
- troubleshooting.md
- Features:
- Integration: features/integration.md
- Custom CSS: features/customCSS.md
- Plugins: features/plugins.md
- Themes: features/themes.md

111
package-lock.json generated
View File

@ -15,9 +15,9 @@
"@nextcloud/moment": "^1.2.1",
"@nextcloud/password-confirmation": "^1.0.1",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^7.0.1",
"@nextcloud/vue": "^7.8.0",
"lodash": "^4.17.21",
"vue": "^2.6.14",
"vue": "^2.7.0",
"vue-router": "^3.5.3",
"vuex": "^3.6.2"
},
@ -97,7 +97,7 @@
},
"engines": {
"node": "^16.0.0",
"npm": "^8.0.0"
"npm": "^7.0.0 || ^8.0.0"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@ -882,8 +882,8 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
"integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
"@babel/helper-create-regexp-features-plugin": "^7.20.5",
"@babel/helper-plugin-utils": "^7.20.2"
},
"engines": {
"node": ">=6.9.0"
@ -3870,11 +3870,11 @@
"dev": true
},
"node_modules/@types/mdast": {
"version": "3.0.12",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz",
"integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==",
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
"integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
"dependencies": {
"@types/unist": "^2"
"@types/unist": "*"
}
},
"node_modules/@types/mime": {
@ -4451,14 +4451,14 @@
}
},
"node_modules/@vue/eslint-config-typescript": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz",
"integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==",
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.2.tgz",
"integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==",
"dev": true,
"dependencies": {
"@typescript-eslint/eslint-plugin": "^5.59.1",
"@typescript-eslint/parser": "^5.59.1",
"vue-eslint-parser": "^9.1.1"
"@typescript-eslint/eslint-plugin": "^5.0.0",
"@typescript-eslint/parser": "^5.0.0",
"vue-eslint-parser": "^9.0.0"
},
"engines": {
"node": "^14.17.0 || >=16.0.0"
@ -13373,16 +13373,13 @@
"optional": true,
"peer": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
"yallist": "^3.0.2"
}
},
"node_modules/make-fetch-happen/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"node_modules/make-fetch-happen/node_modules/lru-cache/node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true,
"optional": true,
"peer": true
@ -16604,9 +16601,9 @@
"dev": true
},
"node_modules/resolve.exports": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
"integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz",
"integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==",
"engines": {
"node": ">=10"
}
@ -17893,9 +17890,9 @@
"dev": true
},
"node_modules/style-to-object": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz",
"integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==",
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz",
"integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==",
"dependencies": {
"inline-style-parser": "0.1.1"
}
@ -21302,8 +21299,8 @@
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
"integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
"requires": {
"@babel/helper-create-regexp-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
"@babel/helper-create-regexp-features-plugin": "^7.20.5",
"@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-arrow-functions": {
@ -23479,11 +23476,11 @@
"dev": true
},
"@types/mdast": {
"version": "3.0.12",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz",
"integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==",
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
"integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
"requires": {
"@types/unist": "^2"
"@types/unist": "*"
}
},
"@types/mime": {
@ -23935,14 +23932,14 @@
}
},
"@vue/eslint-config-typescript": {
"version": "11.0.3",
"resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz",
"integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==",
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.2.tgz",
"integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==",
"dev": true,
"requires": {
"@typescript-eslint/eslint-plugin": "^5.59.1",
"@typescript-eslint/parser": "^5.59.1",
"vue-eslint-parser": "^9.1.1"
"@typescript-eslint/eslint-plugin": "^5.0.0",
"@typescript-eslint/parser": "^5.0.0",
"vue-eslint-parser": "^9.0.0"
}
},
"@vue/test-utils": {
@ -30651,16 +30648,18 @@
"optional": true,
"peer": true,
"requires": {
"yallist": "^4.0.0"
"yallist": "^3.0.2"
},
"dependencies": {
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true,
"optional": true,
"peer": true
}
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
"optional": true,
"peer": true
}
}
},
@ -33004,9 +33003,9 @@
"dev": true
},
"resolve.exports": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
"integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg=="
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz",
"integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg=="
},
"retry": {
"version": "0.12.0",
@ -34024,9 +34023,9 @@
"dev": true
},
"style-to-object": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.2.tgz",
"integrity": "sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==",
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz",
"integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==",
"requires": {
"inline-style-parser": "0.1.1"
}

View File

@ -51,12 +51,19 @@
"@nextcloud/moment": "^1.2.1",
"@nextcloud/password-confirmation": "^1.0.1",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^7.0.1",
"@nextcloud/vue": "^7.8.0",
"vue": "^2.7.0",
"lodash": "^4.17.21",
"vue": "^2.6.14",
"vue-router": "^3.5.3",
"vuex": "^3.6.2"
},
"browserslist": [
"extends @nextcloud/browserslist-config"
],
"engines": {
"node": "^16.0.0",
"npm": "^7.0.0 || ^8.0.0"
},
"devDependencies": {
"@babel/core": "^7.11.1",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",

View File

@ -121,7 +121,7 @@ import { confirmPassword } from '@nextcloud/password-confirmation'
* Debounce helper for method
* TODO: Should we remove this and use library?
*
* @param {Function} func - The callback function
* @param {function()} func - The callback function
* @param {number} wait - Time to wait in miliseconds
*/
function debounce(func, wait) {

View File

@ -28,11 +28,13 @@ use \OCA\News\Db\Feed;
use \OCA\News\Db\Item;
use OCA\News\Scraper\Scraper;
use OCA\News\Fetcher\FeedFetcher;
use GuzzleHttp\Client;
use OCA\News\Config\FetcherConfig;
use OCA\News\Utility\Time;
use OCA\News\Utility\Cache;
use OCP\IL10N;
use OCP\ITempManager;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
@ -82,11 +84,6 @@ class FeedFetcherTest extends TestCase
*/
private $l10n;
/**
* @var MockObject|ITempManager
*/
private $ITempManager;
/**
* @var MockObject|ItemInterface
*/
@ -108,9 +105,14 @@ class FeedFetcherTest extends TestCase
private $scraper;
/**
* @var MockObject|Client
* @var MockObject|FetcherConfig
*/
private $client;
private $fetcherConfig;
/**
* @var MockObject|Cache
*/
private $cache;
//metadata
/**
@ -158,9 +160,6 @@ class FeedFetcherTest extends TestCase
$this->l10n = $this->getMockBuilder(IL10N::class)
->disableOriginalConstructor()
->getMock();
$this->ITempManager = $this->getMockBuilder(ITempManager::class)
->disableOriginalConstructor()
->getMock();
$this->reader = $this->getMockBuilder(FeedIo::class)
->disableOriginalConstructor()
->getMock();
@ -194,7 +193,10 @@ class FeedFetcherTest extends TestCase
$this->scraper = $this->getMockBuilder(Scraper::class)
->disableOriginalConstructor()
->getMock();
$this->client = $this->getMockBuilder(Client::class)
$this->fetcherConfig = $this->getMockBuilder(FetcherConfig::class)
->disableOriginalConstructor()
->getMock();
$this->cache = $this->getMockBuilder(Cache::class)
->disableOriginalConstructor()
->getMock();
$this->fetcher = new FeedFetcher(
@ -202,10 +204,10 @@ class FeedFetcherTest extends TestCase
$this->favicon,
$this->scraper,
$this->l10n,
$this->ITempManager,
$timeFactory,
$this->logger,
$this->client
$this->fetcherConfig,
$this->cache
);
$this->url = 'http://tests/';

View File

@ -18,6 +18,8 @@ use OCA\News\Service\FolderServiceV2;
use OCA\News\Service\ItemServiceV2;
use OCA\News\Service\UpdaterService;
use PHPUnit\Framework\TestCase;
use OCP\BackgroundJob\IJobList;
use OCP\BackgroundJob\IJob;
class UpdaterTest extends TestCase
{
@ -42,6 +44,11 @@ class UpdaterTest extends TestCase
*/
private $updater;
/**
* @var \PHPUnit\Framework\MockObject\MockObject|IJobList
*/
private $jobList;
protected function setUp(): void
{
$this->folderService = $this->getMockBuilder(FolderServiceV2::class)
@ -53,10 +60,14 @@ class UpdaterTest extends TestCase
$this->itemService = $this->getMockBuilder(ItemServiceV2::class)
->disableOriginalConstructor()
->getMock();
$this->jobList = $this->getMockBuilder(IJobList::class)
->disableOriginalConstructor()
->getMock();
$this->updater = new UpdaterService(
$this->folderService,
$this->feedService,
$this->itemService
$this->itemService,
$this->jobList
);
}
@ -83,4 +94,5 @@ class UpdaterTest extends TestCase
->method('fetchAll');
$this->updater->update();
}
}

21
tests/command/update.bats Normal file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env bats
# This only works with NC 26
load "helpers/settings"
load "../test_helper/bats-support/load"
load "../test_helper/bats-assert/load"
TESTSUITE="Update"
@test "[$TESTSUITE] Job status" {
run ./occ news:updater:job
assert_success
}
@test "[$TESTSUITE] Job reset" {
run ./occ news:updater:job --reset
assert_success
}

View File

@ -85,6 +85,33 @@ teardown() {
assert_output --partial "${ID_LIST1[*]}"
}
@test "[$TESTSUITE] Test feed with 'outdated' items https://github.com/nextcloud/news/issues/2236 " {
# Create Feed, for the first fetch a timestamp today -1 year is used.
FEEDID=$(http --ignore-stdin -b -a ${user}:${APP_PASSWORD} POST ${BASE_URLv1}/feeds url=$TEST_FEED | grep -Po '"id":\K([0-9]+)')
sleep 2
# Get Items
ID_LIST1=($(http --ignore-stdin -b -a ${user}:${APP_PASSWORD} GET ${BASE_URLv1}/items | grep -Po '"id":\K([0-9]+)' | tr '\n' ' '))
# Generate Feed with older items (-o yes)
php ${BATS_TEST_DIRNAME}/../test_helper/php-feed-generator/feed-generator.php -a 15 -s 9 -f ${BATS_TEST_DIRNAME}/../test_helper/feeds/test.xml -o yes
# Trigger Update
http --ignore-stdin -b -a ${user}:${APP_PASSWORD} GET ${BASE_URLv1}/feeds/update userId=${user} feedId=$FEEDID
sleep 2
# Get Items again
ID_LIST2=($(http --ignore-stdin -b -a ${user}:${APP_PASSWORD} GET ${BASE_URLv1}/items | grep -Po '"id":\K([0-9]+)' | tr '\n' ' '))
output="${ID_LIST2[*]}"
# Check that they are not equal but that they match partially.
assert_not_equal "${ID_LIST1[*]}" "${ID_LIST2[*]}"
assert_output --partial "${ID_LIST1[*]}"
}
@test "[$TESTSUITE] Test purge with small feed" {
# Generate Feed with 210 items.
php ${BATS_TEST_DIRNAME}/../test_helper/php-feed-generator/feed-generator.php -a 50 -s 0 -f ${BATS_TEST_DIRNAME}/../test_helper/feeds/test.xml