Skip to content

Commit 206edfc

Browse files
committed
feat(users): User settings import and export
Closes: #1347
1 parent b1c2def commit 206edfc

33 files changed

+502
-210
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
*.deb
66
*.rpm
77
miniflux-*
8+
miniflux.app

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ test:
100100

101101
lint:
102102
go vet ./...
103-
staticcheck ./...
104-
golangci-lint run --disable errcheck --enable sqlclosecheck --enable misspell --enable gofmt --enable goimports --enable whitespace
103+
gofmt -d -e .
104+
golangci-lint run
105105

106106
integration-test:
107107
psql -U postgres -c 'drop database if exists miniflux_test;'

internal/http/response/json/json.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,21 @@ func NotFound(w http.ResponseWriter, r *http.Request) {
201201
builder.Write()
202202
}
203203

204+
// Attachment forces the JSON document to be downloaded by the web browser.
205+
func Attachment(w http.ResponseWriter, r *http.Request, filename string, body any) {
206+
responseBody, err := json.MarshalIndent(body, "", "\t")
207+
if err != nil {
208+
ServerError(w, r, err)
209+
return
210+
}
211+
212+
builder := response.New(w, r)
213+
builder.WithHeader("Content-Type", "application/json; charset=utf-8")
214+
builder.WithAttachment(filename)
215+
builder.WithBody(responseBody)
216+
builder.Write()
217+
}
218+
204219
func generateJSONError(err error) ([]byte, error) {
205220
type errorMsg struct {
206221
ErrorMessage string `json:"error_message"`

internal/locale/translations/de_DE.json

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
"alert.account_unlinked": "Ihr externer Account ist jetzt getrennt!",
1616
"alert.background_feed_refresh": "Alle Abonnements werden derzeit im Hintergrund aktualisiert. Sie können Miniflux weiterhin benutzen, während dieser Prozess ausgeführt wird.",
1717
"alert.feed_error": "Es gibt ein Problem mit diesem Abonnement",
18-
"alert.no_starred": "Es existieren derzeit keine markierten Artikel.",
1918
"alert.no_category": "Es ist keine Kategorie vorhanden.",
2019
"alert.no_category_entry": "Es befindet sich kein Artikel in dieser Kategorie.",
2120
"alert.no_feed": "Es sind keine Abonnements vorhanden.",
@@ -24,6 +23,7 @@
2423
"alert.no_history": "Es existiert zur Zeit kein Verlauf.",
2524
"alert.no_search_result": "Es gibt kein Ergebnis für diese Suche.",
2625
"alert.no_shared_entry": "Es existieren derzeit keine geteilten Artikel.",
26+
"alert.no_starred": "Es existieren derzeit keine markierten Artikel.",
2727
"alert.no_tag_entry": "Es gibt keine Artikel, die diesem Tag entsprechen.",
2828
"alert.no_unread_entry": "Es existiert kein ungelesener Artikel.",
2929
"alert.no_user": "Sie sind der einzige Benutzer.",
@@ -46,10 +46,6 @@
4646
"enclosure_media_controls.speed.reset.title": "Wiedergabegeschwindigkeit auf 1x zurücksetzen",
4747
"enclosure_media_controls.speed.slower": "Langsamer",
4848
"enclosure_media_controls.speed.slower.title": "%sx langsamer",
49-
"entry.starred.toast.off": "Nicht markiert",
50-
"entry.starred.toast.on": "Markiert",
51-
"entry.starred.toggle.off": "Markierung entfernen",
52-
"entry.starred.toggle.on": "Markierung hinzufügen",
5349
"entry.comments.label": "Kommentare",
5450
"entry.comments.title": "Kommentare anzeigen",
5551
"entry.estimated_reading_time": [
@@ -68,6 +64,10 @@
6864
"entry.share.title": "Diesen Artikel teilen",
6965
"entry.shared_entry.label": "Teilen",
7066
"entry.shared_entry.title": "Öffnen Sie den öffentlichen Link",
67+
"entry.starred.toast.off": "Nicht markiert",
68+
"entry.starred.toast.on": "Markiert",
69+
"entry.starred.toggle.off": "Markierung entfernen",
70+
"entry.starred.toggle.on": "Markierung hinzufügen",
7171
"entry.state.loading": "Lade...",
7272
"entry.state.saving": "Speichern...",
7373
"entry.status.mark_as_read": "Als gelesen markieren",
@@ -129,6 +129,7 @@
129129
"error.invalid_site_url": "Ungültiger Site-URL.",
130130
"error.invalid_theme": "Ungültiges Thema.",
131131
"error.invalid_timezone": "Ungültige Zeitzone.",
132+
"error.linktaco_missing_required_fields": "LinkTaco API Token und Organization Slug sind erforderlich.",
132133
"error.network_operation": "Miniflux kann die Webseite aufgrund eines Netzwerk-Fehlers nicht erreichen: %v",
133134
"error.network_timeout": "Die Webseite ist zu langsam und die Anfrage ist abgelaufen: %v.",
134135
"error.password_min_length": "Wenigstens 6 Zeichen müssen genutzt werden.",
@@ -160,7 +161,6 @@
160161
"error.unlink_account_without_password": "Sie müssen ein Passwort festlegen, sonst können Sie sich nicht erneut anmelden.",
161162
"error.user_already_exists": "Dieser Benutzer existiert bereits.",
162163
"error.user_mandatory_fields": "Der Benutzername ist obligatorisch.",
163-
"error.linktaco_missing_required_fields": "LinkTaco API Token und Organization Slug sind erforderlich.",
164164
"form.api_key.label.description": "API-Schlüsselbezeichnung",
165165
"form.category.hide_globally": "Artikel in der globalen Ungelesen-Liste ausblenden",
166166
"form.category.label.title": "Titel",
@@ -258,9 +258,9 @@
258258
"form.integration.linktaco_tags": "Tags (max. 10, kommagetrennt)",
259259
"form.integration.linktaco_tags_hint": "Maximal 10 Tags, kommagetrennt",
260260
"form.integration.linktaco_visibility": "Sichtbarkeit",
261-
"form.integration.linktaco_visibility_public": "Öffentlich",
262-
"form.integration.linktaco_visibility_private": "Privat",
263261
"form.integration.linktaco_visibility_hint": "PRIVATE Sichtbarkeit erfordert ein kostenpflichtiges LinkTaco-Konto",
262+
"form.integration.linktaco_visibility_private": "Privat",
263+
"form.integration.linktaco_visibility_public": "Öffentlich",
264264
"form.integration.linkwarden_activate": "Artikel in Linkwarden speichern",
265265
"form.integration.linkwarden_api_key": "Linkwarden-API-Schlüssel",
266266
"form.integration.linkwarden_endpoint": "Linkwarden-Base-URL",
@@ -339,8 +339,10 @@
339339
"form.integration.webhook_url": "Standard-Webhook-URL",
340340
"form.prefs.fieldset.application_settings": "Anwendungseinstellungen",
341341
"form.prefs.fieldset.authentication_settings": "Authentifizierungseinstellungen",
342+
"form.prefs.fieldset.feeds_backup": "Feeds Backup",
342343
"form.prefs.fieldset.global_feed_settings": "Globale Feedeinstellungen",
343344
"form.prefs.fieldset.reader_settings": "Reader-Einstellungen",
345+
"form.prefs.fieldset.settings_backup": "Settings Backup",
344346
"form.prefs.help.external_font_hosts": "Per Leerzeichen getrennte Liste externer Schriftarten-Hosts, die erlaubt werden sollen. Beispiel: \"fonts.gstatic.com fonts.googleapis.com\".",
345347
"form.prefs.label.always_open_external_links": "Artikel immer mit Öffnen der Links lesen",
346348
"form.prefs.label.categories_sorting_order": "Kategorie-Sortierung",
@@ -519,10 +521,10 @@
519521
"page.keyboard_shortcuts.subtitle.pages": "Navigation zwischen den Seiten",
520522
"page.keyboard_shortcuts.subtitle.sections": "Navigation zwischen den Menüpunkten",
521523
"page.keyboard_shortcuts.title": "Tastenkürzel",
522-
"page.keyboard_shortcuts.toggle_star_status": "Markierung hinzufügen/entfernen",
523524
"page.keyboard_shortcuts.toggle_entry_attachments": "Artikelanhänge öffnen/schließen",
524525
"page.keyboard_shortcuts.toggle_read_status_next": "Gewählten Artikel als gelesen/ungelesen markieren, nächsten auswählen",
525526
"page.keyboard_shortcuts.toggle_read_status_prev": "Gewählten Artikel als gelesen/ungelesen markieren, vorherigen auswählen",
527+
"page.keyboard_shortcuts.toggle_star_status": "Markierung hinzufügen/entfernen",
526528
"page.login.google_signin": "Anmeldung mit Google",
527529
"page.login.oidc_signin": "Anmeldung mit %s",
528530
"page.login.title": "Anmeldung",

internal/locale/translations/el_EL.json

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
"alert.account_unlinked": "Ο εξωτερικός σας λογαριασμός είναι πλέον αποσυνδεδεμένος!",
1616
"alert.background_feed_refresh": "Όλες οι ροές ανανεώνονται στο παρασκήνιο. Μπορείτε να συνεχίσετε να χρησιμοποιείτε το Miniflux όσο εκτελείται αυτή η διαδικασία.",
1717
"alert.feed_error": "Υπάρχει πρόβλημα με αυτήν τη ροή",
18-
"alert.no_starred": "Δεν υπάρχει σελιδοδείκτης αυτή τη στιγμή.",
1918
"alert.no_category": "Δεν υπάρχει κατηγορία.",
2019
"alert.no_category_entry": "Δεν υπάρχουν άρθρα σε αυτήν την κατηγορία.",
2120
"alert.no_feed": "Δεν έχετε συνδρομές.",
@@ -24,6 +23,7 @@
2423
"alert.no_history": "Δεν υπάρχει ιστορικό αυτή τη στιγμή.",
2524
"alert.no_search_result": "Δεν υπάρχουν αποτελέσματα για αυτήν την αναζήτηση.",
2625
"alert.no_shared_entry": "Δεν υπάρχει κοινόχρηστη καταχώρηση.",
26+
"alert.no_starred": "Δεν υπάρχει σελιδοδείκτης αυτή τη στιγμή.",
2727
"alert.no_tag_entry": "Δεν υπάρχουν αντικείμενα που να ταιριάζουν με αυτή την ετικέτα.",
2828
"alert.no_unread_entry": "Δεν υπάρχουν μη αναγνωσμένα άρθρα.",
2929
"alert.no_user": "Είστε ο μόνος χρήστης.",
@@ -46,10 +46,6 @@
4646
"enclosure_media_controls.speed.reset.title": "Επαναφορά ταχύτητας σε 1x",
4747
"enclosure_media_controls.speed.slower": "Πιο αργά",
4848
"enclosure_media_controls.speed.slower.title": "Πιο αργά κατά %sx",
49-
"entry.starred.toast.off": "Μη αγαπημένα",
50-
"entry.starred.toast.on": "Αγαπημένα",
51-
"entry.starred.toggle.off": "Αναίρεση αγαπημένου",
52-
"entry.starred.toggle.on": "Αγαπημένο",
5349
"entry.comments.label": "Σχόλια",
5450
"entry.comments.title": "Δείτε Σχόλια",
5551
"entry.estimated_reading_time": [
@@ -68,6 +64,10 @@
6864
"entry.share.title": "Μοιραστείτε αυτό το άρθρο",
6965
"entry.shared_entry.label": "Διαμοιρασμός",
7066
"entry.shared_entry.title": "Ανοίξτε τον δημόσιο σύνδεσμο",
67+
"entry.starred.toast.off": "Μη αγαπημένα",
68+
"entry.starred.toast.on": "Αγαπημένα",
69+
"entry.starred.toggle.off": "Αναίρεση αγαπημένου",
70+
"entry.starred.toggle.on": "Αγαπημένο",
7171
"entry.state.loading": "Φόρτωση...",
7272
"entry.state.saving": "Aποθήκευση...",
7373
"entry.status.mark_as_read": "Επισήμανση ως αναγνωσμένο",
@@ -129,6 +129,7 @@
129129
"error.invalid_site_url": "Μη έγκυρη διεύθυνση URL ιστότοπου.",
130130
"error.invalid_theme": "Μη έγκυρο θέμα.",
131131
"error.invalid_timezone": "Μη έγκυρη ζώνη ώρας.",
132+
"error.linktaco_missing_required_fields": "Το LinkTaco API Token και το Organization Slug είναι απαραίτητα",
132133
"error.network_operation": "Το Miniflux δεν μπορεί να φτάσει σε αυτόν τον ιστότοπο λόγω σφάλματος δικτύου: %v.",
133134
"error.network_timeout": "Αυτός ο ιστότοπος είναι πολύ αργός και το αίτημα έληξε: %v",
134135
"error.password_min_length": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 6 χαρακτήρες.",
@@ -160,7 +161,6 @@
160161
"error.unlink_account_without_password": "Πρέπει να ορίσετε έναν κωδικό πρόσβασης διαφορετικά δεν θα μπορείτε να συνδεθείτε ξανά.",
161162
"error.user_already_exists": "Αυτός ο χρήστης υπάρχει ήδη.",
162163
"error.user_mandatory_fields": "Το όνομα χρήστη είναι υποχρεωτικό.",
163-
"error.linktaco_missing_required_fields": "Το LinkTaco API Token και το Organization Slug είναι απαραίτητα",
164164
"form.api_key.label.description": "Ετικέτα κλειδιού API",
165165
"form.category.hide_globally": "Απόκρυψη καταχωρήσεων σε γενική λίστα μη αναγνωσμένων",
166166
"form.category.label.title": "Τίτλος",
@@ -258,9 +258,9 @@
258258
"form.integration.linktaco_tags": "Ετικέτες (μέγιστο 10, διαχωρισμένες με κόμμα)",
259259
"form.integration.linktaco_tags_hint": "Μέγιστο 10 ετικέτες, διαχωρισμένες με κόμμα",
260260
"form.integration.linktaco_visibility": "Ορατότητα",
261-
"form.integration.linktaco_visibility_public": "Δημόσια",
262-
"form.integration.linktaco_visibility_private": "Ιδιωτική",
263261
"form.integration.linktaco_visibility_hint": "Η ΙΔΙΩΤΙΚΗ ορατότητα απαιτεί επί πληρωμή λογαριασμό LinkTaco",
262+
"form.integration.linktaco_visibility_private": "Ιδιωτική",
263+
"form.integration.linktaco_visibility_public": "Δημόσια",
264264
"form.integration.linkwarden_activate": "Αποθήκευση άρθρων στο Linkwarden",
265265
"form.integration.linkwarden_api_key": "Κλειδί API Linkwarden",
266266
"form.integration.linkwarden_endpoint": "URL βάσης Linkwarden",
@@ -339,8 +339,10 @@
339339
"form.integration.webhook_url": "Προεπιλεγμένη διεύθυνση URL Webhook",
340340
"form.prefs.fieldset.application_settings": "Ρυθμίσεις εφαρμογής",
341341
"form.prefs.fieldset.authentication_settings": "Ρυθμίσεις ελέγχου ταυτότητας",
342+
"form.prefs.fieldset.feeds_backup": "Feeds Backup",
342343
"form.prefs.fieldset.global_feed_settings": "Καθολικές ρυθμίσεις ροής",
343344
"form.prefs.fieldset.reader_settings": "Ρυθμίσεις αναγνώστη",
345+
"form.prefs.fieldset.settings_backup": "Settings Backup",
344346
"form.prefs.help.external_font_hosts": "Λίστα εξωτερικών κεντρικών υπολογιστών γραμματοσειρών διαχωρισμένων με κενό για να επιτρέπονται. Για παράδειγμα: \"fonts.gstatic.com fonts.googleapis.com\".",
345347
"form.prefs.label.always_open_external_links": "Ανάγνωση άρθρων ανοίγοντας εξωτερικούς συνδέσμους",
346348
"form.prefs.label.categories_sorting_order": "Ταξινόμηση κατηγοριών",
@@ -519,10 +521,10 @@
519521
"page.keyboard_shortcuts.subtitle.pages": "Πλοήγηση Σελίδων",
520522
"page.keyboard_shortcuts.subtitle.sections": "Πλοήγηση Τμημάτων",
521523
"page.keyboard_shortcuts.title": "Συντομεύσεις Πληκτρολογίου",
522-
"page.keyboard_shortcuts.toggle_star_status": "Εναλλαγή σελιδοδείκτη",
523524
"page.keyboard_shortcuts.toggle_entry_attachments": "Εναλλαγή άνοιγμα/κλείσιμο συνημμένων καταχώρησης",
524525
"page.keyboard_shortcuts.toggle_read_status_next": "Εναλλαγή ανάγνωσης / μη αναγνωσμένης, εστίαση στη συνέχεια",
525526
"page.keyboard_shortcuts.toggle_read_status_prev": "Εναλλαγή ανάγνωσης / μη αναγνωσμένης, εστίαση στο προηγούμενο",
527+
"page.keyboard_shortcuts.toggle_star_status": "Εναλλαγή σελιδοδείκτη",
526528
"page.login.google_signin": "Συνδεθείτε με τo Google",
527529
"page.login.oidc_signin": "Συνδεθείτε με το %s",
528530
"page.login.title": "Είσοδος",
@@ -627,4 +629,4 @@
627629
"time_elapsed.yesterday": "χθες",
628630
"tooltip.keyboard_shortcuts": "Συντόμευση πληκτρολογίου: % s",
629631
"tooltip.logged_user": "Συνδεδεμένος/η ως %s"
630-
}
632+
}

0 commit comments

Comments
 (0)