Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/edge' into edge
Browse files Browse the repository at this point in the history
  • Loading branch information
math-GH committed May 19, 2024
2 parents 78ade92 + 08d6328 commit 3964710
Show file tree
Hide file tree
Showing 93 changed files with 630 additions and 534 deletions.
112 changes: 106 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,106 @@
# FreshRSS changelog

## 2024-XX-XX FreshRSS 1.23.2-dev
## 2024-05-XX FreshRSS 1.23.2-dev

* Features
* New *shareable user query* mechanism to share list of articles by HTML, RSS, OPML [#6052](https://github.com/FreshRSS/FreshRSS/pull/6052)
* Deprecates RSS sharing with master token
* New JSON scraping mode to consume JSON data [#5662](https://github.com/FreshRSS/FreshRSS/pull/5662), [#6317](https://github.com/FreshRSS/FreshRSS/pull/6317), [#6369](https://github.com/FreshRSS/FreshRSS/pull/6369)
* New support for JSON Feeds [#5662](https://github.com/FreshRSS/FreshRSS/pull/5662)
* New support for HTTP POST [#5662](https://github.com/FreshRSS/FreshRSS/pull/5662)
* New options to automatically add labels to incoming articles [#5954](https://github.com/FreshRSS/FreshRSS/pull/5954)
* New button to download a feed configuration as OPML [#6312](https://github.com/FreshRSS/FreshRSS/pull/6312)
* Web scraping support more encodings such as EUC-JP [#6112](https://github.com/FreshRSS/FreshRSS/pull/6112)
* Web scraping support password-protected queries (refactor some cURL options and use `CURLOPT_USERPWD`) [#6177](https://github.com/FreshRSS/FreshRSS/pull/6177)
* Web scraping HTTP GET allow UTF-8 even when charset is far from top [#6271](https://github.com/FreshRSS/FreshRSS/pull/6271)
* Allow manual refresh of disabled feeds [#6408](https://github.com/FreshRSS/FreshRSS/pull/6408)
* Allow multiple authors on enclosures [#6272](https://github.com/FreshRSS/FreshRSS/pull/6272)
* New system option in `data/config.php` for number of feeds to refresh in parallel from UI [#6124](https://github.com/FreshRSS/FreshRSS/pull/6124)
* CLI
* New CLI for [database backup & restore](https://freshrss.github.io/FreshRSS/en/admins/05_Backup.html#creating-a-database-backup) [#6387](https://github.com/FreshRSS/FreshRSS/pull/6387)
* Can also be used to [migrate from one database to another](https://freshrss.github.io/FreshRSS/en/admins/05_Backup.html#migrate-database), or to upgrade SQLite schema
* `./cli/db-backup.php ; ./cli/db-restore.php`
* Improve CLI parameters [#6028](https://github.com/FreshRSS/FreshRSS/pull/6028), [#6036](https://github.com/FreshRSS/FreshRSS/pull/6036),
[#6099](https://github.com/FreshRSS/FreshRSS/pull/6099), [#6214](https://github.com/FreshRSS/FreshRSS/pull/6214)
* Fix i18n `cli/manipulate.translation.php` ignore behaviour [#6041](https://github.com/FreshRSS/FreshRSS/pull/6041)
* API
* New compatible app [Read You](https://github.com/Ashinch/ReadYou) [#4633](https://github.com/FreshRSS/FreshRSS/pull/4633), [#6050](https://github.com/FreshRSS/FreshRSS/pull/6050)
* Reduce API memory consumption [#6137](https://github.com/FreshRSS/FreshRSS/pull/6137)
* Allow negative feed IDs for future special cases [#6010](https://github.com/FreshRSS/FreshRSS/pull/6010)
* Only return `OK` for requests without query parameters [#6238](https://github.com/FreshRSS/FreshRSS/pull/6238)
* Bug fixing
* Better account for some edge cases for cron and automatic labels during feed refresh [#6117](https://github.com/FreshRSS/FreshRSS/pull/6117)
* Better support for thumbnails in RSS feeds [#5972](https://github.com/FreshRSS/FreshRSS/pull/5972)
* Auto-update PostgreSQL or MariaDB / MySQL databases for column details changes since FreshRSS 1.21.0 [#6279](https://github.com/FreshRSS/FreshRSS/pull/6279)
* For SQLite, DB update require running `./cli/db-backup.php ; ./cli/db-restore.php --force-overwrite`
* Fix SQLite import of exports produced before FreshRSS 1.20.0 [#6450](https://github.com/FreshRSS/FreshRSS/pull/6450)
* Fix SQLite release handle to fix deleting users on Microsoft Windows [#6285](https://github.com/FreshRSS/FreshRSS/pull/6285)
* Fix to allow admins to create user even when there are Terms Of Service [#6269](https://github.com/FreshRSS/FreshRSS/pull/6269)
* Fix updating the *uncategorized* category deletes the title [#6073](https://github.com/FreshRSS/FreshRSS/pull/6073)
* Fix disable master authentication token [#6185](https://github.com/FreshRSS/FreshRSS/pull/6185)
* Fix CSS selector preview [#6423](https://github.com/FreshRSS/FreshRSS/pull/6423)
* Fix CSS selector encoding [#6426](https://github.com/FreshRSS/FreshRSS/pull/6426)
* Fix export of CSS selector in OPML of individual feeds [#6435](https://github.com/FreshRSS/FreshRSS/pull/6435)
* Fix OPML import of `CURLOPT_PROXYTYPE` [#6439](https://github.com/FreshRSS/FreshRSS/pull/6439)
* Fix favicon with protocol-relative URLs have duplicate slashes [#6068](https://github.com/FreshRSS/FreshRSS/pull/6068)
* Fix feed TTL+muted logic [#6115](https://github.com/FreshRSS/FreshRSS/pull/6115)
* Fix apply *mark as read* to updated articles too [#6334](https://github.com/FreshRSS/FreshRSS/pull/6334)
* Fix ZIP export on systems with custom temp folder [#6392](https://github.com/FreshRSS/FreshRSS/pull/6392)
* Fix number of posts per page during paging [#6268](https://github.com/FreshRSS/FreshRSS/pull/6268)
* Fix clipboard sharing UI [#6301](https://github.com/FreshRSS/FreshRSS/pull/6301)
* Fix shortcut for clipboard sharing [#6277](https://github.com/FreshRSS/FreshRSS/pull/6277)
* Fix user-query filter display [#6421](https://github.com/FreshRSS/FreshRSS/pull/6421)
* SimplePie
* Fix absolutize URL for several cases [#6270](https://github.com/FreshRSS/FreshRSS/pull/6270), [simplepie/#861](https://github.com/simplepie/simplepie/pull/861)
* Security
* Replace `iframe` `allow` attribute [#6274](https://github.com/FreshRSS/FreshRSS/pull/6274)
* Deployment
* Disable unused PHP modules in our Debian-based Docker image [#5994](https://github.com/FreshRSS/FreshRSS/pull/5994)
* UI
* No warning for muted feeds [#6114](https://github.com/FreshRSS/FreshRSS/pull/6114)
* Various UI and style improvements [#6055](https://github.com/FreshRSS/FreshRSS/pull/6055), [#6074](https://github.com/FreshRSS/FreshRSS/pull/6074),
[#6241](https://github.com/FreshRSS/FreshRSS/pull/6241), [#6242](https://github.com/FreshRSS/FreshRSS/pull/6242), [#6289](https://github.com/FreshRSS/FreshRSS/pull/6289),
[#6299](https://github.com/FreshRSS/FreshRSS/pull/6299), [#6314](https://github.com/FreshRSS/FreshRSS/pull/6314), [#6357](https://github.com/FreshRSS/FreshRSS/pull/6357),
[#6373](https://github.com/FreshRSS/FreshRSS/pull/6373), [#6376](https://github.com/FreshRSS/FreshRSS/pull/6376), [#6385](https://github.com/FreshRSS/FreshRSS/pull/6385),
[#6390](https://github.com/FreshRSS/FreshRSS/pull/6390), [#6444](https://github.com/FreshRSS/FreshRSS/pull/6444), [#6445](https://github.com/FreshRSS/FreshRSS/pull/6445)
* Improve theme *Origine compact* [#6197](https://github.com/FreshRSS/FreshRSS/pull/6197)
* i18n
* Improve Brazilian Portuguese [#6067](https://github.com/FreshRSS/FreshRSS/pull/6067)
* Improve Czech [#6344](https://github.com/FreshRSS/FreshRSS/pull/6344)
* Improve Dutch [#6343](https://github.com/FreshRSS/FreshRSS/pull/6343)
* Improve German [#6313](https://github.com/FreshRSS/FreshRSS/pull/6313)
* Improve Hungarian [#6005](https://github.com/FreshRSS/FreshRSS/pull/6005), [#6377](https://github.com/FreshRSS/FreshRSS/pull/6377)
* Improve Italian [#6018](https://github.com/FreshRSS/FreshRSS/pull/6018), [#6060](https://github.com/FreshRSS/FreshRSS/pull/6060), [#6329](https://github.com/FreshRSS/FreshRSS/pull/6329)
* Improve Japanese [#6108](https://github.com/FreshRSS/FreshRSS/pull/6108), [#6294](https://github.com/FreshRSS/FreshRSS/pull/6294)
* Improve Korean [#6342](https://github.com/FreshRSS/FreshRSS/pull/6342)
* Improve Polish [#6358](https://github.com/FreshRSS/FreshRSS/pull/6358)
* Improve Portuguese [#6345](https://github.com/FreshRSS/FreshRSS/pull/6345)
* Improve Simplified Chinese [#6336](https://github.com/FreshRSS/FreshRSS/pull/6336)
* Improve Slovakian [#6356](https://github.com/FreshRSS/FreshRSS/issues/6356)
* Improve Traditional Chinese [#6350](https://github.com/FreshRSS/FreshRSS/pull/6350)
* Improve Turkish [#6328](https://github.com/FreshRSS/FreshRSS/pull/6328)
* Misc. [#6460](https://github.com/FreshRSS/FreshRSS/pull/6460)
* Extensions
* Sanitize parsing list of extensions names and version number [#6016](https://github.com/FreshRSS/FreshRSS/pull/6016),
[#6155](https://github.com/FreshRSS/FreshRSS/pull/6155), [Extensions#214](https://github.com/FreshRSS/Extensions/pull/214), [#6186](https://github.com/FreshRSS/FreshRSS/pull/6186)
* Apply filter actions such as *mark as read* after the *entry_before_insert* hook for extensions [#6091](https://github.com/FreshRSS/FreshRSS/pull/6091)
* New developer command to test all third-party extensions [Extensions#228](https://github.com/FreshRSS/Extensions/pull/228), [#6273](https://github.com/FreshRSS/FreshRSS/pull/6273)
* `composer run-script phpstan-third-party`
* New function `Minz_Extension::amendCsp()` for extensions to modify HTTP headers for Content Security Policy [#6246](https://github.com/FreshRSS/FreshRSS/pull/6246)
* New property `FreshRSS_Entry::isUpdated()` for extensions to know whether an entry is new or updated [#6334](https://github.com/FreshRSS/FreshRSS/pull/6334)
* Compatibility
* Restore PHP 7.4 compatibility for automated tests [#6038](https://github.com/FreshRSS/FreshRSS/pull/6038), [#6039](https://github.com/FreshRSS/FreshRSS/pull/6039)
* Fix PHP 8.2+ compatibility for e-mails [#6130](https://github.com/FreshRSS/FreshRSS/pull/6130)
* Use PHP 8.3+ `#[\Override]` [#6273](https://github.com/FreshRSS/FreshRSS/pull/6273)
* Misc.
* Improve PHPStan [#6037](https://github.com/FreshRSS/FreshRSS/pull/6037), [#6459](https://github.com/FreshRSS/FreshRSS/pull/6459)
* Update *PHPMailer* [#6022](https://github.com/FreshRSS/FreshRSS/pull/6022)
* Remove noisy `name` parameters in user-query URL [#6371](https://github.com/FreshRSS/FreshRSS/pull/6371)
* Code improvements [#6046](https://github.com/FreshRSS/FreshRSS/pull/6046), [#6075](https://github.com/FreshRSS/FreshRSS/pull/6075),
[#6132](https://github.com/FreshRSS/FreshRSS/pull/6132)
* Add Dependabot for GitHub Actions [#6164](https://github.com/FreshRSS/FreshRSS/pull/6164)
* Allow <kbd>Ctrl</kbd>+<kbd>C</kbd> for `make start` [#6239](https://github.com/FreshRSS/FreshRSS/pull/6239)
* Update dev dependencies [#6023](https://github.com/FreshRSS/FreshRSS/pull/6023), [#6265](https://github.com/FreshRSS/FreshRSS/pull/6265)


## 2023-12-30 FreshRSS 1.23.1
Expand All @@ -15,7 +115,7 @@
* Deployment
* Exclude more folders with `.dockerignore` [#5996](https://github.com/FreshRSS/FreshRSS/pull/5996)
* i18n
* Improve simplified Chinese [#5977](https://github.com/FreshRSS/FreshRSS/pull/5977)
* Improve Simplified Chinese [#5977](https://github.com/FreshRSS/FreshRSS/pull/5977)
* Improve Hungarian [#6000](https://github.com/FreshRSS/FreshRSS/pull/6000)


Expand Down Expand Up @@ -324,10 +424,10 @@
* i18n
* Improve Chinese [#4853](https://github.com/FreshRSS/FreshRSS/pull/4853), [#4856](https://github.com/FreshRSS/FreshRSS/pull/4856)
* SimplePie
* No URL Decode for enclosure links [#768](https://github.com/simplepie/simplepie/pull/768)
* Fix case of multiple RSS2.0 enclosures [#769](https://github.com/simplepie/simplepie/pull/769)
* Sanitize thumbnail URL [#770](https://github.com/simplepie/simplepie/pull/770)
* Use single constant for default HTTP Accept header [#784](https://github.com/simplepie/simplepie/pull/784)
* No URL Decode for enclosure links [simplepie#768](https://github.com/simplepie/simplepie/pull/768)
* Fix case of multiple RSS2.0 enclosures [simplepie#769](https://github.com/simplepie/simplepie/pull/769)
* Sanitize thumbnail URL [simplepie#770](https://github.com/simplepie/simplepie/pull/770)
* Use single constant for default HTTP Accept header [simplepie#784](https://github.com/simplepie/simplepie/pull/784)
* Misc.
* Increase max feed URL length and drop unicity in database [#5038](https://github.com/FreshRSS/FreshRSS/pull/5038)
* New support of [Development Containers](https://containers.dev) / [GitHub Codespaces](https://github.com/features/codespaces) to ease development [#4859](https://github.com/FreshRSS/FreshRSS/pull/4859)
Expand Down
1 change: 1 addition & 0 deletions CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ People are sorted by name so please keep this order.
* [Julien-Pierre Avérous](https://github.com/javerous): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:javerous), [Web](https://www.sourcemac.com/)
* [Justin Tracey](https://github.com/jtracey): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:jtracey), [Web](https://unsuspicious.click)
* [Kaibin Yang](https://github.com/SkyYkb): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:SkyYkb), [Web](https://kaibinyang.com/)
* [Karim Sharafutdinov](https://github.com/krm-shrftdnv): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:krm-shrftdnv)
* [Kasimir Cash](https://github.com/KasimirCash): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:KasimirCash)
* [Kevin Papst](https://github.com/kevinpapst): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:kevinpapst), [Web](http://www.kevinpapst.de/)
* [Kiblyn11](https://github.com/Kiblyn11): [contributions](https://github.com/FreshRSS/FreshRSS/pulls?q=is:pr+author:Kiblyn11)
Expand Down
8 changes: 4 additions & 4 deletions app/Controllers/updateController.php
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ public function applyAction(): void {
$res = !self::hasGitUpdate();
} else {
require(UPDATE_FILENAME);
// @phpstan-ignore-next-line
// @phpstan-ignore function.notFound
$res = do_post_update();
}

Expand All @@ -290,12 +290,12 @@ public function applyAction(): void {
} else {
require(UPDATE_FILENAME);
if (Minz_Request::isPost()) {
// @phpstan-ignore-next-line
// @phpstan-ignore function.notFound
save_info_update();
}
// @phpstan-ignore-next-line
// @phpstan-ignore function.notFound
if (!need_info_update()) {
// @phpstan-ignore-next-line
// @phpstan-ignore function.notFound
$res = apply_update();
} else {
return;
Expand Down
26 changes: 24 additions & 2 deletions app/Models/DatabaseDAO.php
Original file line number Diff line number Diff line change
Expand Up @@ -232,8 +232,29 @@ public function minorDbMaintenance(): void {
$catDAO->resetDefaultCategoryName();

include_once(APP_PATH . '/SQL/install.sql.' . $this->pdo->dbType() . '.php');
if (!empty($GLOBALS['SQL_UPDATE_MINOR']) && $this->pdo->exec($GLOBALS['SQL_UPDATE_MINOR']) === false) {
Minz_Log::error('SQL error ' . __METHOD__ . json_encode($this->pdo->errorInfo()));
if (!empty($GLOBALS['SQL_UPDATE_MINOR'])) {
$sql = $GLOBALS['SQL_UPDATE_MINOR'];
$isMariaDB = false;

if ($this->pdo->dbType() === 'mysql') {
$dbVersion = $this->fetchValue('SELECT version()') ?? '';
$isMariaDB = stripos($dbVersion, 'MariaDB') !== false; // MariaDB includes its name in version, but not MySQL
if (!$isMariaDB) {
// MySQL does not support `DROP INDEX IF EXISTS` yet https://dev.mysql.com/doc/refman/8.3/en/drop-index.html
// but MariaDB does https://mariadb.com/kb/en/drop-index/
$sql = str_replace('DROP INDEX IF EXISTS', 'DROP INDEX', $sql);
}
}

if ($this->pdo->exec($sql) === false) {
$info = $this->pdo->errorInfo();
if ($this->pdo->dbType() === 'mysql' &&
!$isMariaDB && !empty($info[2]) && (stripos($info[2], "Can't DROP ") !== false)) {
// Too bad for MySQL, but ignore error
return;
}
Minz_Log::error('SQL error ' . __METHOD__ . json_encode($this->pdo->errorInfo()));
}
}
}

Expand Down Expand Up @@ -299,6 +320,7 @@ public function dbCopy(string $filename, int $mode, bool $clearFirst = false): b

try {
$sqlite = new Minz_PdoSqlite('sqlite:' . $filename);
$sqlite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
} catch (Exception $e) {
$error = 'Error while initialising SQLite copy: ' . $e->getMessage();
return self::stdError($error);
Expand Down
2 changes: 1 addition & 1 deletion app/Models/Feed.php
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,8 @@ public function _nbEntries(int $value): void {
public function load(bool $loadDetails = false, bool $noCache = false): ?SimplePie {
if ($this->url != '') {
/**
* @phpstan-ignore-next-line
* @throws Minz_FileNotExistException
* @phpstan-ignore if.alwaysFalse
*/
if (CACHE_PATH == '') {
throw new Minz_FileNotExistException(
Expand Down
20 changes: 13 additions & 7 deletions app/Models/FeedDAO.php
Original file line number Diff line number Diff line change
Expand Up @@ -304,13 +304,19 @@ public function selectAll(): Traversable {
FROM `_feed`
SQL;
$stm = $this->pdo->query($sql);
if ($stm === false) {
return;
}
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
/** @var array{'id':int,'url':string,'kind':int,'category':int,'name':string,'website':string,'description':string,'lastUpdate':int,'priority'?:int,
* 'pathEntries'?:string,'httpAuth':string,'error':int|bool,'ttl'?:int,'attributes'?:string} $row */
yield $row;
if ($stm !== false) {
while ($row = $stm->fetch(PDO::FETCH_ASSOC)) {
/** @var array{'id':int,'url':string,'kind':int,'category':int,'name':string,'website':string,'description':string,'lastUpdate':int,'priority'?:int,
* 'pathEntries'?:string,'httpAuth':string,'error':int|bool,'ttl'?:int,'attributes'?:string} $row */
yield $row;
}
} else {
$info = $this->pdo->errorInfo();
if ($this->autoUpdateDb($info)) {
yield from $this->selectAll();
} else {
Minz_Log::error(__method__ . ' error: ' . json_encode($info));
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions app/Models/TagDAO.php
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ public function getTagsForEntries(array $entries) {
}
$sql .= ' AND et.id_entry IN (' . str_repeat('?,', count($entries) - 1). '?)';
if (is_array($entries[0])) {
/** @var array<array<string,string>> $entries */
foreach ($entries as $entry) {
if (!empty($entry['id'])) {
$values[] = $entry['id'];
Expand All @@ -394,6 +395,7 @@ public function getTagsForEntries(array $entries) {
$values[] = $entry->id();
}
} else {
/** @var array<numeric-string> $entries */
foreach ($entries as $entry) {
$values[] = $entry;
}
Expand Down
4 changes: 4 additions & 0 deletions app/SQL/install.sql.mysql.php
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@

$GLOBALS['SQL_UPDATE_MINOR'] = <<<'SQL'
ALTER TABLE `_feed`
MODIFY COLUMN `website` TEXT CHARACTER SET latin1 COLLATE latin1_bin,
MODIFY COLUMN `lastUpdate` BIGINT DEFAULT 0,
MODIFY COLUMN `pathEntries` VARCHAR(4096),
MODIFY COLUMN `httpAuth` VARCHAR(1024) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
Expand All @@ -136,4 +137,7 @@
MODIFY COLUMN `tags` VARCHAR(2048);
ALTER TABLE `_tag`
MODIFY COLUMN `name` VARCHAR(191) NOT NULL;
ALTER TABLE `_feed`
DROP INDEX IF EXISTS `url`, -- IF EXISTS works with MariaDB but not with MySQL, so needs PHP workaround
MODIFY COLUMN `url` VARCHAR(32768) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
SQL;
3 changes: 3 additions & 0 deletions app/SQL/install.sql.pgsql.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,10 @@
ALTER TABLE `_category`
ALTER COLUMN "name" SET DATA TYPE VARCHAR(191);
ALTER TABLE `_feed`
DROP CONSTRAINT IF EXISTS `_feed_url_key`,
ALTER COLUMN "url" SET DATA TYPE VARCHAR(32768),
ALTER COLUMN "name" SET DATA TYPE VARCHAR(191),
ALTER COLUMN "website" SET DATA TYPE VARCHAR(32768),
ALTER COLUMN "lastUpdate" SET DATA TYPE BIGINT,
ALTER COLUMN "pathEntries" SET DATA TYPE VARCHAR(4096),
ALTER COLUMN "httpAuth" SET DATA TYPE VARCHAR(1024);
Expand Down
2 changes: 1 addition & 1 deletion app/i18n/cz/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@
'latest' => 'Stabilní vydání (“latest”)',
),
'title' => 'Aktualizovat systém',
'viaGit' => 'Aktualizace přes git a Github.com začala',
'viaGit' => 'Aktualizace přes git a GitHub.com začala',
),
'user' => array(
'admin' => 'Administrátor',
Expand Down
2 changes: 1 addition & 1 deletion app/i18n/cz/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
'credits_content' => 'Některé designové prvky pocházejí z <a href="http://twitter.github.io/bootstrap/">Bootstrap</a>, FreshRSS ale tuto platformu nevyužívá. <a href="https://gitlab.gnome.org/Archive/gnome-icon-theme-symbolic">Ikony</a> pocházejí z <a href="https://www.gnome.org/">projektu GNOME</a>. Písmo <em>Open Sans</em> vytvořil <a href="https://fonts.google.com/specimen/Open+Sans">Steve Matteson</a>. FreshRSS je založeno na PHP framework <a href="https://framagit.org/marienfressinaud/MINZ">Minz</a>.',
'documentation' => 'Dokumentace',
'freshrss_description' => 'FreshRSS je čtečka kanálů RSS určená k provozu na vlastním serveru. Je to nenáročný a jednoduchý, zároveň ale mocný a konfigurovatelný nástroj.',
'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">na Github</a>',
'github' => '<a href="https://github.com/FreshRSS/FreshRSS/issues">na GitHub</a>',
'license' => 'Licence',
'project_website' => 'Webová stránka projektu',
'title' => 'O aplikaci',
Expand Down
Loading

0 comments on commit 3964710

Please sign in to comment.