aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Controllers/importExportController.php38
-rw-r--r--app/Models/View.php3
-rw-r--r--app/i18n/cs/gen.php1
-rw-r--r--app/i18n/cs/sub.php5
-rw-r--r--app/i18n/de/gen.php1
-rw-r--r--app/i18n/de/sub.php5
-rw-r--r--app/i18n/el/gen.php1
-rw-r--r--app/i18n/el/sub.php5
-rw-r--r--app/i18n/en-us/gen.php1
-rw-r--r--app/i18n/en-us/sub.php5
-rw-r--r--app/i18n/en/gen.php9
-rw-r--r--app/i18n/en/sub.php5
-rw-r--r--app/i18n/es/gen.php1
-rw-r--r--app/i18n/es/sub.php5
-rw-r--r--app/i18n/fa/gen.php1
-rw-r--r--app/i18n/fa/sub.php5
-rw-r--r--app/i18n/fr/gen.php1
-rw-r--r--app/i18n/fr/sub.php5
-rw-r--r--app/i18n/he/gen.php1
-rw-r--r--app/i18n/he/sub.php5
-rw-r--r--app/i18n/hu/gen.php1
-rw-r--r--app/i18n/hu/sub.php5
-rw-r--r--app/i18n/id/gen.php1
-rw-r--r--app/i18n/id/sub.php5
-rw-r--r--app/i18n/it/gen.php1
-rw-r--r--app/i18n/it/sub.php5
-rw-r--r--app/i18n/ja/gen.php1
-rw-r--r--app/i18n/ja/sub.php5
-rw-r--r--app/i18n/ko/gen.php1
-rw-r--r--app/i18n/ko/sub.php5
-rw-r--r--app/i18n/lv/gen.php1
-rw-r--r--app/i18n/lv/sub.php5
-rw-r--r--app/i18n/nl/gen.php1
-rw-r--r--app/i18n/nl/sub.php5
-rw-r--r--app/i18n/oc/gen.php1
-rw-r--r--app/i18n/oc/sub.php5
-rw-r--r--app/i18n/pl/gen.php1
-rw-r--r--app/i18n/pl/sub.php5
-rw-r--r--app/i18n/pt-br/gen.php1
-rw-r--r--app/i18n/pt-br/sub.php5
-rw-r--r--app/i18n/ru/gen.php1
-rw-r--r--app/i18n/ru/sub.php5
-rw-r--r--app/i18n/sk/gen.php1
-rw-r--r--app/i18n/sk/sub.php5
-rw-r--r--app/i18n/tr/gen.php1
-rw-r--r--app/i18n/tr/sub.php5
-rw-r--r--app/i18n/zh-cn/gen.php1
-rw-r--r--app/i18n/zh-cn/sub.php5
-rw-r--r--app/i18n/zh-tw/gen.php1
-rw-r--r--app/i18n/zh-tw/sub.php5
-rw-r--r--app/views/importExport/index.phtml31
-rw-r--r--app/views/importExport/sqlite.phtml9
52 files changed, 204 insertions, 29 deletions
diff --git a/app/Controllers/importExportController.php b/app/Controllers/importExportController.php
index 50c2037fe..53617ced7 100644
--- a/app/Controllers/importExportController.php
+++ b/app/Controllers/importExportController.php
@@ -31,6 +31,7 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController {
public function indexAction(): void {
$this->view->feeds = $this->feedDAO->listFeeds();
FreshRSS_View::prependTitle(_t('sub.import_export.title') . ' · ');
+ $this->listSqliteArchives();
}
private static function megabytes(string $size_str): float|int|string {
@@ -694,4 +695,41 @@ class FreshRSS_importExport_Controller extends FreshRSS_ActionController {
return 'application/octet-stream';
}
}
+
+ private const REGEX_SQLITE_FILENAME = '/^(?![.-])[0-9a-zA-Z_.@ #&()~\-]{1,128}\.sqlite$/';
+
+ private function listSqliteArchives(): void {
+ $this->view->sqliteArchives = [];
+ $files = glob(USERS_PATH . '/' . Minz_User::name() . '/*.sqlite', GLOB_NOSORT) ?: [];
+ foreach ($files as $file) {
+ $archive = [
+ 'name' => basename($file),
+ 'size' => @filesize($file),
+ 'mtime' => @filemtime($file),
+ ];
+ if ($archive['size'] != false && $archive['mtime'] != false && preg_match(self::REGEX_SQLITE_FILENAME, $archive['name'])) {
+ $this->view->sqliteArchives[] = $archive;
+ }
+ }
+ // Sort by time, newest first:
+ usort($this->view->sqliteArchives, static fn(array $a, array $b): int => $b['mtime'] <=> $a['mtime']);
+ }
+
+ public function sqliteAction(): void {
+ if (!Minz_Request::isPost()) {
+ Minz_Request::forward(['c' => 'importExport', 'a' => 'index'], true);
+ }
+ $sqlite = Minz_Request::paramString('sqlite');
+ if (!preg_match(self::REGEX_SQLITE_FILENAME, $sqlite)) {
+ Minz_Error::error(404);
+ return;
+ }
+ $path = USERS_PATH . '/' . Minz_User::name() . '/' . $sqlite;
+ if (!file_exists($path) || @filesize($path) == false || @filemtime($path) == false) {
+ Minz_Error::error(404);
+ return;
+ }
+ $this->view->sqlitePath = $path;
+ $this->view->_layout(null);
+ }
}
diff --git a/app/Models/View.php b/app/Models/View.php
index 244379505..3c3b3a2e0 100644
--- a/app/Models/View.php
+++ b/app/Models/View.php
@@ -82,6 +82,9 @@ class FreshRSS_View extends Minz_View {
public string $list_title;
public int $queryId;
public string $type;
+ /** @var null|array<array{name:string,size:int,mtime:int}> */
+ public ?array $sqliteArchives = null;
+ public string $sqlitePath;
// Form login
public int $cookie_days;
diff --git a/app/i18n/cs/gen.php b/app/i18n/cs/gen.php
index aab07bd1b..0276ce6c9 100644
--- a/app/i18n/cs/gen.php
+++ b/app/i18n/cs/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Odstranění ztlumených zdrojů',
'demote' => 'Snížit úroveň',
'disable' => 'Zakázat',
+ 'download' => 'Download', // TODO
'empty' => 'Vyprázdnit',
'enable' => 'Povolit',
'export' => 'Exportovat',
diff --git a/app/i18n/cs/sub.php b/app/i18n/cs/sub.php
index 6546a38af..3dd9af87a 100644
--- a/app/i18n/cs/sub.php
+++ b/app/i18n/cs/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Okamžité oznámení s WebSub',
),
'import_export' => array(
- 'export' => 'Exportovat',
+ 'export' => array(
+ '_' => 'Exportovat',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Exportovat články s vašimi popisky',
'export_opml' => 'Exportovat seznam kanálů (OPML)',
'export_starred' => 'Exportovat vaše oblíbené',
diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php
index 548c60a20..e20d9dda3 100644
--- a/app/i18n/de/gen.php
+++ b/app/i18n/de/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Lösche stumm gestellte Feeds',
'demote' => 'Zurückstufen',
'disable' => 'Deaktivieren',
+ 'download' => 'Download', // TODO
'empty' => 'Leeren',
'enable' => 'Aktivieren',
'export' => 'Exportieren',
diff --git a/app/i18n/de/sub.php b/app/i18n/de/sub.php
index 30f77b398..507113210 100644
--- a/app/i18n/de/sub.php
+++ b/app/i18n/de/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Sofortbenachrichtigung mit WebSub',
),
'import_export' => array(
- 'export' => 'Exportieren',
+ 'export' => array(
+ '_' => 'Exportieren',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Artikel mit Labeln exportieren',
'export_opml' => 'Liste der Feeds exportieren (OPML)',
'export_starred' => 'Ihre Favoriten exportieren',
diff --git a/app/i18n/el/gen.php b/app/i18n/el/gen.php
index 973856c12..41005b41b 100644
--- a/app/i18n/el/gen.php
+++ b/app/i18n/el/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Delete muted feeds', // TODO
'demote' => 'Demote', // TODO
'disable' => 'Disable', // TODO
+ 'download' => 'Download', // TODO
'empty' => 'Empty', // TODO
'enable' => 'Enable', // TODO
'export' => 'Export', // TODO
diff --git a/app/i18n/el/sub.php b/app/i18n/el/sub.php
index 02821ea6d..89da23a88 100644
--- a/app/i18n/el/sub.php
+++ b/app/i18n/el/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Instant notifications with WebSub', // TODO
),
'import_export' => array(
- 'export' => 'Export', // TODO
+ 'export' => array(
+ '_' => 'Export', // TODO
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Export your labelled articles', // TODO
'export_opml' => 'Export list of feeds (OPML)', // TODO
'export_starred' => 'Export your favourites', // TODO
diff --git a/app/i18n/en-us/gen.php b/app/i18n/en-us/gen.php
index 3b8e0cfd9..0f733f7eb 100644
--- a/app/i18n/en-us/gen.php
+++ b/app/i18n/en-us/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Delete muted feeds', // IGNORE
'demote' => 'Demote', // IGNORE
'disable' => 'Disable', // IGNORE
+ 'download' => 'Download', // IGNORE
'empty' => 'Empty', // IGNORE
'enable' => 'Enable', // IGNORE
'export' => 'Export', // IGNORE
diff --git a/app/i18n/en-us/sub.php b/app/i18n/en-us/sub.php
index ef7931681..4a579a6cc 100644
--- a/app/i18n/en-us/sub.php
+++ b/app/i18n/en-us/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Instant notifications with WebSub', // IGNORE
),
'import_export' => array(
- 'export' => 'Export', // IGNORE
+ 'export' => array(
+ '_' => 'Export', // IGNORE
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Export your labeled articles',
'export_opml' => 'Export list of feeds (OPML)', // IGNORE
'export_starred' => 'Export your favorites',
diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php
index e8d276349..bcf4baff6 100644
--- a/app/i18n/en/gen.php
+++ b/app/i18n/en/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Delete muted feeds',
'demote' => 'Demote',
'disable' => 'Disable',
+ 'download' => 'Download',
'empty' => 'Empty',
'enable' => 'Enable',
'export' => 'Export',
@@ -33,9 +34,9 @@ return array(
'open' => 'Open menu',
),
'nav_buttons' => array(
- 'next' => 'Next article', // TODO
- 'prev' => 'Previous article', // TODO
- 'up' => 'Go up', // TODO
+ 'next' => 'Next article',
+ 'prev' => 'Previous article',
+ 'up' => 'Go up',
),
'open_url' => 'Open URL',
'promote' => 'Promote',
@@ -183,7 +184,7 @@ return array(
'display' => 'Display',
'extensions' => 'Extensions',
'logs' => 'Logs',
- 'privacy' => 'Privacy', // TODO
+ 'privacy' => 'Privacy',
'queries' => 'User queries',
'reading' => 'Reading',
'search' => 'Search words or #tags',
diff --git a/app/i18n/en/sub.php b/app/i18n/en/sub.php
index 0a6385428..3b41318e5 100644
--- a/app/i18n/en/sub.php
+++ b/app/i18n/en/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Instant notifications with WebSub',
),
'import_export' => array(
- 'export' => 'Export',
+ 'export' => array(
+ '_' => 'Export',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Export your labelled articles',
'export_opml' => 'Export list of feeds (OPML)',
'export_starred' => 'Export your favourites',
diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php
index e05a23235..89aff901c 100644
--- a/app/i18n/es/gen.php
+++ b/app/i18n/es/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Eliminar fuentes silenciadas',
'demote' => 'Degradar',
'disable' => 'Desactivar',
+ 'download' => 'Download', // TODO
'empty' => 'Vaciar',
'enable' => 'Activar',
'export' => 'Exportar',
diff --git a/app/i18n/es/sub.php b/app/i18n/es/sub.php
index 8012fdc16..01780788f 100644
--- a/app/i18n/es/sub.php
+++ b/app/i18n/es/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Notificación inmediata con WebSub',
),
'import_export' => array(
- 'export' => 'Exportar',
+ 'export' => array(
+ '_' => 'Exportar',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Exporta tus artículos etiquetados',
'export_opml' => 'Exportar la lista de fuentes (OPML)',
'export_starred' => 'Exportar tus favoritos',
diff --git a/app/i18n/fa/gen.php b/app/i18n/fa/gen.php
index 460934d87..64d3b0316 100644
--- a/app/i18n/fa/gen.php
+++ b/app/i18n/fa/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => ' فیدهای خاموش را حذف کنید',
'demote' => ' تنزل دادن',
'disable' => ' غیر فعال کردن',
+ 'download' => 'Download', // TODO
'empty' => ' خالی',
'enable' => ' فعال کنید',
'export' => ' صادرات',
diff --git a/app/i18n/fa/sub.php b/app/i18n/fa/sub.php
index 93ff0f205..abd885a04 100644
--- a/app/i18n/fa/sub.php
+++ b/app/i18n/fa/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => ' اطلاع رسانی فوری با WebSub',
),
'import_export' => array(
- 'export' => ' صادرات',
+ 'export' => array(
+ '_' => ' صادرات',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => ' مقالات برچسب دار خود را صادر کنید',
'export_opml' => ' لیست صادرات فیدها (OPML)',
'export_starred' => ' موارد دلخواه خود را صادر کنید',
diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php
index f62c73a5e..3f226f474 100644
--- a/app/i18n/fr/gen.php
+++ b/app/i18n/fr/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Supprimer les flux désactivés',
'demote' => 'Rétrograder',
'disable' => 'Désactiver',
+ 'download' => 'Télécharger',
'empty' => 'Vider',
'enable' => 'Activer',
'export' => 'Exporter',
diff --git a/app/i18n/fr/sub.php b/app/i18n/fr/sub.php
index 24678f377..5ddaea0c2 100644
--- a/app/i18n/fr/sub.php
+++ b/app/i18n/fr/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Notifications instantanée par WebSub',
),
'import_export' => array(
- 'export' => 'Exporter',
+ 'export' => array(
+ '_' => 'Exporter',
+ 'sqlite' => 'Télécharger la base de donnée de l’utilisateur au format SQLite',
+ ),
'export_labelled' => 'Exporter les articles étiquetés',
'export_opml' => 'Exporter la liste des flux (OPML)',
'export_starred' => 'Exporter les favoris',
diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php
index 853e614f0..f2a8ce1af 100644
--- a/app/i18n/he/gen.php
+++ b/app/i18n/he/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Delete muted feeds', // TODO
'demote' => 'Demote', // TODO
'disable' => 'Disable', // TODO
+ 'download' => 'Download', // TODO
'empty' => 'Empty', // TODO
'enable' => 'Enable', // TODO
'export' => 'ייצוא',
diff --git a/app/i18n/he/sub.php b/app/i18n/he/sub.php
index eb4df468c..44dc74dbe 100644
--- a/app/i18n/he/sub.php
+++ b/app/i18n/he/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Instant notifications with WebSub', // TODO
),
'import_export' => array(
- 'export' => 'ייצוא',
+ 'export' => array(
+ '_' => 'ייצוא',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Export your labelled articles', // TODO
'export_opml' => 'ייצוא רשימת הזנות (OPML)',
'export_starred' => 'ייצוא מועדפים',
diff --git a/app/i18n/hu/gen.php b/app/i18n/hu/gen.php
index 95e56c480..a9c2ea4b7 100644
--- a/app/i18n/hu/gen.php
+++ b/app/i18n/hu/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Némított hírforrások törlése',
'demote' => 'Lefokoz',
'disable' => 'Kikapcsol',
+ 'download' => 'Download', // TODO
'empty' => 'Üres',
'enable' => 'Bekapcsol',
'export' => 'Export', // IGNORE
diff --git a/app/i18n/hu/sub.php b/app/i18n/hu/sub.php
index 397907f0f..76290f5c3 100644
--- a/app/i18n/hu/sub.php
+++ b/app/i18n/hu/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Azonnali értesítés WebSub-al',
),
'import_export' => array(
- 'export' => 'Exportálás',
+ 'export' => array(
+ '_' => 'Exportálás',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Címkézett cikkek exportálása',
'export_opml' => 'Hírforrások listájának exportálása (OPML)',
'export_starred' => 'Kedvencek exportálása',
diff --git a/app/i18n/id/gen.php b/app/i18n/id/gen.php
index c012a445f..5ae564c66 100644
--- a/app/i18n/id/gen.php
+++ b/app/i18n/id/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Delete muted feeds', // TODO
'demote' => 'Demote', // TODO
'disable' => 'Disable', // TODO
+ 'download' => 'Download', // TODO
'empty' => 'Empty', // TODO
'enable' => 'Enable', // TODO
'export' => 'Export', // TODO
diff --git a/app/i18n/id/sub.php b/app/i18n/id/sub.php
index f192dacec..de1b171c7 100644
--- a/app/i18n/id/sub.php
+++ b/app/i18n/id/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Instant notifications with WebSub', // TODO
),
'import_export' => array(
- 'export' => 'Export', // TODO
+ 'export' => array(
+ '_' => 'Export', // TODO
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Export your labeled articles',
'export_opml' => 'Export list of feeds (OPML)', // TODO
'export_starred' => 'Export your favorites',
diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php
index fa04ecae0..8c49942c9 100644
--- a/app/i18n/it/gen.php
+++ b/app/i18n/it/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Cancella i feed mutati',
'demote' => 'Retrocedi',
'disable' => 'Disabilita',
+ 'download' => 'Download', // TODO
'empty' => 'Vuoto',
'enable' => 'Abilita',
'export' => 'Esporta',
diff --git a/app/i18n/it/sub.php b/app/i18n/it/sub.php
index 35b8fab60..0803e11bb 100644
--- a/app/i18n/it/sub.php
+++ b/app/i18n/it/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Notifica istantanea con WebSub',
),
'import_export' => array(
- 'export' => 'Esporta',
+ 'export' => array(
+ '_' => 'Esporta',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Esporta gli articoli etichettati',
'export_opml' => 'Esporta tutta la lista dei feed (OPML)',
'export_starred' => 'Esporta i tuoi preferiti',
diff --git a/app/i18n/ja/gen.php b/app/i18n/ja/gen.php
index 9bcce07ba..f69efc69d 100644
--- a/app/i18n/ja/gen.php
+++ b/app/i18n/ja/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'ミュートにしているフィードを削除する',
'demote' => '寄付',
'disable' => '無効',
+ 'download' => 'Download', // TODO
'empty' => '空',
'enable' => '有効',
'export' => 'エクスポート',
diff --git a/app/i18n/ja/sub.php b/app/i18n/ja/sub.php
index a1a02d2a9..c6038a79f 100644
--- a/app/i18n/ja/sub.php
+++ b/app/i18n/ja/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'WebSubとの即時通知',
),
'import_export' => array(
- 'export' => 'エクスポート',
+ 'export' => array(
+ '_' => 'エクスポート',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'ラベル付けされた記事をエクスポートする',
'export_opml' => 'フィードリストをエクスポートする (OPML)',
'export_starred' => 'お気に入りをエクスポートする',
diff --git a/app/i18n/ko/gen.php b/app/i18n/ko/gen.php
index ffd3f8db1..709ee0e93 100644
--- a/app/i18n/ko/gen.php
+++ b/app/i18n/ko/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => '음소거된 피드 삭제',
'demote' => '목록 수준 내리기',
'disable' => '비활성화',
+ 'download' => 'Download', // TODO
'empty' => '비우기',
'enable' => '활성화',
'export' => '내보내기',
diff --git a/app/i18n/ko/sub.php b/app/i18n/ko/sub.php
index 917d71b68..6438143d5 100644
--- a/app/i18n/ko/sub.php
+++ b/app/i18n/ko/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'WebSub을 사용한 즉시 알림',
),
'import_export' => array(
- 'export' => '내보내기',
+ 'export' => array(
+ '_' => '내보내기',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => '라벨이 표시된 글들 내보내기',
'export_opml' => '피드 목록 내보내기 (OPML)',
'export_starred' => '즐겨찾기 내보내기',
diff --git a/app/i18n/lv/gen.php b/app/i18n/lv/gen.php
index c4f78962d..bd4ed1fee 100644
--- a/app/i18n/lv/gen.php
+++ b/app/i18n/lv/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Izdzēst izslēgtās barotnes',
'demote' => 'Pazemināt amatu',
'disable' => 'Izslēgt',
+ 'download' => 'Download', // TODO
'empty' => 'Iztukšot',
'enable' => 'Ieslēgt',
'export' => 'Eksportēt',
diff --git a/app/i18n/lv/sub.php b/app/i18n/lv/sub.php
index ea67d3005..6e0621e12 100644
--- a/app/i18n/lv/sub.php
+++ b/app/i18n/lv/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Tūlītēji paziņojumi ar WebSub',
),
'import_export' => array(
- 'export' => 'Eksportēt',
+ 'export' => array(
+ '_' => 'Eksportēt',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Eksportēt ar birku marķētus rakstus',
'export_opml' => 'Eksportēt barotņu sarakstu (OPML)',
'export_starred' => 'Eksportēt mīļākos',
diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php
index df106c866..b092b79ea 100644
--- a/app/i18n/nl/gen.php
+++ b/app/i18n/nl/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Gedempte feeds verwijderen',
'demote' => 'Degraderen',
'disable' => 'Uitzetten',
+ 'download' => 'Download', // TODO
'empty' => 'Leeg',
'enable' => 'Aanzetten',
'export' => 'Exporteren',
diff --git a/app/i18n/nl/sub.php b/app/i18n/nl/sub.php
index ae0b47391..6d1b55b08 100644
--- a/app/i18n/nl/sub.php
+++ b/app/i18n/nl/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Directe notificaties met WebSub',
),
'import_export' => array(
- 'export' => 'Exporteer',
+ 'export' => array(
+ '_' => 'Exporteer',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Exporteer gelabelde artikels',
'export_opml' => 'Exporteer lijst van feeds (OPML)',
'export_starred' => 'Exporteer je favorieten',
diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php
index 29468c587..f5b6901ab 100644
--- a/app/i18n/oc/gen.php
+++ b/app/i18n/oc/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Suprimir los flux muts',
'demote' => 'Retrogradar',
'disable' => 'Desactivar',
+ 'download' => 'Download', // TODO
'empty' => 'Voidar',
'enable' => 'Activar',
'export' => 'Exportar',
diff --git a/app/i18n/oc/sub.php b/app/i18n/oc/sub.php
index c0f0ae245..421fca5fa 100644
--- a/app/i18n/oc/sub.php
+++ b/app/i18n/oc/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Notificacions instantanèas amb WebSub',
),
'import_export' => array(
- 'export' => 'Exportar',
+ 'export' => array(
+ '_' => 'Exportar',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Exportar los articles etiquetats',
'export_opml' => 'Exportar la lista de fluxes (OPML)',
'export_starred' => 'Exportar los favorits',
diff --git a/app/i18n/pl/gen.php b/app/i18n/pl/gen.php
index bdd0d172f..8762a04ae 100644
--- a/app/i18n/pl/gen.php
+++ b/app/i18n/pl/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Usuń wyciszone kanały',
'demote' => 'Zdegraduj',
'disable' => 'Wyłącz',
+ 'download' => 'Download', // TODO
'empty' => 'Opróżnij',
'enable' => 'Włącz',
'export' => 'Eksportuj',
diff --git a/app/i18n/pl/sub.php b/app/i18n/pl/sub.php
index 30cd09a50..ca20c4d4b 100644
--- a/app/i18n/pl/sub.php
+++ b/app/i18n/pl/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Natychmiastowe powiadomienia protokołu WebSub',
),
'import_export' => array(
- 'export' => 'Eksport',
+ 'export' => array(
+ '_' => 'Eksport',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Eksportuj wiadomości z etykietami',
'export_opml' => 'Eksportuj listę kanałów (format OPML)',
'export_starred' => 'Eksportuj ulubione wiadomości',
diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php
index d2abe1351..74f1d0422 100644
--- a/app/i18n/pt-br/gen.php
+++ b/app/i18n/pt-br/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Excluir feeds silenciados',
'demote' => 'Despromover',
'disable' => 'Desabilitar',
+ 'download' => 'Download', // TODO
'empty' => 'Vazio',
'enable' => 'Habilitar',
'export' => 'Exportar',
diff --git a/app/i18n/pt-br/sub.php b/app/i18n/pt-br/sub.php
index 4d6f074e7..ac68dae6e 100644
--- a/app/i18n/pt-br/sub.php
+++ b/app/i18n/pt-br/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Notificação instantânea com WebSub',
),
'import_export' => array(
- 'export' => 'Exportar',
+ 'export' => array(
+ '_' => 'Exportar',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Exportar seus artigos etiquetados',
'export_opml' => 'Exporta a lista dos feeds (OPML)',
'export_starred' => 'Exportar seus favoritos',
diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php
index f3ab54dbe..0240f4a49 100644
--- a/app/i18n/ru/gen.php
+++ b/app/i18n/ru/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Удалить заглушенные ленты',
'demote' => 'Понизить',
'disable' => 'Отключить',
+ 'download' => 'Download', // TODO
'empty' => 'Опустошить',
'enable' => 'Включить',
'export' => 'Экспортировать',
diff --git a/app/i18n/ru/sub.php b/app/i18n/ru/sub.php
index 569e9202d..ec568a241 100644
--- a/app/i18n/ru/sub.php
+++ b/app/i18n/ru/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Моментальные оповещения посредством WebSub',
),
'import_export' => array(
- 'export' => 'Экспорт',
+ 'export' => array(
+ '_' => 'Экспорт',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Экспортировать ваши помеченные статьи',
'export_opml' => 'Экспортировать список лент (OPML)',
'export_starred' => 'Экспортировать ваше избранное',
diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php
index a6f84ed3f..5e941978d 100644
--- a/app/i18n/sk/gen.php
+++ b/app/i18n/sk/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Vymazať stíšené kanály',
'demote' => 'Degradovať',
'disable' => 'Zakázať',
+ 'download' => 'Download', // TODO
'empty' => 'Vyprázdniť',
'enable' => 'Povoliť',
'export' => 'Exportovať',
diff --git a/app/i18n/sk/sub.php b/app/i18n/sk/sub.php
index ef4060352..88900d14b 100644
--- a/app/i18n/sk/sub.php
+++ b/app/i18n/sk/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'Okamžité oznámenia cez WebSub',
),
'import_export' => array(
- 'export' => 'Exportovať',
+ 'export' => array(
+ '_' => 'Exportovať',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Exportovať vaše označené články',
'export_opml' => 'Exportovať zoznam kanálov (OPML)',
'export_starred' => 'Exportovať vaše obľúbené',
diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php
index e430f6376..47a3bebb4 100644
--- a/app/i18n/tr/gen.php
+++ b/app/i18n/tr/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => 'Sessize alınmış akışları sil',
'demote' => 'Yöneticilikten al',
'disable' => 'Pasif',
+ 'download' => 'Download', // TODO
'empty' => 'Boş',
'enable' => 'Aktif',
'export' => 'Dışa Aktar',
diff --git a/app/i18n/tr/sub.php b/app/i18n/tr/sub.php
index 293a33c1e..b5bc90f2d 100644
--- a/app/i18n/tr/sub.php
+++ b/app/i18n/tr/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'WebSub ile anlık bildirim',
),
'import_export' => array(
- 'export' => 'Dışa aktar',
+ 'export' => array(
+ '_' => 'Dışa aktar',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => 'Etiketli makaleleri dışarı aktar',
'export_opml' => 'Akış listesini dışarı aktar (OPML)',
'export_starred' => 'Favorileri dışarı aktar',
diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php
index 7b9d5a27d..9a425f177 100644
--- a/app/i18n/zh-cn/gen.php
+++ b/app/i18n/zh-cn/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => '删除已暂停的订阅源',
'demote' => '撤销管理员',
'disable' => '禁用',
+ 'download' => 'Download', // TODO
'empty' => '清空',
'enable' => '启用',
'export' => '导出',
diff --git a/app/i18n/zh-cn/sub.php b/app/i18n/zh-cn/sub.php
index 8731d2ec2..73373d04a 100644
--- a/app/i18n/zh-cn/sub.php
+++ b/app/i18n/zh-cn/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'WebSub 即时通知',
),
'import_export' => array(
- 'export' => '导出',
+ 'export' => array(
+ '_' => '导出',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => '导出有标签的文章',
'export_opml' => '导出订阅源列表(OPML)',
'export_starred' => '导出你的收藏',
diff --git a/app/i18n/zh-tw/gen.php b/app/i18n/zh-tw/gen.php
index b2b1fc67e..4843dce88 100644
--- a/app/i18n/zh-tw/gen.php
+++ b/app/i18n/zh-tw/gen.php
@@ -21,6 +21,7 @@ return array(
'delete_muted_feeds' => '刪除已暫停的訂閱源',
'demote' => '撤銷管理員',
'disable' => '禁用',
+ 'download' => 'Download', // TODO
'empty' => '清空',
'enable' => '啟用',
'export' => '導出',
diff --git a/app/i18n/zh-tw/sub.php b/app/i18n/zh-tw/sub.php
index 4934b5e66..26f0acfbd 100644
--- a/app/i18n/zh-tw/sub.php
+++ b/app/i18n/zh-tw/sub.php
@@ -246,7 +246,10 @@ return array(
'websub' => 'WebSub 即時通知',
),
'import_export' => array(
- 'export' => '導出',
+ 'export' => array(
+ '_' => '導出',
+ 'sqlite' => 'Download user database as SQLite', // TODO
+ ),
'export_labelled' => '導出有標籤的文章',
'export_opml' => '導出訂閱源列表(OPML)',
'export_starred' => '導出你的收藏',
diff --git a/app/views/importExport/index.phtml b/app/views/importExport/index.phtml
index dfcdc8404..1f32acfcb 100644
--- a/app/views/importExport/index.phtml
+++ b/app/views/importExport/index.phtml
@@ -65,7 +65,7 @@
$select_args = ' size="' . min(10, count($this->feeds)) . '" multiple="multiple"';
}
?>
- <select name="export_feeds[]"<?= $select_args ?> size="10">
+ <select name="export_feeds[]"<?= $select_args ?>>
<?= extension_loaded('zip') ? '' : '<option></option>' ?>
<?php foreach ($this->feeds as $feed) { ?>
<option value="<?= $feed->id() ?>"><?= $feed->name() ?></option>
@@ -81,4 +81,33 @@
</div>
</form>
<?php } ?>
+
+ <h2><?= _t('sub.import_export.export.sqlite') ?></h2>
+ <?php if (count($this->sqliteArchives ?? []) === 0): ?>
+ <p class="alert alert-warn">
+ <?= _t('gen.short.not_applicable') ?>
+ </p>
+ <?php else: ?>
+ <form method="post" action="<?= _url('importExport', 'sqlite') ?>">
+ <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
+ <div class="form-group">
+ <div class="group-controls">
+ <select name="sqlite">
+ <?php foreach ($this->sqliteArchives ?? [] as $sqliteArchive): ?>
+ <option value="<?= htmlspecialchars($sqliteArchive['name'], ENT_COMPAT, 'UTF-8') ?>">
+ <?= htmlspecialchars($sqliteArchive['name'], ENT_NOQUOTES, 'UTF-8') ?>
+ <small>(<?= format_bytes($sqliteArchive['size']) ?> · <?= date('c', $sqliteArchive['mtime']) ?>)</small>
+ </option>
+ <?php endforeach; ?>
+ </select>
+ </div>
+ </div>
+
+ <div class="form-group form-actions">
+ <div class="group-controls">
+ <button type="submit" class="btn btn-important"><?= _t('gen.action.download') ?></button>
+ </div>
+ </div>
+ </form>
+ <?php endif; ?>
</main>
diff --git a/app/views/importExport/sqlite.phtml b/app/views/importExport/sqlite.phtml
new file mode 100644
index 000000000..8c9adcab1
--- /dev/null
+++ b/app/views/importExport/sqlite.phtml
@@ -0,0 +1,9 @@
+<?php
+declare(strict_types=1);
+/** @var FreshRSS_View $this */
+header('Content-Type: application/vnd.sqlite3');
+header('Content-Disposition: attachment; filename="' . basename($this->sqlitePath) . '"');
+header('Cache-Control: private, no-store, max-age=0');
+header('Last-Modified: ' . gmdate(DateTimeInterface::RFC7231, @filemtime($this->sqlitePath) ?: 0));
+header('Content-Length: ' . (@filesize($this->sqlitePath) ?: 0));
+readfile($this->sqlitePath);