diff --git a/.gitignore b/.gitignore index 0a23210f122..cfd235be2b7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ *.deb *.rpm miniflux-* +miniflux.app diff --git a/internal/api/entry.go b/internal/api/entry.go index 724bb08ce97..904fe2ba5a2 100644 --- a/internal/api/entry.go +++ b/internal/api/entry.go @@ -90,7 +90,7 @@ func (h *handler) getEntries(w http.ResponseWriter, r *http.Request) { func (h *handler) findEntries(w http.ResponseWriter, r *http.Request, feedID int64, categoryID int64) { statuses := request.QueryStringParamList(r, "status") for _, status := range statuses { - if err := validator.ValidateEntryStatus(status); err != nil { + if err := validator.ValidateEntryStatus(model.EntryStatus(status)); err != nil { json.BadRequest(w, r, err) return } @@ -133,7 +133,7 @@ func (h *handler) findEntries(w http.ResponseWriter, r *http.Request, feedID int builder := h.store.NewEntryQueryBuilder(userID) builder.WithFeedID(feedID) builder.WithCategoryID(categoryID) - builder.WithStatuses(statuses) + builder.WithStatuses(model.ToStatuses(statuses)) builder.WithSorting(order, direction) builder.WithOffset(offset) builder.WithLimit(limit) diff --git a/internal/cli/cleanup_tasks.go b/internal/cli/cleanup_tasks.go index 4f2cd811426..572d62d27d3 100644 --- a/internal/cli/cleanup_tasks.go +++ b/internal/cli/cleanup_tasks.go @@ -30,7 +30,7 @@ func runCleanupTasks(store *storage.Storage) { ) if config.Opts.HasMetricsCollector() { - metric.ArchiveEntriesDuration.WithLabelValues(model.EntryStatusRead).Observe(time.Since(startTime).Seconds()) + metric.ArchiveEntriesDuration.WithLabelValues(string(model.EntryStatusRead)).Observe(time.Since(startTime).Seconds()) } } @@ -43,7 +43,7 @@ func runCleanupTasks(store *storage.Storage) { ) if config.Opts.HasMetricsCollector() { - metric.ArchiveEntriesDuration.WithLabelValues(model.EntryStatusUnread).Observe(time.Since(startTime).Seconds()) + metric.ArchiveEntriesDuration.WithLabelValues(string(model.EntryStatusUnread)).Observe(time.Since(startTime).Seconds()) } } diff --git a/internal/crypto/crypto.go b/internal/crypto/crypto.go index 79a838abb48..3723ca96544 100644 --- a/internal/crypto/crypto.go +++ b/internal/crypto/crypto.go @@ -45,6 +45,10 @@ func HashPassword(password string) (string, error) { return string(bytes), err } +func CompareHashAndPassword(hash, password string) error { + return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) +} + func GenerateSHA256Hmac(secret string, data []byte) string { h := hmac.New(sha256.New, []byte(secret)) h.Write(data) diff --git a/internal/googlereader/handler.go b/internal/googlereader/handler.go index 7e22bd7d0fb..99a4066133e 100644 --- a/internal/googlereader/handler.go +++ b/internal/googlereader/handler.go @@ -893,7 +893,7 @@ func (h *handler) renameTagHandler(w http.ResponseWriter, r *http.Request) { } categoryModificationRequest := model.CategoryModificationRequest{ - Title: model.SetOptionalField(destination.ID), + Title: model.OptionalField(destination.ID), } if validationError := validator.ValidateCategoryModification(h.store, userID, category.ID, &categoryModificationRequest); validationError != nil { diff --git a/internal/http/response/json/json.go b/internal/http/response/json/json.go index 7f5d33d5b71..d405855affa 100644 --- a/internal/http/response/json/json.go +++ b/internal/http/response/json/json.go @@ -201,6 +201,21 @@ func NotFound(w http.ResponseWriter, r *http.Request) { builder.Write() } +// Attachment forces the JSON document to be downloaded by the web browser. +func Attachment(w http.ResponseWriter, r *http.Request, filename string, body any) { + responseBody, err := json.MarshalIndent(body, "", "\t") + if err != nil { + ServerError(w, r, err) + return + } + + builder := response.New(w, r) + builder.WithHeader("Content-Type", "application/json; charset=utf-8") + builder.WithAttachment(filename) + builder.WithBody(responseBody) + builder.Write() +} + func generateJSONError(err error) ([]byte, error) { type errorMsg struct { ErrorMessage string `json:"error_message"` diff --git a/internal/integration/webhook/webhook.go b/internal/integration/webhook/webhook.go index 8dbaff0fda1..bbfd1fbcab5 100644 --- a/internal/integration/webhook/webhook.go +++ b/internal/integration/webhook/webhook.go @@ -166,7 +166,7 @@ type WebhookEntry struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` FeedID int64 `json:"feed_id"` - Status string `json:"status"` + Status model.EntryStatus `json:"status"` Hash string `json:"hash"` Title string `json:"title"` URL string `json:"url"` diff --git a/internal/locale/translations/de_DE.json b/internal/locale/translations/de_DE.json index aaf8c48ac07..cdf6cf99415 100644 --- a/internal/locale/translations/de_DE.json +++ b/internal/locale/translations/de_DE.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Ihr externer Account ist jetzt getrennt!", "alert.background_feed_refresh": "Alle Abonnements werden derzeit im Hintergrund aktualisiert. Sie können Miniflux weiterhin benutzen, während dieser Prozess ausgeführt wird.", "alert.feed_error": "Es gibt ein Problem mit diesem Abonnement", - "alert.no_starred": "Es existieren derzeit keine markierten Artikel.", "alert.no_category": "Es ist keine Kategorie vorhanden.", "alert.no_category_entry": "Es befindet sich kein Artikel in dieser Kategorie.", "alert.no_feed": "Es sind keine Abonnements vorhanden.", @@ -24,6 +23,7 @@ "alert.no_history": "Es existiert zur Zeit kein Verlauf.", "alert.no_search_result": "Es gibt kein Ergebnis für diese Suche.", "alert.no_shared_entry": "Es existieren derzeit keine geteilten Artikel.", + "alert.no_starred": "Es existieren derzeit keine markierten Artikel.", "alert.no_tag_entry": "Es gibt keine Artikel, die diesem Tag entsprechen.", "alert.no_unread_entry": "Es existiert kein ungelesener Artikel.", "alert.no_user": "Sie sind der einzige Benutzer.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Wiedergabegeschwindigkeit auf 1x zurücksetzen", "enclosure_media_controls.speed.slower": "Langsamer", "enclosure_media_controls.speed.slower.title": "%sx langsamer", - "entry.starred.toast.off": "Nicht markiert", - "entry.starred.toast.on": "Markiert", - "entry.starred.toggle.off": "Markierung entfernen", - "entry.starred.toggle.on": "Markierung hinzufügen", "entry.comments.label": "Kommentare", "entry.comments.title": "Kommentare anzeigen", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Diesen Artikel teilen", "entry.shared_entry.label": "Teilen", "entry.shared_entry.title": "Öffnen Sie den öffentlichen Link", + "entry.starred.toast.off": "Nicht markiert", + "entry.starred.toast.on": "Markiert", + "entry.starred.toggle.off": "Markierung entfernen", + "entry.starred.toggle.on": "Markierung hinzufügen", "entry.state.loading": "Lade...", "entry.state.saving": "Speichern...", "entry.status.mark_as_read": "Als gelesen markieren", @@ -129,6 +129,7 @@ "error.invalid_site_url": "Ungültiger Site-URL.", "error.invalid_theme": "Ungültiges Thema.", "error.invalid_timezone": "Ungültige Zeitzone.", + "error.linktaco_missing_required_fields": "LinkTaco API Token und Organization Slug sind erforderlich.", "error.network_operation": "Miniflux kann die Webseite aufgrund eines Netzwerk-Fehlers nicht erreichen: %v", "error.network_timeout": "Die Webseite ist zu langsam und die Anfrage ist abgelaufen: %v.", "error.password_min_length": "Wenigstens 6 Zeichen müssen genutzt werden.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Sie müssen ein Passwort festlegen, sonst können Sie sich nicht erneut anmelden.", "error.user_already_exists": "Dieser Benutzer existiert bereits.", "error.user_mandatory_fields": "Der Benutzername ist obligatorisch.", - "error.linktaco_missing_required_fields": "LinkTaco API Token und Organization Slug sind erforderlich.", "form.api_key.label.description": "API-Schlüsselbezeichnung", "form.category.hide_globally": "Artikel in der globalen Ungelesen-Liste ausblenden", "form.category.label.title": "Titel", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tags (max. 10, kommagetrennt)", "form.integration.linktaco_tags_hint": "Maximal 10 Tags, kommagetrennt", "form.integration.linktaco_visibility": "Sichtbarkeit", - "form.integration.linktaco_visibility_public": "Öffentlich", - "form.integration.linktaco_visibility_private": "Privat", "form.integration.linktaco_visibility_hint": "PRIVATE Sichtbarkeit erfordert ein kostenpflichtiges LinkTaco-Konto", + "form.integration.linktaco_visibility_private": "Privat", + "form.integration.linktaco_visibility_public": "Öffentlich", "form.integration.linkwarden_activate": "Artikel in Linkwarden speichern", "form.integration.linkwarden_api_key": "Linkwarden-API-Schlüssel", "form.integration.linkwarden_endpoint": "Linkwarden-Base-URL", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Standard-Webhook-URL", "form.prefs.fieldset.application_settings": "Anwendungseinstellungen", "form.prefs.fieldset.authentication_settings": "Authentifizierungseinstellungen", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Globale Feedeinstellungen", "form.prefs.fieldset.reader_settings": "Reader-Einstellungen", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Per Leerzeichen getrennte Liste externer Schriftarten-Hosts, die erlaubt werden sollen. Beispiel: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Artikel immer mit Öffnen der Links lesen", "form.prefs.label.categories_sorting_order": "Kategorie-Sortierung", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navigation zwischen den Seiten", "page.keyboard_shortcuts.subtitle.sections": "Navigation zwischen den Menüpunkten", "page.keyboard_shortcuts.title": "Tastenkürzel", - "page.keyboard_shortcuts.toggle_star_status": "Markierung hinzufügen/entfernen", "page.keyboard_shortcuts.toggle_entry_attachments": "Artikelanhänge öffnen/schließen", "page.keyboard_shortcuts.toggle_read_status_next": "Gewählten Artikel als gelesen/ungelesen markieren, nächsten auswählen", "page.keyboard_shortcuts.toggle_read_status_prev": "Gewählten Artikel als gelesen/ungelesen markieren, vorherigen auswählen", + "page.keyboard_shortcuts.toggle_star_status": "Markierung hinzufügen/entfernen", "page.login.google_signin": "Anmeldung mit Google", "page.login.oidc_signin": "Anmeldung mit %s", "page.login.title": "Anmeldung", diff --git a/internal/locale/translations/el_EL.json b/internal/locale/translations/el_EL.json index dc4d7da7b4e..42a00b2d36d 100644 --- a/internal/locale/translations/el_EL.json +++ b/internal/locale/translations/el_EL.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Ο εξωτερικός σας λογαριασμός είναι πλέον αποσυνδεδεμένος!", "alert.background_feed_refresh": "Όλες οι ροές ανανεώνονται στο παρασκήνιο. Μπορείτε να συνεχίσετε να χρησιμοποιείτε το Miniflux όσο εκτελείται αυτή η διαδικασία.", "alert.feed_error": "Υπάρχει πρόβλημα με αυτήν τη ροή", - "alert.no_starred": "Δεν υπάρχει σελιδοδείκτης αυτή τη στιγμή.", "alert.no_category": "Δεν υπάρχει κατηγορία.", "alert.no_category_entry": "Δεν υπάρχουν άρθρα σε αυτήν την κατηγορία.", "alert.no_feed": "Δεν έχετε συνδρομές.", @@ -24,6 +23,7 @@ "alert.no_history": "Δεν υπάρχει ιστορικό αυτή τη στιγμή.", "alert.no_search_result": "Δεν υπάρχουν αποτελέσματα για αυτήν την αναζήτηση.", "alert.no_shared_entry": "Δεν υπάρχει κοινόχρηστη καταχώρηση.", + "alert.no_starred": "Δεν υπάρχει σελιδοδείκτης αυτή τη στιγμή.", "alert.no_tag_entry": "Δεν υπάρχουν αντικείμενα που να ταιριάζουν με αυτή την ετικέτα.", "alert.no_unread_entry": "Δεν υπάρχουν μη αναγνωσμένα άρθρα.", "alert.no_user": "Είστε ο μόνος χρήστης.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Επαναφορά ταχύτητας σε 1x", "enclosure_media_controls.speed.slower": "Πιο αργά", "enclosure_media_controls.speed.slower.title": "Πιο αργά κατά %sx", - "entry.starred.toast.off": "Μη αγαπημένα", - "entry.starred.toast.on": "Αγαπημένα", - "entry.starred.toggle.off": "Αναίρεση αγαπημένου", - "entry.starred.toggle.on": "Αγαπημένο", "entry.comments.label": "Σχόλια", "entry.comments.title": "Δείτε Σχόλια", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Μοιραστείτε αυτό το άρθρο", "entry.shared_entry.label": "Διαμοιρασμός", "entry.shared_entry.title": "Ανοίξτε τον δημόσιο σύνδεσμο", + "entry.starred.toast.off": "Μη αγαπημένα", + "entry.starred.toast.on": "Αγαπημένα", + "entry.starred.toggle.off": "Αναίρεση αγαπημένου", + "entry.starred.toggle.on": "Αγαπημένο", "entry.state.loading": "Φόρτωση...", "entry.state.saving": "Aποθήκευση...", "entry.status.mark_as_read": "Επισήμανση ως αναγνωσμένο", @@ -129,6 +129,7 @@ "error.invalid_site_url": "Μη έγκυρη διεύθυνση URL ιστότοπου.", "error.invalid_theme": "Μη έγκυρο θέμα.", "error.invalid_timezone": "Μη έγκυρη ζώνη ώρας.", + "error.linktaco_missing_required_fields": "Το LinkTaco API Token και το Organization Slug είναι απαραίτητα", "error.network_operation": "Το Miniflux δεν μπορεί να φτάσει σε αυτόν τον ιστότοπο λόγω σφάλματος δικτύου: %v.", "error.network_timeout": "Αυτός ο ιστότοπος είναι πολύ αργός και το αίτημα έληξε: %v", "error.password_min_length": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 6 χαρακτήρες.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Πρέπει να ορίσετε έναν κωδικό πρόσβασης διαφορετικά δεν θα μπορείτε να συνδεθείτε ξανά.", "error.user_already_exists": "Αυτός ο χρήστης υπάρχει ήδη.", "error.user_mandatory_fields": "Το όνομα χρήστη είναι υποχρεωτικό.", - "error.linktaco_missing_required_fields": "Το LinkTaco API Token και το Organization Slug είναι απαραίτητα", "form.api_key.label.description": "Ετικέτα κλειδιού API", "form.category.hide_globally": "Απόκρυψη καταχωρήσεων σε γενική λίστα μη αναγνωσμένων", "form.category.label.title": "Τίτλος", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Ετικέτες (μέγιστο 10, διαχωρισμένες με κόμμα)", "form.integration.linktaco_tags_hint": "Μέγιστο 10 ετικέτες, διαχωρισμένες με κόμμα", "form.integration.linktaco_visibility": "Ορατότητα", - "form.integration.linktaco_visibility_public": "Δημόσια", - "form.integration.linktaco_visibility_private": "Ιδιωτική", "form.integration.linktaco_visibility_hint": "Η ΙΔΙΩΤΙΚΗ ορατότητα απαιτεί επί πληρωμή λογαριασμό LinkTaco", + "form.integration.linktaco_visibility_private": "Ιδιωτική", + "form.integration.linktaco_visibility_public": "Δημόσια", "form.integration.linkwarden_activate": "Αποθήκευση άρθρων στο Linkwarden", "form.integration.linkwarden_api_key": "Κλειδί API Linkwarden", "form.integration.linkwarden_endpoint": "URL βάσης Linkwarden", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Προεπιλεγμένη διεύθυνση URL Webhook", "form.prefs.fieldset.application_settings": "Ρυθμίσεις εφαρμογής", "form.prefs.fieldset.authentication_settings": "Ρυθμίσεις ελέγχου ταυτότητας", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Καθολικές ρυθμίσεις ροής", "form.prefs.fieldset.reader_settings": "Ρυθμίσεις αναγνώστη", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Λίστα εξωτερικών κεντρικών υπολογιστών γραμματοσειρών διαχωρισμένων με κενό για να επιτρέπονται. Για παράδειγμα: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Ανάγνωση άρθρων ανοίγοντας εξωτερικούς συνδέσμους", "form.prefs.label.categories_sorting_order": "Ταξινόμηση κατηγοριών", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Πλοήγηση Σελίδων", "page.keyboard_shortcuts.subtitle.sections": "Πλοήγηση Τμημάτων", "page.keyboard_shortcuts.title": "Συντομεύσεις Πληκτρολογίου", - "page.keyboard_shortcuts.toggle_star_status": "Εναλλαγή σελιδοδείκτη", "page.keyboard_shortcuts.toggle_entry_attachments": "Εναλλαγή άνοιγμα/κλείσιμο συνημμένων καταχώρησης", "page.keyboard_shortcuts.toggle_read_status_next": "Εναλλαγή ανάγνωσης / μη αναγνωσμένης, εστίαση στη συνέχεια", "page.keyboard_shortcuts.toggle_read_status_prev": "Εναλλαγή ανάγνωσης / μη αναγνωσμένης, εστίαση στο προηγούμενο", + "page.keyboard_shortcuts.toggle_star_status": "Εναλλαγή σελιδοδείκτη", "page.login.google_signin": "Συνδεθείτε με τo Google", "page.login.oidc_signin": "Συνδεθείτε με το %s", "page.login.title": "Είσοδος", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "χθες", "tooltip.keyboard_shortcuts": "Συντόμευση πληκτρολογίου: % s", "tooltip.logged_user": "Συνδεδεμένος/η ως %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/en_US.json b/internal/locale/translations/en_US.json index 192fee0dae4..1b0eafc4fac 100644 --- a/internal/locale/translations/en_US.json +++ b/internal/locale/translations/en_US.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Your external account is now dissociated!", "alert.background_feed_refresh": "All feeds are being refreshed in the background. You can continue to use Miniflux while this process is running.", "alert.feed_error": "There is a problem with this feed", - "alert.no_starred": "There are no starred entries.", "alert.no_category": "There is no category.", "alert.no_category_entry": "There are no entries in this category.", "alert.no_feed": "You don’t have any feeds.", @@ -24,6 +23,7 @@ "alert.no_history": "There is no history at the moment.", "alert.no_search_result": "There are no results for this search.", "alert.no_shared_entry": "There is no shared entry.", + "alert.no_starred": "There are no starred entries.", "alert.no_tag_entry": "There are no entries matching this tag.", "alert.no_unread_entry": "There are no unread entries.", "alert.no_user": "You are the only user.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Reset speed to 1x", "enclosure_media_controls.speed.slower": "Slower", "enclosure_media_controls.speed.slower.title": "Slower by %sx", - "entry.starred.toast.off": "Unstarred", - "entry.starred.toast.on": "Starred", - "entry.starred.toggle.off": "Unstar", - "entry.starred.toggle.on": "Star", "entry.comments.label": "Comments", "entry.comments.title": "View Comments", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Share this entry", "entry.shared_entry.label": "Share", "entry.shared_entry.title": "Open the public link", + "entry.starred.toast.off": "Unstarred", + "entry.starred.toast.on": "Starred", + "entry.starred.toggle.off": "Unstar", + "entry.starred.toggle.on": "Star", "entry.state.loading": "Loading…", "entry.state.saving": "Saving…", "entry.status.mark_as_read": "Mark as read", @@ -89,7 +89,6 @@ "error.different_passwords": "Passwords are not the same.", "error.duplicate_fever_username": "There is already someone else with the same Fever username!", "error.duplicate_googlereader_username": "There is already someone else with the same Google Reader username!", - "error.linktaco_missing_required_fields": "LinkTaco API Token and Organization Slug are required", "error.duplicate_linked_account": "There is already someone associated with this provider!", "error.duplicated_feed": "This feed already exists.", "error.empty_file": "This file is empty.", @@ -130,6 +129,7 @@ "error.invalid_site_url": "Invalid site URL.", "error.invalid_theme": "Invalid theme.", "error.invalid_timezone": "Invalid timezone.", + "error.linktaco_missing_required_fields": "LinkTaco API Token and Organization Slug are required", "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.", "error.network_timeout": "This website is too slow and the request timed out: %v", "error.password_min_length": "The password must have at least 6 characters.", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tags (max 10, comma-separated)", "form.integration.linktaco_tags_hint": "Maximum 10 tags, comma-separated", "form.integration.linktaco_visibility": "Visibility", - "form.integration.linktaco_visibility_public": "Public", - "form.integration.linktaco_visibility_private": "Private", "form.integration.linktaco_visibility_hint": "PRIVATE visibility requires a paid LinkTaco account", + "form.integration.linktaco_visibility_private": "Private", + "form.integration.linktaco_visibility_public": "Public", "form.integration.linkwarden_activate": "Save entries to Linkwarden", "form.integration.linkwarden_api_key": "Linkwarden API key", "form.integration.linkwarden_endpoint": "Linkwarden Base URL", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Global Feed Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Space separated list of external font hosts to allow. For example: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Read articles by opening external links", "form.prefs.label.categories_sorting_order": "Categories sorting", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Pages Navigation", "page.keyboard_shortcuts.subtitle.sections": "Sections Navigation", "page.keyboard_shortcuts.title": "Keyboard Shortcuts", - "page.keyboard_shortcuts.toggle_star_status": "Toggle starred", "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments", "page.keyboard_shortcuts.toggle_read_status_next": "Toggle read/unread, focus next", "page.keyboard_shortcuts.toggle_read_status_prev": "Toggle read/unread, focus previous", + "page.keyboard_shortcuts.toggle_star_status": "Toggle starred", "page.login.google_signin": "Sign in with Google", "page.login.oidc_signin": "Sign in with %s", "page.login.title": "Sign In", diff --git a/internal/locale/translations/es_ES.json b/internal/locale/translations/es_ES.json index 720edfe738c..d12b25eb5bf 100644 --- a/internal/locale/translations/es_ES.json +++ b/internal/locale/translations/es_ES.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "¡Tu cuenta externa ya está desvinculada!", "alert.background_feed_refresh": "Todos los feeds se actualizan en segundo plano. Puede continuar usando Miniflux mientras se ejecuta este proceso.", "alert.feed_error": "Hay un problema con esta fuente.", - "alert.no_starred": "No hay marcador en este momento.", "alert.no_category": "No hay categoría.", "alert.no_category_entry": "No hay artículos en esta categoría.", "alert.no_feed": "No tienes fuentes.", @@ -24,6 +23,7 @@ "alert.no_history": "No hay historial en este momento.", "alert.no_search_result": "No hay resultados para esta búsqueda.", "alert.no_shared_entry": "No hay artículos compartidos.", + "alert.no_starred": "No hay marcador en este momento.", "alert.no_tag_entry": "No hay artículos con esta etiqueta.", "alert.no_unread_entry": "No hay artículos sin leer.", "alert.no_user": "Eres el único usuario.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Restablecer la velocidad a 1x", "enclosure_media_controls.speed.slower": "Despacio", "enclosure_media_controls.speed.slower.title": "Más despacio a %sx", - "entry.starred.toast.off": "Sin estrellas", - "entry.starred.toast.on": "Sembrado de estrellas", - "entry.starred.toggle.off": "Desmarcar", - "entry.starred.toggle.on": "Marcar", "entry.comments.label": "Comentarios", "entry.comments.title": "Ver comentarios", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Compartir este artículo", "entry.shared_entry.label": "Compartir", "entry.shared_entry.title": "Abrir el enlace público", + "entry.starred.toast.off": "Sin estrellas", + "entry.starred.toast.on": "Sembrado de estrellas", + "entry.starred.toggle.off": "Desmarcar", + "entry.starred.toggle.on": "Marcar", "entry.state.loading": "Cargando...", "entry.state.saving": "Guardando...", "entry.status.mark_as_read": "Marcar como leído", @@ -129,6 +129,7 @@ "error.invalid_site_url": "URL del sitio no válida.", "error.invalid_theme": "Tema no válido.", "error.invalid_timezone": "Zona horaria no válida.", + "error.linktaco_missing_required_fields": "LinkTaco API Token y Organization Slug son obligatorios.", "error.network_operation": "Miniflux no puede acceder a este sitio web debido a un error de red: %v.", "error.network_timeout": "Este sitio web es demasiado lento y se agotó el tiempo de espera de la solicitud: %v", "error.password_min_length": "La contraseña debería tener al menos 6 caracteres.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Debe definir una contraseña, de lo contrario no podrá volver a iniciar sesión.", "error.user_already_exists": "Este usuario ya existe.", "error.user_mandatory_fields": "El nombre de usuario es obligatorio.", - "error.linktaco_missing_required_fields": "LinkTaco API Token y Organization Slug son obligatorios.", "form.api_key.label.description": "Etiqueta de clave API", "form.category.hide_globally": "Ocultar artículos en la lista global de no leídos", "form.category.label.title": "Título", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Etiquetas (máx. 10, separadas por comas)", "form.integration.linktaco_tags_hint": "Máximo 10 etiquetas, separadas por comas", "form.integration.linktaco_visibility": "Visibilidad", - "form.integration.linktaco_visibility_public": "Público", - "form.integration.linktaco_visibility_private": "Privado", "form.integration.linktaco_visibility_hint": "La visibilidad PRIVADA requiere una cuenta de pago de LinkTaco", + "form.integration.linktaco_visibility_private": "Privado", + "form.integration.linktaco_visibility_public": "Público", "form.integration.linkwarden_activate": "Enviar artículos a Linkwarden", "form.integration.linkwarden_api_key": "Clave de API de Linkwarden", "form.integration.linkwarden_endpoint": "URL base de Linkwarden", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Defecto URL de Webhook", "form.prefs.fieldset.application_settings": "Ajustes de la aplicación", "form.prefs.fieldset.authentication_settings": "Ajustes de la autentificación", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Ajustes globales del feed", "form.prefs.fieldset.reader_settings": "Ajustes del lector", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Lista separada por espacios de hosts de fuentes externas permitidos. Por ejemplo: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Leer artículos abriendo enlaces externos", "form.prefs.label.categories_sorting_order": "Clasificación por categorías", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navegación de páginas", "page.keyboard_shortcuts.subtitle.sections": "Navegación de secciones", "page.keyboard_shortcuts.title": "Atajos de teclado", - "page.keyboard_shortcuts.toggle_star_status": "Agregar o quitar marcador", "page.keyboard_shortcuts.toggle_entry_attachments": "Alternar abrir/cerrar adjuntos de la entrada", "page.keyboard_shortcuts.toggle_read_status_next": "Marcar como leído o no leído, enfoque siguiente", "page.keyboard_shortcuts.toggle_read_status_prev": "Marcar como leído o no leído, foco anterior", + "page.keyboard_shortcuts.toggle_star_status": "Agregar o quitar marcador", "page.login.google_signin": "Iniciar sesión con tu cuenta de Google", "page.login.oidc_signin": "Iniciar sesión con tu cuenta de %s", "page.login.title": "Iniciar sesión", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "ayer", "tooltip.keyboard_shortcuts": "Atajo de teclado: %s", "tooltip.logged_user": "Registrado como %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/fi_FI.json b/internal/locale/translations/fi_FI.json index 2cefea7acb6..05fbe9b90cc 100644 --- a/internal/locale/translations/fi_FI.json +++ b/internal/locale/translations/fi_FI.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Ulkoinen tilisi on nyt irrotettu!", "alert.background_feed_refresh": "Kaikki syötteet päivitetään taustalla. Voit jatkaa Minifluxin käyttöä tämän prosessin aikana.", "alert.feed_error": "Tässä syötteessä on ongelma", - "alert.no_starred": "Tällä hetkellä ei ole kirjanmerkkiä.", "alert.no_category": "Ei ole kategoriaa.", "alert.no_category_entry": "Tässä kategoriassa ei ole artikkeleita.", "alert.no_feed": "Sinulla ei ole tilauksia.", @@ -24,6 +23,7 @@ "alert.no_history": "Tällä hetkellä ei ole historiaa.", "alert.no_search_result": "Ei hakua vastaavia tuloksia.", "alert.no_shared_entry": "Jaettua artikkelia ei ole.", + "alert.no_starred": "Tällä hetkellä ei ole kirjanmerkkiä.", "alert.no_tag_entry": "Tätä tunnistetta vastaavia merkintöjä ei ole.", "alert.no_unread_entry": "Ei ole lukemattomia artikkeleita.", "alert.no_user": "Olet ainoa käyttäjä.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Palauta nopeus 1x", "enclosure_media_controls.speed.slower": "Hitaammin", "enclosure_media_controls.speed.slower.title": "Hitaampi %sx", - "entry.starred.toast.off": "Tähdettömät", - "entry.starred.toast.on": "Tähdellä merkityt", - "entry.starred.toggle.off": "Poista suosikeista", - "entry.starred.toggle.on": "Lisää suosikkeihin", "entry.comments.label": "Kommentit", "entry.comments.title": "Näytä kommentit", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Jaa tämä artikkeli", "entry.shared_entry.label": "Jaa", "entry.shared_entry.title": "Avaa julkinen linkki", + "entry.starred.toast.off": "Tähdettömät", + "entry.starred.toast.on": "Tähdellä merkityt", + "entry.starred.toggle.off": "Poista suosikeista", + "entry.starred.toggle.on": "Lisää suosikkeihin", "entry.state.loading": "Ladataan...", "entry.state.saving": "Tallennetaan...", "entry.status.mark_as_read": "Merkitse luetuksi", @@ -129,6 +129,7 @@ "error.invalid_site_url": "Virheellinen sivuston URL-osoite.", "error.invalid_theme": "Virheellinen teema.", "error.invalid_timezone": "Virheellinen aikavyöhyke.", + "error.linktaco_missing_required_fields": "LinkTaco API Token ja Organization Slug vaaditaan", "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.", "error.network_timeout": "This website is too slow and the request timed out: %v", "error.password_min_length": "Salasanassa on oltava vähintään 6 merkkiä.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Sinun on määritettävä salasana, muuten et voi kirjautua uudelleen.", "error.user_already_exists": "Käyttäjä on jo olemassa.", "error.user_mandatory_fields": "Käyttäjätunnus on pakollinen.", - "error.linktaco_missing_required_fields": "LinkTaco API Token ja Organization Slug vaaditaan", "form.api_key.label.description": "API Key Label", "form.category.hide_globally": "Piilota artikkelit lukemattomien listassa", "form.category.label.title": "Otsikko", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tagit (enintään 10, pilkuilla erotettu)", "form.integration.linktaco_tags_hint": "Enintään 10 tagia, pilkuilla erotettu", "form.integration.linktaco_visibility": "Näkyvyys", - "form.integration.linktaco_visibility_public": "Julkinen", - "form.integration.linktaco_visibility_private": "Yksityinen", "form.integration.linktaco_visibility_hint": "YKSITYINEN näkyvyys vaatii maksullisen LinkTaco-tilin", + "form.integration.linktaco_visibility_private": "Yksityinen", + "form.integration.linktaco_visibility_public": "Julkinen", "form.integration.linkwarden_activate": "Tallenna artikkelit Linkkiin", "form.integration.linkwarden_api_key": "Linkwarden API-avain", "form.integration.linkwarden_endpoint": "Linkwarden Base URL", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Global Feed Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Space separated list of external font hosts to allow. For example: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Read articles by opening external links", "form.prefs.label.categories_sorting_order": "Kategorioiden lajittelu", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Sivujen navigointi", "page.keyboard_shortcuts.subtitle.sections": "Osion navigointi", "page.keyboard_shortcuts.title": "Pikanäppäimet", - "page.keyboard_shortcuts.toggle_star_status": "Vaihda kirjanmerkki", "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments", "page.keyboard_shortcuts.toggle_read_status_next": "Vaihda luettu/lukematon, keskity seuraavaksi", "page.keyboard_shortcuts.toggle_read_status_prev": "Vaihda luettu/lukematon, keskity edelliseen", + "page.keyboard_shortcuts.toggle_star_status": "Vaihda kirjanmerkki", "page.login.google_signin": "Kirjaudu sisään Googlella", "page.login.oidc_signin": "Kirjaudu sisään %silla", "page.login.title": "Kirjaudu sisään", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "eilen", "tooltip.keyboard_shortcuts": "Pikanäppäin: %s", "tooltip.logged_user": "Kirjautunut %s-käyttäjänä" -} \ No newline at end of file +} diff --git a/internal/locale/translations/fr_FR.json b/internal/locale/translations/fr_FR.json index 06c77beb201..635cfcb0802 100644 --- a/internal/locale/translations/fr_FR.json +++ b/internal/locale/translations/fr_FR.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Votre compte externe est maintenant dissocié !", "alert.background_feed_refresh": "Les abonnements sont en cours d'actualisation en arrière-plan. Vous pouvez continuer à naviguer dans l'application.", "alert.feed_error": "Il y a un problème avec cet abonnement", - "alert.no_starred": "Il n'y a aucun favoris pour le moment.", "alert.no_category": "Il n'y a aucune catégorie.", "alert.no_category_entry": "Il n'y a aucun article dans cette catégorie.", "alert.no_feed": "Vous n'avez aucun abonnement.", @@ -24,6 +23,7 @@ "alert.no_history": "Il n'y a aucun historique pour le moment.", "alert.no_search_result": "Il n'y a aucun résultat pour cette recherche.", "alert.no_shared_entry": "Il n'y a pas d'article partagé.", + "alert.no_starred": "Il n'y a aucun favoris pour le moment.", "alert.no_tag_entry": "Il n'y a aucun article correspondant à ce tag.", "alert.no_unread_entry": "Il n'y a rien de nouveau à lire.", "alert.no_user": "Vous êtes le seul utilisateur.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Réinitialiser la vitesse de lecture à 1x", "enclosure_media_controls.speed.slower": "Ralentir", "enclosure_media_controls.speed.slower.title": "Ralentir de %sx", - "entry.starred.toast.off": "Enlevé des favoris", - "entry.starred.toast.on": "Ajouté aux favoris", - "entry.starred.toggle.off": "Enlever favoris", - "entry.starred.toggle.on": "Favoris", "entry.comments.label": "Commentaires", "entry.comments.title": "Voir les commentaires", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Partager cet article", "entry.shared_entry.label": "Partage", "entry.shared_entry.title": "Ouvrir le lien public", + "entry.starred.toast.off": "Enlevé des favoris", + "entry.starred.toast.on": "Ajouté aux favoris", + "entry.starred.toggle.off": "Enlever favoris", + "entry.starred.toggle.on": "Favoris", "entry.state.loading": "Chargement...", "entry.state.saving": "Sauvegarde en cours...", "entry.status.mark_as_read": "Marquer comme lu", @@ -129,6 +129,7 @@ "error.invalid_site_url": "URL de site non valide.", "error.invalid_theme": "Thème non valide.", "error.invalid_timezone": "Fuseau horaire non valide.", + "error.linktaco_missing_required_fields": "Le token API LinkTaco et le slug de l'organisation sont requis.", "error.network_operation": "Miniflux n'est pas en mesure de se connecter à ce site web à cause d'un problème réseau : %v.", "error.network_timeout": "Ce site web est trop lent à répondre : %v.", "error.password_min_length": "Vous devez utiliser au moins 6 caractères pour le mot de passe.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Vous devez définir un mot de passe sinon vous ne pourrez plus vous connecter par la suite.", "error.user_already_exists": "Cet utilisateur existe déjà.", "error.user_mandatory_fields": "Le nom d'utilisateur est obligatoire.", - "error.linktaco_missing_required_fields": "Le token API LinkTaco et le slug de l'organisation sont requis.", "form.api_key.label.description": "Libellé de la clé d'API", "form.category.hide_globally": "Masquer les entrées dans la liste globale non lue", "form.category.label.title": "Titre", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tags (max. 10, séparés par des virgules)", "form.integration.linktaco_tags_hint": "Maximum 10 tags, séparés par des virgules", "form.integration.linktaco_visibility": "Visibilité", - "form.integration.linktaco_visibility_public": "Public", - "form.integration.linktaco_visibility_private": "Privé", "form.integration.linktaco_visibility_hint": "La visibilité PRIVÉE nécessite un compte LinkTaco payant", + "form.integration.linktaco_visibility_private": "Privé", + "form.integration.linktaco_visibility_public": "Public", "form.integration.linkwarden_activate": "Sauvegarder les articles vers Linkwarden", "form.integration.linkwarden_api_key": "Clé d'API de Linkwarden", "form.integration.linkwarden_endpoint": "URL de base de Linkwarden", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "URL du webhook", "form.prefs.fieldset.application_settings": "Paramètres de l'application", "form.prefs.fieldset.authentication_settings": "Paramètres d'authentification", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Paramètres globaux des abonnements", "form.prefs.fieldset.reader_settings": "Paramètres du lecteur", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Liste de domaine externes autorisés, séparés par des espaces. Par exemple : « fonts.gstatic.com fonts.googleapis.com ».", "form.prefs.label.always_open_external_links": "Lire les articles en ouvrant les liens externes", "form.prefs.label.categories_sorting_order": "Colonne de tri des catégories", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navigation entre les pages", "page.keyboard_shortcuts.subtitle.sections": "Navigation entre les sections", "page.keyboard_shortcuts.title": "Raccourcis clavier", - "page.keyboard_shortcuts.toggle_star_status": "Ajouter/Enlever favoris", "page.keyboard_shortcuts.toggle_entry_attachments": "Ouvrir/Fermer les pièces jointes de l'entrée", "page.keyboard_shortcuts.toggle_read_status_next": "Basculer entre lu/non lu, et changer le focus sur l'élément suivant", "page.keyboard_shortcuts.toggle_read_status_prev": "Basculer entre lu/non lu, et changer le focus sur l'élément précédent", + "page.keyboard_shortcuts.toggle_star_status": "Ajouter/Enlever favoris", "page.login.google_signin": "Se connecter avec Google", "page.login.oidc_signin": "Se connecter avec %s", "page.login.title": "Connexion", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "hier", "tooltip.keyboard_shortcuts": "Raccourci clavier : %s", "tooltip.logged_user": "Connecté en tant que %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/hi_IN.json b/internal/locale/translations/hi_IN.json index 96143ef4c51..4acba0ac5bf 100644 --- a/internal/locale/translations/hi_IN.json +++ b/internal/locale/translations/hi_IN.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "आपका बाहरी खाता अब अलग कर दिया गया है!", "alert.background_feed_refresh": "सभी फ़ीड्स पृष्ठभूमि में ताज़ा की जा रही हैं। जब यह प्रक्रिया चल रही हो, तो आप मिनीफ्लक्स का उपयोग जारी रख सकते हैं।", "alert.feed_error": "इस फ़ीड में एक समस्या है", - "alert.no_starred": "इस समय कोई बुकमार्क नहीं है", "alert.no_category": "कोई श्रेणी नहीं है।", "alert.no_category_entry": "इस श्रेणी में कोई विषय-वस्तु नहीं है।", "alert.no_feed": "आपके पास कोई सदस्यता नहीं है।", @@ -24,6 +23,7 @@ "alert.no_history": "इस समय कोई इतिहास नहीं है", "alert.no_search_result": "इस खोज के लिए कोई परिणाम नहीं हैं।", "alert.no_shared_entry": "कोई साझा प्रविष्टि नहीं है", + "alert.no_starred": "इस समय कोई बुकमार्क नहीं है", "alert.no_tag_entry": "इस टैग से मेल खाती कोई प्रविष्टियाँ नहीं हैं।", "alert.no_unread_entry": "कोई अपठित वस्तुत नहीं है।", "alert.no_user": "आप एकमात्र उपयोगकर्ता हैं।", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "गति 1x पर रीसेट करें", "enclosure_media_controls.speed.slower": "धीमा", "enclosure_media_controls.speed.slower.title": "%sx गुना धीमा", - "entry.starred.toast.off": "तारांकित न करे", - "entry.starred.toast.on": "तारांकित", - "entry.starred.toggle.off": "सितारा हटा दो", - "entry.starred.toggle.on": "सितारा दे", "entry.comments.label": "टिप्पणियाँ", "entry.comments.title": "टिप्पणियाँ देखे", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "विषयवस्तु साझा करें", "entry.shared_entry.label": "साझा करें", "entry.shared_entry.title": "सार्वजनिक लिंक खोले", + "entry.starred.toast.off": "तारांकित न करे", + "entry.starred.toast.on": "तारांकित", + "entry.starred.toggle.off": "सितारा हटा दो", + "entry.starred.toggle.on": "सितारा दे", "entry.state.loading": "लोड हो रहा है...", "entry.state.saving": "सहेजा जा रहा है...", "entry.status.mark_as_read": "पढ़े हुए का चिह्न", @@ -129,6 +129,7 @@ "error.invalid_site_url": "अमान्य साइट यूआरएल", "error.invalid_theme": "अमान्य थीम.", "error.invalid_timezone": "अमान्य समयक्षेत्र.", + "error.linktaco_missing_required_fields": "LinkTaco API Token और Organization Slug आवश्यक हैं", "error.network_operation": "Miniflux is not able to reach this website due to a network error: %v.", "error.network_timeout": "This website is too slow and the request timed out: %v", "error.password_min_length": "पासवर्ड में कम से कम 6 अक्षर होने चाहिए।", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "आपको एक पासवर्ड परिभाषित करना होगा अन्यथा आप फिर से लॉगिन नहीं कर पाएंगे।", "error.user_already_exists": "यह उपयोगकर्ता पहले से ही मौजूद है।", "error.user_mandatory_fields": "उपयोगकर्ता नाम अनिवार्य है।", - "error.linktaco_missing_required_fields": "LinkTaco API Token और Organization Slug आवश्यक हैं", "form.api_key.label.description": "एपीआई कुंजी लेबल", "form.category.hide_globally": "वैश्विक अपठित सूची में प्रविष्टियां छिपाएं", "form.category.label.title": "शीर्षक", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "टैग (अधिकतम 10, कॉमा से अलग किए गए)", "form.integration.linktaco_tags_hint": "अधिकतम 10 टैग, कॉमा से अलग किए गए", "form.integration.linktaco_visibility": "दृश्यता", - "form.integration.linktaco_visibility_public": "सार्वजनिक", - "form.integration.linktaco_visibility_private": "निजी", "form.integration.linktaco_visibility_hint": "निजी दृश्यता के लिए भुगतान LinkTaco खाता आवश्यक है", + "form.integration.linktaco_visibility_private": "निजी", + "form.integration.linktaco_visibility_public": "सार्वजनिक", "form.integration.linkwarden_activate": "Save entries to Linkwarden", "form.integration.linkwarden_api_key": "Linkwarden API key", "form.integration.linkwarden_endpoint": "लिंकवर्डन बेस यूआरएलL", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Global Feed Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Space separated list of external font hosts to allow. For example: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Read articles by opening external links", "form.prefs.label.categories_sorting_order": "श्रेणियाँ छँटाई", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "पेज नेविगेशन", "page.keyboard_shortcuts.subtitle.sections": "अनुभाग नेविगेशन", "page.keyboard_shortcuts.title": "कुंजीपटल अल्प मार्ग", - "page.keyboard_shortcuts.toggle_star_status": "बुकमार्क टॉगल करें", "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments", "page.keyboard_shortcuts.toggle_read_status_next": "पढ़ें/अपठित टॉगल करें, अगला फ़ोकस करें", "page.keyboard_shortcuts.toggle_read_status_prev": "पढ़ें/अपठित टॉगल करें, पिछला फ़ोकस करें", + "page.keyboard_shortcuts.toggle_star_status": "बुकमार्क टॉगल करें", "page.login.google_signin": "गूगल के साथ साइन इन करें", "page.login.oidc_signin": "ओपन-ईद के साथ साइन इन करें (%s)", "page.login.title": "साइन इन करें", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "कल", "tooltip.keyboard_shortcuts": "कुंजीपटल शॉर्टकट: %s", "tooltip.logged_user": "%s के रूप में लॉग इन किया" -} \ No newline at end of file +} diff --git a/internal/locale/translations/id_ID.json b/internal/locale/translations/id_ID.json index b4af4bbc8eb..6d0b25dde5b 100644 --- a/internal/locale/translations/id_ID.json +++ b/internal/locale/translations/id_ID.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Akun eksternal Anda sudah terputus!", "alert.background_feed_refresh": "Semua umpan sedang disegarkan di latar belakang. Anda bisa lanjut menggunakan Miniflux sembari proses ini berlanjut.", "alert.feed_error": "Ada masalah dengan umpan ini", - "alert.no_starred": "Tidak ada markah.", "alert.no_category": "Tidak ada kategori.", "alert.no_category_entry": "Tidak ada artikel di kategori ini.", "alert.no_feed": "Anda tidak memiliki langganan.", @@ -24,6 +23,7 @@ "alert.no_history": "Tidak ada riwayat untuk saat ini.", "alert.no_search_result": "Tidak ada hasil untuk pencarian ini.", "alert.no_shared_entry": "Tidak ada entri yang dibagikan.", + "alert.no_starred": "Tidak ada markah.", "alert.no_tag_entry": "Tidak ada entri yang cocok dengan tag ini.", "alert.no_unread_entry": "Belum ada artikel yang dibaca.", "alert.no_user": "Anda adalah satu-satunya pengguna.", @@ -45,10 +45,6 @@ "enclosure_media_controls.speed.reset.title": "Atur ulang ke 1x", "enclosure_media_controls.speed.slower": "Lebih lambat", "enclosure_media_controls.speed.slower.title": "Lebih lambat %sx", - "entry.starred.toast.off": "Batal Markahi", - "entry.starred.toast.on": "Markahi", - "entry.starred.toggle.off": "Batal Markahi", - "entry.starred.toggle.on": "Markahi", "entry.comments.label": "Komentar", "entry.comments.title": "Lihat Komentar", "entry.estimated_reading_time": [ @@ -66,6 +62,10 @@ "entry.share.title": "Bagikan artikel ini", "entry.shared_entry.label": "Bagikan", "entry.shared_entry.title": "Buka tautan publik", + "entry.starred.toast.off": "Batal Markahi", + "entry.starred.toast.on": "Markahi", + "entry.starred.toggle.off": "Batal Markahi", + "entry.starred.toggle.on": "Markahi", "entry.state.loading": "Memuat...", "entry.state.saving": "Menyimpan...", "entry.status.mark_as_read": "Telah dibaca", @@ -126,6 +126,7 @@ "error.invalid_site_url": "URL situs tidak valid.", "error.invalid_theme": "Tema tidak valid.", "error.invalid_timezone": "Zona waktu tidak valid.", + "error.linktaco_missing_required_fields": "LinkTaco API Token dan Organization Slug diperlukan", "error.network_operation": "Miniflux tidak dapat menjangkau situs ini dikarenakan galat jaringan: %v.", "error.network_timeout": "Situs ini terlalu lambat dan permintaan ke situs terlalu lama: %v", "error.password_min_length": "Kata sandi harus memiliki setidaknya 6 karakter.", @@ -157,7 +158,6 @@ "error.unlink_account_without_password": "Anda harus mengatur kata sandi atau Anda tidak bisa masuk kembali.", "error.user_already_exists": "Pengguna ini sudah ada.", "error.user_mandatory_fields": "Harus ada nama pengguna.", - "error.linktaco_missing_required_fields": "LinkTaco API Token dan Organization Slug diperlukan", "form.api_key.label.description": "Label Kunci API", "form.category.hide_globally": "Sembunyikan entri di daftar belum dibaca global", "form.category.label.title": "Judul", @@ -257,9 +257,9 @@ "form.integration.linktaco_tags": "Tag (maksimal 10, dipisahkan koma)", "form.integration.linktaco_tags_hint": "Maksimal 10 tag, dipisahkan koma", "form.integration.linktaco_visibility": "Visibilitas", - "form.integration.linktaco_visibility_public": "Publik", - "form.integration.linktaco_visibility_private": "Pribadi", "form.integration.linktaco_visibility_hint": "Visibilitas PRIBADI membutuhkan akun LinkTaco berbayar", + "form.integration.linktaco_visibility_private": "Pribadi", + "form.integration.linktaco_visibility_public": "Publik", "form.integration.linkwarden_activate": "Simpan artikel ke Linkwarden", "form.integration.linkwarden_api_key": "Kunci API Linkwarden", "form.integration.linkwarden_endpoint": "URL Dasar Linkwarden", @@ -338,8 +338,10 @@ "form.integration.webhook_url": "URL Webhook baku", "form.prefs.fieldset.application_settings": "Pengaturan Aplikasi", "form.prefs.fieldset.authentication_settings": "Pengaturan Autentikasi", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Pengaturan Umpan Global", "form.prefs.fieldset.reader_settings": "Pengaturan Pembaca", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Daftar yang dipisah spasi untuk peladen penyedia fonta eksternal yang diperbolehkan. Seperti: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Baca artikel dengan membuka tautan eksternal", "form.prefs.label.categories_sorting_order": "Pengurutan Kategori", @@ -515,10 +517,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navigasi Halaman", "page.keyboard_shortcuts.subtitle.sections": "Navigasi Bagian", "page.keyboard_shortcuts.title": "Pintasan Papan Tik", - "page.keyboard_shortcuts.toggle_star_status": "Ubah status markah", "page.keyboard_shortcuts.toggle_entry_attachments": "Buka/tutup lampiran entri", "page.keyboard_shortcuts.toggle_read_status_next": "Ubah status baca, fokus ke selanjutnya", "page.keyboard_shortcuts.toggle_read_status_prev": "Ubah status baca, fokus ke sebelumnya", + "page.keyboard_shortcuts.toggle_star_status": "Ubah status markah", "page.login.google_signin": "Masuk menggunakan Google", "page.login.oidc_signin": "Masuk menggunakan %s", "page.login.title": "Masuk", @@ -611,4 +613,4 @@ "time_elapsed.yesterday": "kemarin", "tooltip.keyboard_shortcuts": "Pintasan Papan Tik: %s", "tooltip.logged_user": "Masuk sebagai %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/it_IT.json b/internal/locale/translations/it_IT.json index 5ba305fc37f..915e961840d 100644 --- a/internal/locale/translations/it_IT.json +++ b/internal/locale/translations/it_IT.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Il tuo account esterno ora è scollegato!", "alert.background_feed_refresh": "Tutti i feed vengono aggiornati in background. Puoi continuare a usare Miniflux mentre questo processo è in esecuzione.", "alert.feed_error": "Sembra ci sia un problema con questo feed", - "alert.no_starred": "Nessun preferito disponibile.", "alert.no_category": "Nessuna categoria disponibile.", "alert.no_category_entry": "Questa categoria non contiene alcun articolo.", "alert.no_feed": "Nessun feed disponibile.", @@ -24,6 +23,7 @@ "alert.no_history": "La tua cronologia al momento è vuota.", "alert.no_search_result": "La ricerca non ha prodotto risultati.", "alert.no_shared_entry": "Non ci sono voci condivise.", + "alert.no_starred": "Nessun preferito disponibile.", "alert.no_tag_entry": "Non ci sono voci corrispondenti a questo tag.", "alert.no_unread_entry": "Nessun articolo da leggere.", "alert.no_user": "Tu sei l'unico utente.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Reimposta velocità a 1x", "enclosure_media_controls.speed.slower": "Più lento", "enclosure_media_controls.speed.slower.title": "Più lento di %sx", - "entry.starred.toast.off": "Non preferito", - "entry.starred.toast.on": "Preferito", - "entry.starred.toggle.off": "Rimuovi dai preferiti", - "entry.starred.toggle.on": "Aggiungi ai preferiti", "entry.comments.label": "Commenti", "entry.comments.title": "Mostra i commenti", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Condividi questo articolo", "entry.shared_entry.label": "Condivisione", "entry.shared_entry.title": "Apri il link pubblico", + "entry.starred.toast.off": "Non preferito", + "entry.starred.toast.on": "Preferito", + "entry.starred.toggle.off": "Rimuovi dai preferiti", + "entry.starred.toggle.on": "Aggiungi ai preferiti", "entry.state.loading": "Caricamento in corso...", "entry.state.saving": "Salvataggio in corso...", "entry.status.mark_as_read": "Segna come letto", @@ -129,6 +129,7 @@ "error.invalid_site_url": "URL del sito non valido.", "error.invalid_theme": "Tema non valido.", "error.invalid_timezone": "Fuso orario non valido.", + "error.linktaco_missing_required_fields": "LinkTaco API Token e Organization Slug sono richiesti", "error.network_operation": "Miniflux non riesce a raggiungere questo sito web a causa di un errore di rete: %v.", "error.network_timeout": "Questo sito web è troppo lento e la richiesta è scaduta: %v", "error.password_min_length": "La password deve contenere almeno 6 caratteri.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Devi scegliere una password altrimenti la prossima volta non riuscirai ad accedere.", "error.user_already_exists": "Questo utente esiste già.", "error.user_mandatory_fields": "Il nome utente è obbligatorio.", - "error.linktaco_missing_required_fields": "LinkTaco API Token e Organization Slug sono richiesti", "form.api_key.label.description": "Etichetta chiave API", "form.category.hide_globally": "Nascondere le voci nella lista globale dei non letti", "form.category.label.title": "Titolo", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tag (massimo 10, separati da virgola)", "form.integration.linktaco_tags_hint": "Massimo 10 tag, separati da virgola", "form.integration.linktaco_visibility": "Visibilità", - "form.integration.linktaco_visibility_public": "Pubblico", - "form.integration.linktaco_visibility_private": "Privato", "form.integration.linktaco_visibility_hint": "La visibilità PRIVATA richiede un account LinkTaco a pagamento", + "form.integration.linktaco_visibility_private": "Privato", + "form.integration.linktaco_visibility_public": "Pubblico", "form.integration.linkwarden_activate": "Salva gli articoli su Linkwarden", "form.integration.linkwarden_api_key": "API key dell'account Linkwarden", "form.integration.linkwarden_endpoint": "URL di base di Linkwarden", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Global Feed Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Space separated list of external font hosts to allow. For example: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Read articles by opening external links", "form.prefs.label.categories_sorting_order": "Ordinamento delle categorie", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navigazione pagine", "page.keyboard_shortcuts.subtitle.sections": "Navigazione sezioni", "page.keyboard_shortcuts.title": "Scorciatoie da tastiera", - "page.keyboard_shortcuts.toggle_star_status": "Aggiungi/rimuovi dai preferiti", "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments", "page.keyboard_shortcuts.toggle_read_status_next": "Cambia lo stato di lettura (letto/da leggere), concentrati dopo", "page.keyboard_shortcuts.toggle_read_status_prev": "Cambia lo stato di lettura (letto/da leggere), focus precedente", + "page.keyboard_shortcuts.toggle_star_status": "Aggiungi/rimuovi dai preferiti", "page.login.google_signin": "Accedi tramite Google", "page.login.oidc_signin": "Accedi tramite %s", "page.login.title": "Accedi", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "ieri", "tooltip.keyboard_shortcuts": "Scorciatoia da tastiera: %s", "tooltip.logged_user": "Autenticato come %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/ja_JP.json b/internal/locale/translations/ja_JP.json index cb951369df1..d0ee3188a75 100644 --- a/internal/locale/translations/ja_JP.json +++ b/internal/locale/translations/ja_JP.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "外部アカウントとのリンクが解除されました!", "alert.background_feed_refresh": "すべてのフィードがバックグラウンドで更新されています。この処理中も Miniflux を使い続けることができます。", "alert.feed_error": "このフィードには問題があります。", - "alert.no_starred": "現在星付きはありません。", "alert.no_category": "カテゴリが存在しません。", "alert.no_category_entry": "このカテゴリには記事がありません。", "alert.no_feed": "何も購読していません。", @@ -24,6 +23,7 @@ "alert.no_history": "現在履歴はありません。", "alert.no_search_result": "検索で何も見つかりませんでした。", "alert.no_shared_entry": "共有エントリはありません。", + "alert.no_starred": "現在星付きはありません。", "alert.no_tag_entry": "このタグに一致するエントリーはありません。", "alert.no_unread_entry": "未読の記事はありません。", "alert.no_user": "あなたが唯一のユーザーです。", @@ -45,10 +45,6 @@ "enclosure_media_controls.speed.reset.title": "速度を1xにリセット", "enclosure_media_controls.speed.slower": "遅く", "enclosure_media_controls.speed.slower.title": "%sx 遅く", - "entry.starred.toast.off": "星を外しました", - "entry.starred.toast.on": "星を付けました", - "entry.starred.toggle.off": "星を外す", - "entry.starred.toggle.on": "星を付ける", "entry.comments.label": "コメント", "entry.comments.title": "コメントを見る", "entry.estimated_reading_time": [ @@ -66,6 +62,10 @@ "entry.share.title": "この記事を共有する", "entry.shared_entry.label": "共有する", "entry.shared_entry.title": "公開リンクを開く", + "entry.starred.toast.off": "星を外しました", + "entry.starred.toast.on": "星を付けました", + "entry.starred.toggle.off": "星を外す", + "entry.starred.toggle.on": "星を付ける", "entry.state.loading": "読み込み中…", "entry.state.saving": "保存中…", "entry.status.mark_as_read": "既読にする", @@ -126,6 +126,7 @@ "error.invalid_site_url": "サイト URL が無効です。", "error.invalid_theme": "テーマが無効です。", "error.invalid_timezone": "タイムゾーンが無効です。", + "error.linktaco_missing_required_fields": "LinkTaco API TokenとOrganization Slugが必要です", "error.network_operation": "Miniflux はネットワークエラーのためこのウェブサイトに到達できません: %v.", "error.network_timeout": "このウェブサイトは応答が遅すぎるためタイムアウトしました: %v", "error.password_min_length": "パスワードは6文字以上である必要があります。", @@ -157,7 +158,6 @@ "error.unlink_account_without_password": "パスワードを設定しなければ再びログインすることはできません。", "error.user_already_exists": "このユーザーは既に存在します。", "error.user_mandatory_fields": "ユーザー名が必要です。", - "error.linktaco_missing_required_fields": "LinkTaco API TokenとOrganization Slugが必要です", "form.api_key.label.description": "API キーラベル", "form.category.hide_globally": "未読一覧に記事を表示しない", "form.category.label.title": "タイトル", @@ -257,9 +257,9 @@ "form.integration.linktaco_tags": "タグ (最大10件、カンマ区切り)", "form.integration.linktaco_tags_hint": "最大10件のタグ、カンマ区切り", "form.integration.linktaco_visibility": "公開設定", - "form.integration.linktaco_visibility_public": "公開", - "form.integration.linktaco_visibility_private": "非公開", "form.integration.linktaco_visibility_hint": "非公開設定には有料のLinkTacoアカウントが必要です", + "form.integration.linktaco_visibility_private": "非公開", + "form.integration.linktaco_visibility_public": "公開", "form.integration.linkwarden_activate": "Linkwarden に記事を保存する", "form.integration.linkwarden_api_key": "Linkwarden の API key", "form.integration.linkwarden_endpoint": "リンクワーデン ベース URL", @@ -338,8 +338,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Global Feed Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Space separated list of external font hosts to allow. For example: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Read articles by opening external links", "form.prefs.label.categories_sorting_order": "カテゴリの表示順", @@ -515,10 +517,10 @@ "page.keyboard_shortcuts.subtitle.pages": "ページ間を移動する", "page.keyboard_shortcuts.subtitle.sections": "セクションを移動する", "page.keyboard_shortcuts.title": "キーボードショートカット", - "page.keyboard_shortcuts.toggle_star_status": "星を付ける/外す", "page.keyboard_shortcuts.toggle_entry_attachments": "添付ファイルを開く/閉じる", "page.keyboard_shortcuts.toggle_read_status_next": "既読/未読を切り替えて次のアイテムに移動", "page.keyboard_shortcuts.toggle_read_status_prev": "既読/未読を切り替えて前のアイテムに移動", + "page.keyboard_shortcuts.toggle_star_status": "星を付ける/外す", "page.login.google_signin": "Google アカウントでログイン", "page.login.oidc_signin": "%s アカウントでログイン", "page.login.title": "ログイン", @@ -611,4 +613,4 @@ "time_elapsed.yesterday": "昨日", "tooltip.keyboard_shortcuts": "キーボードショートカット: %s", "tooltip.logged_user": "%s としてログイン中" -} \ No newline at end of file +} diff --git a/internal/locale/translations/nan_Latn_pehoeji.json b/internal/locale/translations/nan_Latn_pehoeji.json index 473b04fac4e..0e0b4b27aa3 100644 --- a/internal/locale/translations/nan_Latn_pehoeji.json +++ b/internal/locale/translations/nan_Latn_pehoeji.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Kah lí ê gōa-pō͘ kháu-chō ê kiat í-keng phah khui--ah!", "alert.background_feed_refresh": "Tng leh pōe-āu ōaⁿ-sin só͘-ū siau-sit lâi-goân, lí ē-sái kè-sio̍k sú-iōng Miniflux。", "alert.feed_error": "Chit ê siau-sit lâi-goân ū būn-tôe", - "alert.no_starred": "Chit-má ah bô siu-chông", "alert.no_category": "Chit-má ah bô lūi-pia̍t", "alert.no_category_entry": "Chit ê lūi-pah ah bô siau-sit", "alert.no_feed": "Chit-má ah bô siau-sit lâi-goân", @@ -24,6 +23,7 @@ "alert.no_history": "Chit-má ah bô kì-lo̍k", "alert.no_search_result": "Bô hû-ha̍p ê chhiau-chhē kiat-kó", "alert.no_shared_entry": "Chit-má ah bô hun-hióng ê siau-sit", + "alert.no_starred": "Chit-má ah bô siu-chông", "alert.no_tag_entry": "Bô kah chit ê khan-á ū hû-ha̍p ê siau-sit", "alert.no_unread_entry": "Chit-má ah-bô tha̍k kè ê siau-sit", "alert.no_user": "Lí sī ûi-it ê sú-iōng-lâng", @@ -45,10 +45,6 @@ "enclosure_media_controls.speed.reset.title": "Têng siat-tēng pàng ê sok-tō͘ chòe 1x", "enclosure_media_controls.speed.slower": "Pàng bān", "enclosure_media_controls.speed.slower.title": "Pàng bān %sx", - "entry.starred.toast.off": "Chhú-siau siu-chông chòe soah", - "entry.starred.toast.on": "Sin cheng-ka siu-chông chòe soah", - "entry.starred.toggle.off": "Chhú-siau siu-chông", - "entry.starred.toggle.on": "Siu-chông khí-lâi", "entry.comments.label": "Hôe-èng", "entry.comments.title": "Khòaⁿ hôe-èng", "entry.estimated_reading_time": [ @@ -66,6 +62,10 @@ "entry.share.title": "Hun-hióng chit ê siau-sit", "entry.shared_entry.label": "Hun-hióng", "entry.shared_entry.title": "Phah khui kong-khai ê liân-kiat", + "entry.starred.toast.off": "Chhú-siau siu-chông chòe soah", + "entry.starred.toast.on": "Sin cheng-ka siu-chông chòe soah", + "entry.starred.toggle.off": "Chhú-siau siu-chông", + "entry.starred.toggle.on": "Siu-chông khí-lâi", "entry.state.loading": "Tng leh chip-hêng…", "entry.state.saving": "Tng leh pó-chûn…", "entry.status.mark_as_read": "Chù chòe tha̍k kè", @@ -126,6 +126,7 @@ "error.invalid_site_url": "Siau-sit lâi-goân ê bāng-chām ê bāng-chí ū būn-tôe.", "error.invalid_theme": "Ū būn-tôe ê chú-tôe.", "error.invalid_timezone": "Ū būn-tôe ê sî-khu.", + "error.linktaco_missing_required_fields": "LinkTaco API Token kâh Organization Slug sio̍kêi", "error.network_operation": "Miniflux bô-hoat-tō͘ liân kàu chit ê bāng-chām, ū khó-lêng sī bāng-lō͘ būn-tôe: %v.", "error.network_timeout": "Chit ê bāng-chām ê hôe-èng siuⁿ bān, chhéng-kiû chhiau-kè sî-kan: %v.", "error.password_min_length": "Chhiáⁿ chì-chió ài su-li̍p la̍k ê lī goân.", @@ -157,7 +158,6 @@ "error.unlink_account_without_password": "Lí it-tēng ài siat-tēng bi̍t-bé, bô lí ē bô-hoat-tō͘ koh teng-lo̍k.", "error.user_already_exists": "Chit ê sú-iōng-lâng í-keng chûn-chāi.", "error.user_mandatory_fields": "Tio̍h-ài su-li̍p kháu-chō miâ", - "error.linktaco_missing_required_fields": "LinkTaco API Token kâh Organization Slug sio̍kêi", "form.api_key.label.description": "API só-sîkhan-á", "form.category.hide_globally": "Mài hián-sī siau-sit tī choân-he̍k ah-bōe tha̍k lia̍t-pió lāi", "form.category.label.title": "Piau-tôe", @@ -257,9 +257,9 @@ "form.integration.linktaco_tags": "khan-á (siōn-koân 10, iōng tō͘-tiám keh khui)", "form.integration.linktaco_tags_hint": "Siōn-koân 10 khan-á, iōng tō͘-tiám keh khui", "form.integration.linktaco_visibility": "Kò-chhiah-kì sìa?", - "form.integration.linktaco_visibility_public": "Kò-chhiah-kì", - "form.integration.linktaco_visibility_private": "Su-lîn", "form.integration.linktaco_visibility_hint": "Su-lîn sìa tík tio̍h-ài chù-hêng LinkTaco kháu-chō", + "form.integration.linktaco_visibility_private": "Su-lîn", + "form.integration.linktaco_visibility_public": "Kò-chhiah-kì", "form.integration.linkwarden_activate": "Pó-chûn siau-sit kàu Linkwarden", "form.integration.linkwarden_api_key": "Linkwarden API só-sî", "form.integration.linkwarden_endpoint": "Linkwarden Base URL", @@ -338,8 +338,10 @@ "form.integration.webhook_url": "Default Webhook bāng-chí", "form.prefs.fieldset.application_settings": "Èng-iōng thêng-sek siat-tēng", "form.prefs.fieldset.authentication_settings": "Sú-iōng-lâng giām-chèng siat-tēng", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Choân-he̍k siau-sit lâi-goân siat-tēng", "form.prefs.fieldset.reader_settings": "Ia̍t-tha̍k khì siat-tēng", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Iōng khang-keh keh khui ún-chún ê gōa-pō͘ lī-hêng lâi-goân. Phì-lû \"fonts.gstatic.com fonts.googleapis.com\"", "form.prefs.label.always_open_external_links": "Chhiau-chhē bûn-chiong sī iōng gōa-pō͘ liân-kiat phah khui", "form.prefs.label.categories_sorting_order": "Lūi-pia̍t hián-sī sūn-sū", @@ -515,10 +517,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Ia̍h bīn tō-lám", "page.keyboard_shortcuts.subtitle.sections": "Hun lân tō-lám", "page.keyboard_shortcuts.title": "Khoài-sok khí", - "page.keyboard_shortcuts.toggle_star_status": "Chhet-li̍p siu-chông chōng-thài", "page.keyboard_shortcuts.toggle_entry_attachments": "Chhet-li̍p thián khui kah siu-ha̍p siau-sit hù-kiāⁿ ê chōng-thài", "page.keyboard_shortcuts.toggle_read_status_next": "Chhet-li̍p tha̍k--kè, ah-bōe tha̍k ê chōng-thài, koh chiau-tiám tī āu-chi̍t--ê", "page.keyboard_shortcuts.toggle_read_status_prev": "Chhet-li̍p tha̍k--kè, ah-bōe tha̍k ê chōng-thài, koh chiau-tiám tī téng-chi̍t--ê", + "page.keyboard_shortcuts.toggle_star_status": "Chhet-li̍p siu-chông chōng-thài", "page.login.google_signin": "Sú-iōng Google teng-lo̍k", "page.login.oidc_signin": "Sú-iōng %s teng-lo̍k", "page.login.title": "teng-lo̍k", diff --git a/internal/locale/translations/nl_NL.json b/internal/locale/translations/nl_NL.json index 5a12151dc1c..ce961df2315 100644 --- a/internal/locale/translations/nl_NL.json +++ b/internal/locale/translations/nl_NL.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Jouw externe account is nu ontkoppeld!", "alert.background_feed_refresh": "Alle feeds worden op de achtergrond vernieuwd. Je kunt Miniflux blijven gebruiker terwijl dit proces draait.", "alert.feed_error": "Er is een probleem met deze feed", - "alert.no_starred": "Er zijn geen favorieten.", "alert.no_category": "Er zijn geen categorieën.", "alert.no_category_entry": "Er zijn geen artikelen in deze categorie.", "alert.no_feed": "Je hebt nog geen feed geabonneerd.", @@ -24,6 +23,7 @@ "alert.no_history": "Geschiedenis is op dit moment leeg.", "alert.no_search_result": "Er is geen resultaat voor deze zoekopdracht.", "alert.no_shared_entry": "Er is geen gedeeld artikel.", + "alert.no_starred": "Er zijn geen favorieten.", "alert.no_tag_entry": "Er zijn geen artikelen die overeenkomen met deze tag.", "alert.no_unread_entry": "Er zijn geen ongelezen artikelen.", "alert.no_user": "Je bent de enige gebruiker.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Reset snelheid naar 1x", "enclosure_media_controls.speed.slower": "Vertraag", "enclosure_media_controls.speed.slower.title": "Vertraag met %sx", - "entry.starred.toast.off": "Favoriet verwijderd", - "entry.starred.toast.on": "Favoriet toegevoegd", - "entry.starred.toggle.off": "Favoriet verwijderen", - "entry.starred.toggle.on": "Favoriet", "entry.comments.label": "Reacties", "entry.comments.title": "Bekijk reacties", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Deel dit artikel", "entry.shared_entry.label": "Delen", "entry.shared_entry.title": "Open de openbare link", + "entry.starred.toast.off": "Favoriet verwijderd", + "entry.starred.toast.on": "Favoriet toegevoegd", + "entry.starred.toggle.off": "Favoriet verwijderen", + "entry.starred.toggle.on": "Favoriet", "entry.state.loading": "Laden...", "entry.state.saving": "Opslaan...", "entry.status.mark_as_read": "Markeren als gelezen", @@ -129,6 +129,7 @@ "error.invalid_site_url": "Ongeldige site URL.", "error.invalid_theme": "Ongeldig thema.", "error.invalid_timezone": "Ongeldige tijdzone.", + "error.linktaco_missing_required_fields": "LinkTaco API Token en Organization Slug zijn verplicht", "error.network_operation": "Miniflux kan deze website niet bereiken vanwege een netwerkfout: %v.", "error.network_timeout": "Deze website is te traag en de aanvraag gaf timeout: %v", "error.password_min_length": "Minimaal 6 tekens gebruiken.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Je moet een wachtwoord opgeven anders kun je niet meer inloggen.", "error.user_already_exists": "Deze gebruiker bestaat al.", "error.user_mandatory_fields": "Gebruikersnaam is verplicht", - "error.linktaco_missing_required_fields": "LinkTaco API Token en Organization Slug zijn verplicht", "form.api_key.label.description": "API-sleutel omschrijving", "form.category.hide_globally": "Verberg artikelen in de globale ongelezen lijst", "form.category.label.title": "Titel", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tags (max 10, kommagescheiden)", "form.integration.linktaco_tags_hint": "Maximaal 10 tags, kommagescheiden", "form.integration.linktaco_visibility": "Zichtbaarheid", - "form.integration.linktaco_visibility_public": "Openbaar", - "form.integration.linktaco_visibility_private": "Privé", "form.integration.linktaco_visibility_hint": "PRIVÉ zichtbaarheid vereist een betaald LinkTaco account", + "form.integration.linktaco_visibility_private": "Privé", + "form.integration.linktaco_visibility_public": "Openbaar", "form.integration.linkwarden_activate": "Artikelen opslaan in Linkwarden", "form.integration.linkwarden_api_key": "Linkwarden API-sleutel", "form.integration.linkwarden_endpoint": "Linkwarden Basis URL", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Standard Webhook URL", "form.prefs.fieldset.application_settings": "Applicatie Instellingen", "form.prefs.fieldset.authentication_settings": "Authenticatie Instellingen", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Globale Feed Instellingen", "form.prefs.fieldset.reader_settings": "Lees Instellingen", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Spatiegescheiden lijst van externe font-hosts die zijn toegestaan. Bijvoorbeeld: 'fonts.gstatic.com fonts.googleapis.com'.", "form.prefs.label.always_open_external_links": "Lees artikelen door externe links te openen", "form.prefs.label.categories_sorting_order": "Volgorde categorieën", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navigeren door pagina's", "page.keyboard_shortcuts.subtitle.sections": "Navigeren door menu's", "page.keyboard_shortcuts.title": "Sneltoetsen", - "page.keyboard_shortcuts.toggle_star_status": "Favoriet toevoegen/verwijderen", "page.keyboard_shortcuts.toggle_entry_attachments": "Bijlagen van artikel openen/sluiten", "page.keyboard_shortcuts.toggle_read_status_next": "Markeer gelezen/ongelezen, focus volgende", "page.keyboard_shortcuts.toggle_read_status_prev": "Markeer gelezen/ongelezen, focus vorige", + "page.keyboard_shortcuts.toggle_star_status": "Favoriet toevoegen/verwijderen", "page.login.google_signin": "Inloggen met Google", "page.login.oidc_signin": "Inloggen met %s", "page.login.title": "Inloggen", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "gisteren", "tooltip.keyboard_shortcuts": "Sneltoets: %s", "tooltip.logged_user": "Ingelogd als %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/pl_PL.json b/internal/locale/translations/pl_PL.json index b0d90999225..499b5c5aac4 100644 --- a/internal/locale/translations/pl_PL.json +++ b/internal/locale/translations/pl_PL.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Twoje konto zewnętrzne jest teraz zdysocjowane!", "alert.background_feed_refresh": "Wszystkie kanały są odświeżane w tle. Możesz kontynuować korzystanie z Miniflux podczas trwania tego procesu.", "alert.feed_error": "Z tym kanałem jest problem", - "alert.no_starred": "Brak ulubionych w tej chwili.", "alert.no_category": "Brak kategorii!", "alert.no_category_entry": "Brak wpisów w tej kategorii", "alert.no_feed": "Nie masz żadnej subskrypcji.", @@ -24,6 +23,7 @@ "alert.no_history": "Obecnie nie ma żadnej historii.", "alert.no_search_result": "Brak wyników tego wyszukiwania.", "alert.no_shared_entry": "Brak udostępnionego wpisu.", + "alert.no_starred": "Brak ulubionych w tej chwili.", "alert.no_tag_entry": "Brak wpisów pasujących do tego znacznika.", "alert.no_unread_entry": "Nie ma żadnych nieprzeczytanych wpisów.", "alert.no_user": "Jesteś jedynym użytkownikiem.", @@ -47,10 +47,6 @@ "enclosure_media_controls.speed.reset.title": "Przywróć szybkość do 1x", "enclosure_media_controls.speed.slower": "Wolniej", "enclosure_media_controls.speed.slower.title": "Wolniej o %sx", - "entry.starred.toast.off": "Usunięto z ulubionych", - "entry.starred.toast.on": "Dodano do ulubionych", - "entry.starred.toggle.off": "Usuń z ulubionych", - "entry.starred.toggle.on": "Dodaj do ulubionych", "entry.comments.label": "Komentarze", "entry.comments.title": "Zobacz komentarze", "entry.estimated_reading_time": [ @@ -70,6 +66,10 @@ "entry.share.title": "Udostępnij ten wpis", "entry.shared_entry.label": "Udostępnij", "entry.shared_entry.title": "Otwórz publiczne łącze", + "entry.starred.toast.off": "Usunięto z ulubionych", + "entry.starred.toast.on": "Dodano do ulubionych", + "entry.starred.toggle.off": "Usuń z ulubionych", + "entry.starred.toggle.on": "Dodaj do ulubionych", "entry.state.loading": "Ładowanie…", "entry.state.saving": "Zapisywanie…", "entry.status.mark_as_read": "Oznacz jako przeczytany", @@ -132,6 +132,7 @@ "error.invalid_site_url": "Nieprawidłowy adres URL witryny.", "error.invalid_theme": "Nieprawidłowy motyw.", "error.invalid_timezone": "Nieprawidłowa strefa czasowa.", + "error.linktaco_missing_required_fields": "Token API LinkTaco i ślimak organizacji są wymagane", "error.network_operation": "Miniflux nie może połączyć się z tą witryną z powodu błędu sieci: %v.", "error.network_timeout": "Ta witryna internetowa jest zbyt wolna i upłynął limit czasu żądania: %v", "error.password_min_length": "Musisz użyć co najmniej 6 znaków.", @@ -163,7 +164,6 @@ "error.unlink_account_without_password": "Musisz zdefiniować hasło, inaczej nie będziesz mógł się ponownie zalogować.", "error.user_already_exists": "Ten użytkownik już istnieje.", "error.user_mandatory_fields": "Nazwa użytkownika jest obowiązkowa.", - "error.linktaco_missing_required_fields": "Token API LinkTaco i ślimak organizacji są wymagane", "form.api_key.label.description": "Etykieta klucza API", "form.category.hide_globally": "Ukryj wpisy na globalnej liście nieprzeczytanych", "form.category.label.title": "Tytuł", @@ -263,9 +263,9 @@ "form.integration.linktaco_tags": "Znaczniki (maks. 10, oddzielone przecinkami)", "form.integration.linktaco_tags_hint": "Maksymalnie 10 znaczników, oddzielone przecinkami", "form.integration.linktaco_visibility": "Widoczność", - "form.integration.linktaco_visibility_public": "Publiczne", - "form.integration.linktaco_visibility_private": "Prywatne", "form.integration.linktaco_visibility_hint": "Widoczność PRYWATNE wymaga płatnego konta LinkTaco", + "form.integration.linktaco_visibility_private": "Prywatne", + "form.integration.linktaco_visibility_public": "Publiczne", "form.integration.linkwarden_activate": "Zapisuj wpisy w Linkwarden", "form.integration.linkwarden_api_key": "Klucz API do Linkwarden", "form.integration.linkwarden_endpoint": "Podstawowy adres URL Linkwarden", @@ -344,8 +344,10 @@ "form.integration.webhook_url": "Domyślny adres URL webhooka", "form.prefs.fieldset.application_settings": "Ustawienia aplikacji", "form.prefs.fieldset.authentication_settings": "Ustawienia uwierzytelniania", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Globalne ustawienia kanałów", "form.prefs.fieldset.reader_settings": "Ustawienia czytnika", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Lista hostów zewnętrznych czcionek, na które należy zezwolić, rozdzielona spacjami. Na przykład: „fonts.gstatic.com fonts.googleapis.com”.", "form.prefs.label.always_open_external_links": "Czytaj artykuły, otwierając łącza zewnętrzne", "form.prefs.label.categories_sorting_order": "Sortowanie kategorii", @@ -527,10 +529,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Nawigacja między stronami", "page.keyboard_shortcuts.subtitle.sections": "Nawigacja między punktami menu", "page.keyboard_shortcuts.title": "Skróty klawiszowe", - "page.keyboard_shortcuts.toggle_star_status": "Przełącz dodanie do ulubionych", "page.keyboard_shortcuts.toggle_entry_attachments": "Przełącz otwieranie/zamykanie załączników wpisów", "page.keyboard_shortcuts.toggle_read_status_next": "Przełącz przeczytane/nieprzeczytane, przejdź dalej", "page.keyboard_shortcuts.toggle_read_status_prev": "Przełącz przeczytane/nieprzeczytane, przejdź wstecz", + "page.keyboard_shortcuts.toggle_star_status": "Przełącz dodanie do ulubionych", "page.login.google_signin": "Zaloguj się przez Google", "page.login.oidc_signin": "Zaloguj się przez %s", "page.login.title": "Zaloguj się", @@ -647,4 +649,4 @@ "time_elapsed.yesterday": "wczoraj", "tooltip.keyboard_shortcuts": "Skróty klawiszowe: %s", "tooltip.logged_user": "Zalogowany jako %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/pt_BR.json b/internal/locale/translations/pt_BR.json index a77aed6b6e3..811fe97117c 100644 --- a/internal/locale/translations/pt_BR.json +++ b/internal/locale/translations/pt_BR.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Sua conta externa está desvinculada!", "alert.background_feed_refresh": "Todas as fontes estão sendo atualizadas em segundo plano. Você pode continuar usando o Miniflux enquanto este processo está em execução.", "alert.feed_error": "Ocorreu um problema com esta fonte.", - "alert.no_starred": "Não há favorito neste momento.", "alert.no_category": "Não há categoria.", "alert.no_category_entry": "Não há itens nesta categoria.", "alert.no_feed": "Não há inscrições.", @@ -24,6 +23,7 @@ "alert.no_history": "Não há histórico nesse momento.", "alert.no_search_result": "Não há resultados para essa busca.", "alert.no_shared_entry": "Não há itens compartilhados.", + "alert.no_starred": "Não há favorito neste momento.", "alert.no_tag_entry": "Não há itens que correspondam a esta etiqueta.", "alert.no_unread_entry": "Não há itens não lidos.", "alert.no_user": "Você é o único usuário.", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Resetar velocidade para 1x", "enclosure_media_controls.speed.slower": "Mais Lento", "enclosure_media_controls.speed.slower.title": "Mais lento em %sx", - "entry.starred.toast.off": "Desfavoritado", - "entry.starred.toast.on": "Favoritado", - "entry.starred.toggle.off": "Remover dos Favoritos", - "entry.starred.toggle.on": "Favoritar", "entry.comments.label": "Comentários", "entry.comments.title": "Ver comentários", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Compartilhar esse item", "entry.shared_entry.label": "Compartilhar", "entry.shared_entry.title": "Abrir link público", + "entry.starred.toast.off": "Desfavoritado", + "entry.starred.toast.on": "Favoritado", + "entry.starred.toggle.off": "Remover dos Favoritos", + "entry.starred.toggle.on": "Favoritar", "entry.state.loading": "Carregando...", "entry.state.saving": "Salvando...", "entry.status.mark_as_read": "Marcar como lido", @@ -129,6 +129,7 @@ "error.invalid_site_url": "URL de site inválido.", "error.invalid_theme": "Tema inválido.", "error.invalid_timezone": "Fuso horário inválido.", + "error.linktaco_missing_required_fields": "LinkTaco API Token e Organization Slug são obrigatórios", "error.network_operation": "O Miniflux não conseguiu acessar este site devido a um erro de rede: %v.", "error.network_timeout": "Este site está muito lento e a solicitação expirou: %v", "error.password_min_length": "A senha deve ter no mínimo 6 caracteres.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Você deve definir uma senha, senão não será possível efetuar a sessão novamente.", "error.user_already_exists": "Esse usuário já existe.", "error.user_mandatory_fields": "O nome de usuário é obrigatório.", - "error.linktaco_missing_required_fields": "LinkTaco API Token e Organization Slug são obrigatórios", "form.api_key.label.description": "Etiqueta da chave de API", "form.category.hide_globally": "Ocultar entradas na lista global não lida", "form.category.label.title": "Título", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Tags (máx 10, separadas por vírgula)", "form.integration.linktaco_tags_hint": "Máximo 10 tags, separadas por vírgula", "form.integration.linktaco_visibility": "Visibilidade", - "form.integration.linktaco_visibility_public": "Público", - "form.integration.linktaco_visibility_private": "Privado", "form.integration.linktaco_visibility_hint": "Visibilidade PRIVADA requer uma conta LinkTaco paga", + "form.integration.linktaco_visibility_private": "Privado", + "form.integration.linktaco_visibility_public": "Público", "form.integration.linkwarden_activate": "Salvar itens no Linkwarden", "form.integration.linkwarden_api_key": "Chave de API do Linkwarden", "form.integration.linkwarden_endpoint": "URL base do Linkwarden", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Configurações do aplicativo", "form.prefs.fieldset.authentication_settings": "Configurações de autenticação", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Configurações globais de fontes", "form.prefs.fieldset.reader_settings": "Configurações do leitor", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Lista separada por espaço de hosts de fontes externas permitidos. Por exemplo: 'fonts.gstatic.com fonts.googleapis.com'.", "form.prefs.label.always_open_external_links": "Ler artigos abrindo links externos", "form.prefs.label.categories_sorting_order": "Classificação das categorias", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navegação de páginas", "page.keyboard_shortcuts.subtitle.sections": "Navegação de seções", "page.keyboard_shortcuts.title": "Atalhos de teclado", - "page.keyboard_shortcuts.toggle_star_status": "Marcar ou desmarcar como favorito", "page.keyboard_shortcuts.toggle_entry_attachments": "Alternar abrir/fechar anexos do item", "page.keyboard_shortcuts.toggle_read_status_next": "Inverter estado de leitura do item, focar próximo item", "page.keyboard_shortcuts.toggle_read_status_prev": "Inverter estado de leitura do item, focar item anterior", + "page.keyboard_shortcuts.toggle_star_status": "Marcar ou desmarcar como favorito", "page.login.google_signin": "Iniciar Sessão com sua conta do Google", "page.login.oidc_signin": "Iniciar Sessão com sua conta do %s", "page.login.title": "Iniciar Sessão", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "ontem", "tooltip.keyboard_shortcuts": "Atalho do teclado: %s", "tooltip.logged_user": "Autenticado como %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/ro_RO.json b/internal/locale/translations/ro_RO.json index fbd9bcf62e1..ffe9195d3d8 100644 --- a/internal/locale/translations/ro_RO.json +++ b/internal/locale/translations/ro_RO.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Am decuplat contul dvs. extern!", "alert.background_feed_refresh": "Toate fluxurile sunt actualizate în fundal. Puteți să continuați utilizarea Miniflux în timp ce procesul rulează.", "alert.feed_error": "Este o problemă cu acest flux", - "alert.no_starred": "Nu sunt înregistrări marcate.", "alert.no_category": "Nu sunt categorii.", "alert.no_category_entry": "Nu sunt înregistrări în această categorie.", "alert.no_feed": "Nu aveți fluxuri.", @@ -24,6 +23,7 @@ "alert.no_history": "Nu există istoric în acest moment.", "alert.no_search_result": "Nu există înregistrări pentru această căutare.", "alert.no_shared_entry": "Nu sunt înregistrări partajate.", + "alert.no_starred": "Nu sunt înregistrări marcate.", "alert.no_tag_entry": "Nu sunt înregistrări pentru această etichetă.", "alert.no_unread_entry": "Nu sunt intrări necitite.", "alert.no_user": "Sunteți singurul utilizator.", @@ -47,10 +47,6 @@ "enclosure_media_controls.speed.reset.title": "Resetare viteză la 1x", "enclosure_media_controls.speed.slower": "Mai încet", "enclosure_media_controls.speed.slower.title": "Mai încet cu %sx", - "entry.starred.toast.off": "Fără stea", - "entry.starred.toast.on": "Cu stea", - "entry.starred.toggle.off": "Fără stea", - "entry.starred.toggle.on": "Stea", "entry.comments.label": "Comentarii", "entry.comments.title": "Vizualizare Comentarii", "entry.estimated_reading_time": [ @@ -70,6 +66,10 @@ "entry.share.title": "Partajează această înregistrare", "entry.shared_entry.label": "Partajare", "entry.shared_entry.title": "Deschide legătura publică", + "entry.starred.toast.off": "Fără stea", + "entry.starred.toast.on": "Cu stea", + "entry.starred.toggle.off": "Fără stea", + "entry.starred.toggle.on": "Stea", "entry.state.loading": "Încarc…", "entry.state.saving": "Salvez…", "entry.status.mark_as_read": "Marcați ca citit", @@ -132,6 +132,7 @@ "error.invalid_site_url": "Adresa URL a site-ului este invalidă.", "error.invalid_theme": "Temă invalidă.", "error.invalid_timezone": "Dată/oră invalide.", + "error.linktaco_missing_required_fields": "LinkTaco API Token și Organization Slug sunt necesare", "error.network_operation": "Miniflux nu poate ajunge la acest site din cauza unei erori de rețea: %v.", "error.network_timeout": "Acest site web este prea lent și conexiunea nu s-a realizat: %v", "error.password_min_length": "Parola trebuie să aibă cel puțin 6 caractere.", @@ -163,7 +164,6 @@ "error.unlink_account_without_password": "Trebuie să definiți o parolă, altfel nu vă veți mai putea conecta.", "error.user_already_exists": "Acest utilizator există deja.", "error.user_mandatory_fields": "Numele utilizatorului este obligatoriu.", - "error.linktaco_missing_required_fields": "LinkTaco API Token și Organization Slug sunt necesare", "form.api_key.label.description": "Etichetă Cheie API", "form.category.hide_globally": "Ascunde intrările în lista globală de articole necitite", "form.category.label.title": "Titlu", @@ -263,9 +263,9 @@ "form.integration.linktaco_tags": "Tag-uri (maxim 10, separate prin virgule)", "form.integration.linktaco_tags_hint": "Maxim 10 tag-uri, separate prin virgule", "form.integration.linktaco_visibility": "Vizibilitate", - "form.integration.linktaco_visibility_public": "Public", - "form.integration.linktaco_visibility_private": "Privat", "form.integration.linktaco_visibility_hint": "Vizibilitatea PRIVATĂ necesită un cont LinkTaco plătit", + "form.integration.linktaco_visibility_private": "Privat", + "form.integration.linktaco_visibility_public": "Public", "form.integration.linkwarden_activate": "Salvează intrările în Linkwarden", "form.integration.linkwarden_api_key": "Cheie API Linkwarden", "form.integration.linkwarden_endpoint": "URL-ul de bază Linkwarden", @@ -344,8 +344,10 @@ "form.integration.webhook_url": "URL Webhook", "form.prefs.fieldset.application_settings": "Setări Aplicație", "form.prefs.fieldset.authentication_settings": "Setări Autentificare", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Setări Globale pt. Flux", "form.prefs.fieldset.reader_settings": "Setări Citire", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Lista fonturilor de pe gazdă separate de virgulă care poate fi utilizate. De exemplu: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Citește articolele deschizând linkurile externe", "form.prefs.label.categories_sorting_order": "Sortare categorii", @@ -527,10 +529,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Navigare Pagini", "page.keyboard_shortcuts.subtitle.sections": "Navigare Secțiuni", "page.keyboard_shortcuts.title": "Scurtături Tastatură", - "page.keyboard_shortcuts.toggle_star_status": "Comută marcate", "page.keyboard_shortcuts.toggle_entry_attachments": "Comută deschis/închis pe atașamentele înregistrării", "page.keyboard_shortcuts.toggle_read_status_next": "Comută citit/necitit focus următor", "page.keyboard_shortcuts.toggle_read_status_prev": "Comută citit/necitit, focus anterior", + "page.keyboard_shortcuts.toggle_star_status": "Comută marcate", "page.login.google_signin": "Conectare cu Google", "page.login.oidc_signin": "Conectare cu %s", "page.login.title": "Conectare", @@ -647,4 +649,4 @@ "time_elapsed.yesterday": "ieri", "tooltip.keyboard_shortcuts": "Scurtături Tastatură: %s", "tooltip.logged_user": "Atentificat ca %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/ru_RU.json b/internal/locale/translations/ru_RU.json index c9a70c5605d..1e01ac7eb3e 100644 --- a/internal/locale/translations/ru_RU.json +++ b/internal/locale/translations/ru_RU.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Ваш внешний аккаунт теперь отвязан!", "alert.background_feed_refresh": "Все подписки обновляются в фоновом режиме. Вы можете продолжать использовать Miniflux пока идёт этот процесс.", "alert.feed_error": "С этой подпиской есть проблема", - "alert.no_starred": "Избранное отсутствует.", "alert.no_category": "Категории отсутствуют.", "alert.no_category_entry": "В этой категории нет статей.", "alert.no_feed": "У вас нет ни одной подписки.", @@ -24,6 +23,7 @@ "alert.no_history": "Истории пока что нет.", "alert.no_search_result": "Нет результатов для данного поискового запроса.", "alert.no_shared_entry": "Общедоступные статьи отсутствуют.", + "alert.no_starred": "Избранное отсутствует.", "alert.no_tag_entry": "Нет записей, соответствующих этому тегу.", "alert.no_unread_entry": "Нет непрочитанных статей.", "alert.no_user": "Вы единственный пользователь.", @@ -47,10 +47,6 @@ "enclosure_media_controls.speed.reset.title": "Сбросить скорость до 1x", "enclosure_media_controls.speed.slower": "Медленнее", "enclosure_media_controls.speed.slower.title": "Замедлить в %s раз", - "entry.starred.toast.off": "Без пометок", - "entry.starred.toast.on": "Помеченные", - "entry.starred.toggle.off": "Удалить из Избранного", - "entry.starred.toggle.on": "Добавить в Избранное", "entry.comments.label": "Комментарии", "entry.comments.title": "Показать комментарии", "entry.estimated_reading_time": [ @@ -70,6 +66,10 @@ "entry.share.title": "Поделиться этой статьёй", "entry.shared_entry.label": "Поделиться", "entry.shared_entry.title": "Открыть публичную ссылку", + "entry.starred.toast.off": "Без пометок", + "entry.starred.toast.on": "Помеченные", + "entry.starred.toggle.off": "Удалить из Избранного", + "entry.starred.toggle.on": "Добавить в Избранное", "entry.state.loading": "Загрузка…", "entry.state.saving": "Сохранение…", "entry.status.mark_as_read": "Отметить как прочитанное", @@ -132,6 +132,7 @@ "error.invalid_site_url": "Недействительный ссылка сайта.", "error.invalid_theme": "Недопустимая тема.", "error.invalid_timezone": "Недопустимый часовой пояс.", + "error.linktaco_missing_required_fields": "LinkTaco API Token и Organization Slug обязательны", "error.network_operation": "Miniflux не может открыть сайт из-за ошибки сети: %v.", "error.network_timeout": "Этот сайт слишком медленный и время ожидания запроса истекло: %v", "error.password_min_length": "Вы должны использовать минимум 6 символов.", @@ -163,7 +164,6 @@ "error.unlink_account_without_password": "Вы должны установить пароль, иначе вы не сможете войти снова.", "error.user_already_exists": "Этот пользователь уже существует.", "error.user_mandatory_fields": "Имя пользователя обязательно.", - "error.linktaco_missing_required_fields": "LinkTaco API Token и Organization Slug обязательны", "form.api_key.label.description": "Описание API-ключа", "form.category.hide_globally": "Скрыть записи в глобальном списке непрочитанных", "form.category.label.title": "Название", @@ -263,9 +263,9 @@ "form.integration.linktaco_tags": "Теги (макс. 10, через запятую)", "form.integration.linktaco_tags_hint": "Максимум 10 тегов, через запятую", "form.integration.linktaco_visibility": "Видимость", - "form.integration.linktaco_visibility_public": "Публично", - "form.integration.linktaco_visibility_private": "Приватно", "form.integration.linktaco_visibility_hint": "ПРИВАТНАЯ видимость требует платного аккаунта LinkTaco", + "form.integration.linktaco_visibility_private": "Приватно", + "form.integration.linktaco_visibility_public": "Публично", "form.integration.linkwarden_activate": "Сохранять статьи в Linkwarden", "form.integration.linkwarden_api_key": "API-ключ Linkwarden", "form.integration.linkwarden_endpoint": "Базовый URL-адрес Linkwarden", @@ -344,8 +344,10 @@ "form.integration.webhook_url": "Адрес вебхуков", "form.prefs.fieldset.application_settings": "Настройки приложения", "form.prefs.fieldset.authentication_settings": "Настройки аутентификации", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Глобальные настройки подписок", "form.prefs.fieldset.reader_settings": "Настройки чтения", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Список разрешённых внешних хостов для шрифтов, разделенных пробелами. Например: \"fonts.gstatic.com fonts.googleapis.com\".", "form.prefs.label.always_open_external_links": "Читать статьи, открывая внешние ссылки", "form.prefs.label.categories_sorting_order": "Сортировка категорий", @@ -527,10 +529,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Навигация по страницам", "page.keyboard_shortcuts.subtitle.sections": "Навигация по секциям", "page.keyboard_shortcuts.title": "Горячие клавиши", - "page.keyboard_shortcuts.toggle_star_status": "Переключатель избранного", "page.keyboard_shortcuts.toggle_entry_attachments": "Переключатель показать/скрыть вложения", "page.keyboard_shortcuts.toggle_read_status_next": "Переключатель прочитанного, сосредоточиться на следующем", "page.keyboard_shortcuts.toggle_read_status_prev": "Переключатель прочитанного, фокус предыдущий", + "page.keyboard_shortcuts.toggle_star_status": "Переключатель избранного", "page.login.google_signin": "Войти с помощью Google", "page.login.oidc_signin": "Войти с помощью %s", "page.login.title": "Войти", @@ -647,4 +649,4 @@ "time_elapsed.yesterday": "вчера", "tooltip.keyboard_shortcuts": "Сочетания клавиш: %s", "tooltip.logged_user": "Авторизован как %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/tr_TR.json b/internal/locale/translations/tr_TR.json index 6838d53c6e9..b3aa5c9ba37 100644 --- a/internal/locale/translations/tr_TR.json +++ b/internal/locale/translations/tr_TR.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Harici hesabınızın bağlantısı kaldırıldı!", "alert.background_feed_refresh": "Tüm beslemeler arkaplanda yenileniyor. Bu süreç devam ederken Miniflux'ı kullanmaya devam edebilirsiniz.", "alert.feed_error": "Bu beslemeyle ilgili bir problem var", - "alert.no_starred": "Yıldızlanmış makale yok.", "alert.no_category": "Hiç kategori yok.", "alert.no_category_entry": "Bu kategoride hiç makele yok.", "alert.no_feed": "Hiç beslemeniz yok.", @@ -24,6 +23,7 @@ "alert.no_history": "Şu anda hiç geçmiş yok.", "alert.no_search_result": "Bu arama için sonuç yok", "alert.no_shared_entry": "Paylaşılan bir makele yok.", + "alert.no_starred": "Yıldızlanmış makale yok.", "alert.no_tag_entry": "Bu etiketle eşleşen hiçbir giriş yok.", "alert.no_unread_entry": "Okunmamış makele yok", "alert.no_user": "Tek kullanıcı sizsiniz", @@ -46,10 +46,6 @@ "enclosure_media_controls.speed.reset.title": "Hızı 1x'e sıfırla", "enclosure_media_controls.speed.slower": "Daha yavaş", "enclosure_media_controls.speed.slower.title": "%sx kat daha yavaş", - "entry.starred.toast.off": "Yıldızsız", - "entry.starred.toast.on": "Yıldızlı", - "entry.starred.toggle.off": "Yıldızı kaldır", - "entry.starred.toggle.on": "Yıldız ekle", "entry.comments.label": "Yorumlar", "entry.comments.title": "Yorumları Göster", "entry.estimated_reading_time": [ @@ -68,6 +64,10 @@ "entry.share.title": "Bu makeleyi paylaş", "entry.shared_entry.label": "Paylaş", "entry.shared_entry.title": "Herkese açık bağlantıyı aç", + "entry.starred.toast.off": "Yıldızsız", + "entry.starred.toast.on": "Yıldızlı", + "entry.starred.toggle.off": "Yıldızı kaldır", + "entry.starred.toggle.on": "Yıldız ekle", "entry.state.loading": "Yükleniyor...", "entry.state.saving": "Kaydediliyor...", "entry.status.mark_as_read": "Okundu olarak işaretle", @@ -129,6 +129,7 @@ "error.invalid_site_url": "Geçersiz site URL'si.", "error.invalid_theme": "Geçersiz tema.", "error.invalid_timezone": "Geçersiz saat dilimi.", + "error.linktaco_missing_required_fields": "LinkTaco API Token ve Organization Slug gereklidir", "error.network_operation": "Miniflux bir ağ hatası nedeniyle bu websitesine erişemiyor: %v.", "error.network_timeout": "Bu websitesi çok yavaş ve istek zaman aşımına uğradı: %v", "error.password_min_length": "Parola en az 6 karakter içermeli.", @@ -160,7 +161,6 @@ "error.unlink_account_without_password": "Bir şifre belirlemelisiniz, aksi takdirde tekrar oturum açamazsınız.", "error.user_already_exists": "Bu kullanıcı zaten mevcut.", "error.user_mandatory_fields": "Kullanıcı adı zorunlu.", - "error.linktaco_missing_required_fields": "LinkTaco API Token ve Organization Slug gereklidir", "form.api_key.label.description": "API Anahtar Etiketi", "form.category.hide_globally": "Genel okunmamış listesindeki girişleri gizle", "form.category.label.title": "Başlık", @@ -260,9 +260,9 @@ "form.integration.linktaco_tags": "Etiketler (maks 10, virgülle ayrılmış)", "form.integration.linktaco_tags_hint": "Maksimum 10 etiket, virgülle ayrılmış", "form.integration.linktaco_visibility": "Görünürlük", - "form.integration.linktaco_visibility_public": "Genel", - "form.integration.linktaco_visibility_private": "Özel", "form.integration.linktaco_visibility_hint": "ÖZEL görünürlük ücretli bir LinkTaco hesabı gerektirir", + "form.integration.linktaco_visibility_private": "Özel", + "form.integration.linktaco_visibility_public": "Genel", "form.integration.linkwarden_activate": "Makaleleri Linkwarden'e kaydet", "form.integration.linkwarden_api_key": "Linkwarden API Anahtarı", "form.integration.linkwarden_endpoint": "Linkwarden Temel URL'si", @@ -341,8 +341,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Uygulama Ayarları", "form.prefs.fieldset.authentication_settings": "Kimlik Doğrulama Ayarları", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Genel Besleme Ayarları", "form.prefs.fieldset.reader_settings": "Okuyucu Ayarları", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "İzin verilecek harici font sunucularının boşlukla ayrılmış listesi. Örneğin: 'fonts.gstatic.com fonts.googleapis.com'.", "form.prefs.label.always_open_external_links": "Makaleleri harici bağlantıları açarak oku", "form.prefs.label.categories_sorting_order": "Kategori sıralaması", @@ -521,10 +523,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Sayfalarda Gezinme", "page.keyboard_shortcuts.subtitle.sections": "Bölümlerde Gezinme", "page.keyboard_shortcuts.title": "Klavye Kısayolları", - "page.keyboard_shortcuts.toggle_star_status": "Yıldız ekle/kaldır", "page.keyboard_shortcuts.toggle_entry_attachments": "Makele eklerini açma/kapama arasında geçiş yap", "page.keyboard_shortcuts.toggle_read_status_next": "Okundu/okunmadı arasında geçiş yap, sonrakine odaklan", "page.keyboard_shortcuts.toggle_read_status_prev": "Okundu/okunmadı arasında geçiş yap, öncekine odaklan", + "page.keyboard_shortcuts.toggle_star_status": "Yıldız ekle/kaldır", "page.login.google_signin": "Google ile oturum aç", "page.login.oidc_signin": "%s ile oturum aç", "page.login.title": "Oturum aç", @@ -629,4 +631,4 @@ "time_elapsed.yesterday": "dün", "tooltip.keyboard_shortcuts": "Klavye Kısayolu: %s", "tooltip.logged_user": "%s olarak giriş yapıldı" -} \ No newline at end of file +} diff --git a/internal/locale/translations/uk_UA.json b/internal/locale/translations/uk_UA.json index e795676de49..fe88d509869 100644 --- a/internal/locale/translations/uk_UA.json +++ b/internal/locale/translations/uk_UA.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "Тепер ваш зовнішній обліковий запис підключено!", "alert.background_feed_refresh": "Всі стрічки оновлюються у фоновому режимі. Ви можете продовжувати користуватися Miniflux, поки триває цей процес.", "alert.feed_error": "З цією стрічкою трапилась помилка", - "alert.no_starred": "Наразі закладки відсутні.", "alert.no_category": "Немає категорії.", "alert.no_category_entry": "У цій категорії немає записів.", "alert.no_feed": "У вас немає підписок.", @@ -24,6 +23,7 @@ "alert.no_history": "Наразі історія порожня.", "alert.no_search_result": "Немає результатів для цього пошуку.", "alert.no_shared_entry": "Немає спільного запису.", + "alert.no_starred": "Наразі закладки відсутні.", "alert.no_tag_entry": "Немає записів, що відповідають цьому тегу.", "alert.no_unread_entry": "Немає непрочитаних статей.", "alert.no_user": "Ви єдиний користувач.", @@ -47,10 +47,6 @@ "enclosure_media_controls.speed.reset.title": "Скинути швидкість до 1x", "enclosure_media_controls.speed.slower": "Повільніше", "enclosure_media_controls.speed.slower.title": "Повільніше на %sx", - "entry.starred.toast.off": "Без зірочки", - "entry.starred.toast.on": "З зірочкою", - "entry.starred.toggle.off": "Прибрати зірочку", - "entry.starred.toggle.on": "Поставити зірочку", "entry.comments.label": "Коментарі", "entry.comments.title": "Дивитися коментарі", "entry.estimated_reading_time": [ @@ -70,6 +66,10 @@ "entry.share.title": "Поділитись статтєю", "entry.shared_entry.label": "Поділитись", "entry.shared_entry.title": "Відкрити публічне посилання", + "entry.starred.toast.off": "Без зірочки", + "entry.starred.toast.on": "З зірочкою", + "entry.starred.toggle.off": "Прибрати зірочку", + "entry.starred.toggle.on": "Поставити зірочку", "entry.state.loading": "Завантаження...", "entry.state.saving": "Зберігаю...", "entry.status.mark_as_read": "Позначити як прочитане", @@ -132,6 +132,7 @@ "error.invalid_site_url": "Недійсна URL-адреса сайту.", "error.invalid_theme": "Недійсна тема.", "error.invalid_timezone": "Недійсний часовий пояс.", + "error.linktaco_missing_required_fields": "LinkTaco API Token і Organization Slug є обов'язковими", "error.network_operation": "Miniflux не може отримати доступ до цього сайту через помилку мережі: %v.", "error.network_timeout": "Цей сайт занадто повільний і запит перевищив час очікування: %v", "error.password_min_length": "Пароль має складати щонайменше 6 символів.", @@ -163,7 +164,6 @@ "error.unlink_account_without_password": "Ви маєте встановити пароль, щоб мати можливість увійти наступного разу", "error.user_already_exists": "Такий користувач вже існує.", "error.user_mandatory_fields": "Ім'я користувача є обов'язковим.", - "error.linktaco_missing_required_fields": "LinkTaco API Token і Organization Slug є обов'язковими", "form.api_key.label.description": "Назва ключа API", "form.category.hide_globally": "Приховати записи в глобальному списку непрочитаного", "form.category.label.title": "Назва", @@ -263,9 +263,9 @@ "form.integration.linktaco_tags": "Теги (макс. 10, через кому)", "form.integration.linktaco_tags_hint": "Максимум 10 тегів, через кому", "form.integration.linktaco_visibility": "Видимість", - "form.integration.linktaco_visibility_public": "Публічно", - "form.integration.linktaco_visibility_private": "Приватно", "form.integration.linktaco_visibility_hint": "ПРИВАТНА видимість потребує платного акаунта LinkTaco", + "form.integration.linktaco_visibility_private": "Приватно", + "form.integration.linktaco_visibility_public": "Публічно", "form.integration.linkwarden_activate": "Зберігати статті до Linkwarden", "form.integration.linkwarden_api_key": "Ключ API Linkwarden", "form.integration.linkwarden_endpoint": "Базова URL-адреса Linkwarden", @@ -344,8 +344,10 @@ "form.integration.webhook_url": "Default Webhook URL", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "Global Feed Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "Список дозволених зовнішніх хостів шрифтів, розділених пробілами. Наприклад: 'fonts.gstatic.com fonts.googleapis.com'.", "form.prefs.label.always_open_external_links": "Читати статті, відкриваючи зовнішні посилання", "form.prefs.label.categories_sorting_order": "Сортування за категоріями", @@ -527,10 +529,10 @@ "page.keyboard_shortcuts.subtitle.pages": "Навігація по сторінках", "page.keyboard_shortcuts.subtitle.sections": "Навігація по розділах", "page.keyboard_shortcuts.title": "Комбінації клавиш", - "page.keyboard_shortcuts.toggle_star_status": "Переключити статус закладки", "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments", "page.keyboard_shortcuts.toggle_read_status_next": "Переключити статус читання, перейти до наступного", "page.keyboard_shortcuts.toggle_read_status_prev": "Переключити статус читання, перейти до попереднього", + "page.keyboard_shortcuts.toggle_star_status": "Переключити статус закладки", "page.login.google_signin": "Увійти через Google", "page.login.oidc_signin": "Увійти через %s", "page.login.title": "Вхід", @@ -647,4 +649,4 @@ "time_elapsed.yesterday": "вчора", "tooltip.keyboard_shortcuts": "Комбінація клавіш: %s", "tooltip.logged_user": "Здійснено вхід як %s" -} \ No newline at end of file +} diff --git a/internal/locale/translations/zh_CN.json b/internal/locale/translations/zh_CN.json index ad7761fbdf7..b3d71682f36 100644 --- a/internal/locale/translations/zh_CN.json +++ b/internal/locale/translations/zh_CN.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "您的外部帐户已解除关联!", "alert.background_feed_refresh": "所有订阅源正在后台刷新。您可以在刷新过程中继续使用 Miniflux。", "alert.feed_error": "此订阅源存在问题", - "alert.no_starred": "没有收藏的条目。", "alert.no_category": "没有分类。", "alert.no_category_entry": "此分类下没有条目。", "alert.no_feed": "你没有任何订阅源。", @@ -24,6 +23,7 @@ "alert.no_history": "当前没有历史记录。", "alert.no_search_result": "此搜索没有结果。", "alert.no_shared_entry": "没有已分享条目。", + "alert.no_starred": "没有收藏的条目。", "alert.no_tag_entry": "没有匹配此标签的条目。", "alert.no_unread_entry": "没有未读条目。", "alert.no_user": "您是唯一的用户。", @@ -45,10 +45,6 @@ "enclosure_media_controls.speed.reset.title": "重置速度到 1x", "enclosure_media_controls.speed.slower": "减慢", "enclosure_media_controls.speed.slower.title": "速度减慢到 %sx", - "entry.starred.toast.off": "已取消收藏", - "entry.starred.toast.on": "已添加收藏", - "entry.starred.toggle.off": "取消收藏", - "entry.starred.toggle.on": "添加收藏", "entry.comments.label": "评论", "entry.comments.title": "查看评论", "entry.estimated_reading_time": [ @@ -66,6 +62,10 @@ "entry.share.title": "分享此条目", "entry.shared_entry.label": "分享", "entry.shared_entry.title": "打开公开链接", + "entry.starred.toast.off": "已取消收藏", + "entry.starred.toast.on": "已添加收藏", + "entry.starred.toggle.off": "取消收藏", + "entry.starred.toggle.on": "添加收藏", "entry.state.loading": "加载中…", "entry.state.saving": "保存中…", "entry.status.mark_as_read": "标为已读", @@ -126,6 +126,7 @@ "error.invalid_site_url": "无效的网站 URL。", "error.invalid_theme": "无效的主题。", "error.invalid_timezone": "无效的时区。", + "error.linktaco_missing_required_fields": "LinkTaco API Token 和 Organization Slug 是必需的", "error.network_operation": "由于网络错误,Miniflux 无法访问此网站:%v。", "error.network_timeout": "该网站响应过慢,请求已超时:%v", "error.password_min_length": "密码长度至少为 6 个字符。", @@ -157,7 +158,6 @@ "error.unlink_account_without_password": "您必须设置密码,否则您将无法再次登录。", "error.user_already_exists": "此用户已存在。", "error.user_mandatory_fields": "必须填写用户名。", - "error.linktaco_missing_required_fields": "LinkTaco API Token 和 Organization Slug 是必需的", "form.api_key.label.description": "API 密钥标签", "form.category.hide_globally": "在全局未读列表中隐藏条目", "form.category.label.title": "标题", @@ -257,9 +257,9 @@ "form.integration.linktaco_tags": "标签(最多10个,逗号分隔)", "form.integration.linktaco_tags_hint": "最多10个标签,逗号分隔", "form.integration.linktaco_visibility": "可见性", - "form.integration.linktaco_visibility_public": "公开", - "form.integration.linktaco_visibility_private": "私人", "form.integration.linktaco_visibility_hint": "私人可见性需要付费的 LinkTaco 帐户", + "form.integration.linktaco_visibility_private": "私人", + "form.integration.linktaco_visibility_public": "公开", "form.integration.linkwarden_activate": "保存条目到 Linkwarden", "form.integration.linkwarden_api_key": "Linkwarden API 密钥", "form.integration.linkwarden_endpoint": "Linkwarden 基本 URL", @@ -338,8 +338,10 @@ "form.integration.webhook_url": "默认 Webhook URL", "form.prefs.fieldset.application_settings": "应用设置", "form.prefs.fieldset.authentication_settings": "认证设置", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "全局订阅源设置", "form.prefs.fieldset.reader_settings": "阅读器设置", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "允许外部字体托管的空格分隔列表。例如:\"fonts.gstatic.com fonts.googleapis.com\"。", "form.prefs.label.always_open_external_links": "打开外部链接阅读条目", "form.prefs.label.categories_sorting_order": "分类排序", @@ -515,10 +517,10 @@ "page.keyboard_shortcuts.subtitle.pages": "页面导航", "page.keyboard_shortcuts.subtitle.sections": "区域导航", "page.keyboard_shortcuts.title": "键盘快捷键", - "page.keyboard_shortcuts.toggle_star_status": "切换收藏状态", "page.keyboard_shortcuts.toggle_entry_attachments": "切换展开/折叠条目附件", "page.keyboard_shortcuts.toggle_read_status_next": "切换已读/未读状态,并切换到下一项", "page.keyboard_shortcuts.toggle_read_status_prev": "切换已读/未读状态,并切换到上一项", + "page.keyboard_shortcuts.toggle_star_status": "切换收藏状态", "page.login.google_signin": "使用 Google 登录", "page.login.oidc_signin": "使用 %s 登录", "page.login.title": "登录", diff --git a/internal/locale/translations/zh_TW.json b/internal/locale/translations/zh_TW.json index e9e42d69a00..07d98024c7d 100644 --- a/internal/locale/translations/zh_TW.json +++ b/internal/locale/translations/zh_TW.json @@ -15,7 +15,6 @@ "alert.account_unlinked": "您的外部帳戶已解除關聯!", "alert.background_feed_refresh": "所有 Feed 正在背景中更新,您可以繼續使用 Miniflux。", "alert.feed_error": "該 Feed 存在問題", - "alert.no_starred": "目前沒有收藏", "alert.no_category": "目前沒有分類", "alert.no_category_entry": "該分類下沒有文章", "alert.no_feed": "目前沒有 Feed", @@ -24,6 +23,7 @@ "alert.no_history": "目前沒有歷史", "alert.no_search_result": "沒有符合搜尋的結果", "alert.no_shared_entry": "沒有分享文章。", + "alert.no_starred": "目前沒有收藏", "alert.no_tag_entry": "沒有與此標籤相符的文章。", "alert.no_unread_entry": "目前沒有未讀文章", "alert.no_user": "您是唯一的使用者", @@ -45,10 +45,6 @@ "enclosure_media_controls.speed.reset.title": "重設播放速度為 1x", "enclosure_media_controls.speed.slower": "放慢", "enclosure_media_controls.speed.slower.title": "放慢 %sx", - "entry.starred.toast.off": "已取消收藏", - "entry.starred.toast.on": "已新增收藏", - "entry.starred.toggle.off": "取消收藏", - "entry.starred.toggle.on": "新增收藏", "entry.comments.label": "評論", "entry.comments.title": "檢視評論", "entry.estimated_reading_time": [ @@ -66,6 +62,10 @@ "entry.share.title": "分享這篇文章", "entry.shared_entry.label": "分享", "entry.shared_entry.title": "開啟公共連結", + "entry.starred.toast.off": "已取消收藏", + "entry.starred.toast.on": "已新增收藏", + "entry.starred.toggle.off": "取消收藏", + "entry.starred.toggle.on": "新增收藏", "entry.state.loading": "載入中…", "entry.state.saving": "儲存中…", "entry.status.mark_as_read": "標記為已讀", @@ -126,6 +126,7 @@ "error.invalid_site_url": "Feed 網站的網址無效。", "error.invalid_theme": "無效的主題。", "error.invalid_timezone": "無效的時區。", + "error.linktaco_missing_required_fields": "LinkTaco API Token 和 Organization Slug 是必需的", "error.network_operation": "Miniflux 無法連線到該網站,可能是網路問題:%v。", "error.network_timeout": "該網站回應過慢,請求逾時:%v。", "error.password_min_length": "請至少輸入 6 個字元", @@ -157,7 +158,6 @@ "error.unlink_account_without_password": "您必須設定密碼,否則您將無法再次登入。", "error.user_already_exists": "使用者已存在", "error.user_mandatory_fields": "必須填寫使用者名稱", - "error.linktaco_missing_required_fields": "LinkTaco API Token 和 Organization Slug 是必需的", "form.api_key.label.description": "API 金鑰標籤", "form.category.hide_globally": "在全域未讀列表中隱藏文章", "form.category.label.title": "標題", @@ -257,9 +257,9 @@ "form.integration.linktaco_tags": "標籤(最多10個,逗號分隔)", "form.integration.linktaco_tags_hint": "最多10個標籤,逗號分隔", "form.integration.linktaco_visibility": "可見性", - "form.integration.linktaco_visibility_public": "公開", - "form.integration.linktaco_visibility_private": "私人", "form.integration.linktaco_visibility_hint": "私人可見性需要付費的 LinkTaco 帳戶", + "form.integration.linktaco_visibility_private": "私人", + "form.integration.linktaco_visibility_public": "公開", "form.integration.linkwarden_activate": "儲存文章到 Linkwarden", "form.integration.linkwarden_api_key": "Linkwarden API 金鑰", "form.integration.linkwarden_endpoint": "Linkwarden 基本 URL", @@ -338,8 +338,10 @@ "form.integration.webhook_url": "Default Webhook 網址", "form.prefs.fieldset.application_settings": "應用程式設定", "form.prefs.fieldset.authentication_settings": "使用者認證設定", + "form.prefs.fieldset.feeds_backup": "Feeds Backup", "form.prefs.fieldset.global_feed_settings": "全域 Feed 設定", "form.prefs.fieldset.reader_settings": "閱讀器設定", + "form.prefs.fieldset.settings_backup": "Settings Backup", "form.prefs.help.external_font_hosts": "以空白分隔允許的外部字型來源。例如:「fonts.gstatic.com fonts.googleapis.com」。", "form.prefs.label.always_open_external_links": "Read articles by opening external links", "form.prefs.label.categories_sorting_order": "分類排序", @@ -515,10 +517,10 @@ "page.keyboard_shortcuts.subtitle.pages": "頁面導覽", "page.keyboard_shortcuts.subtitle.sections": "分欄導覽", "page.keyboard_shortcuts.title": "快捷鍵", - "page.keyboard_shortcuts.toggle_star_status": "切換收藏狀態", "page.keyboard_shortcuts.toggle_entry_attachments": "展開/折疊文章附件", "page.keyboard_shortcuts.toggle_read_status_next": "切換已讀/未讀狀態,並聚焦到下一個", "page.keyboard_shortcuts.toggle_read_status_prev": "切換已讀/未讀狀態,並聚焦到上一個", + "page.keyboard_shortcuts.toggle_star_status": "切換收藏狀態", "page.login.google_signin": "使用 Google 登入", "page.login.oidc_signin": "使用 %s 登入", "page.login.title": "登入", @@ -611,4 +613,4 @@ "time_elapsed.yesterday": "昨天", "tooltip.keyboard_shortcuts": "快捷鍵:%s", "tooltip.logged_user": "目前登入 %s" -} \ No newline at end of file +} diff --git a/internal/metric/metric.go b/internal/metric/metric.go index 537ce8b2901..886b23497aa 100644 --- a/internal/metric/metric.go +++ b/internal/metric/metric.go @@ -176,7 +176,7 @@ func (c *collector) GatherStorageMetrics() { entriesCount := c.store.CountAllEntries() for status, count := range entriesCount { - entriesGauge.WithLabelValues(status).Set(float64(count)) + entriesGauge.WithLabelValues(string(status)).Set(float64(count)) } dbStats := c.store.DBStats() diff --git a/internal/model/entry.go b/internal/model/entry.go index db4958ca547..9c3e92294a9 100644 --- a/internal/model/entry.go +++ b/internal/model/entry.go @@ -7,11 +7,17 @@ import ( "time" ) -// Entry statuses and default sorting order. +// Entry statuses. +type EntryStatus string + +const ( + EntryStatusUnread EntryStatus = "unread" + EntryStatusRead EntryStatus = "read" + EntryStatusRemoved EntryStatus = "removed" +) + +// Sorting orders. const ( - EntryStatusUnread = "unread" - EntryStatusRead = "read" - EntryStatusRemoved = "removed" DefaultSortingOrder = "published_at" DefaultSortingDirection = "asc" ) @@ -21,7 +27,7 @@ type Entry struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` FeedID int64 `json:"feed_id"` - Status string `json:"status"` + Status EntryStatus `json:"status"` Hash string `json:"hash"` Title string `json:"title"` URL string `json:"url"` @@ -71,8 +77,8 @@ type Entries []*Entry // EntriesStatusUpdateRequest represents a request to change entries status. type EntriesStatusUpdateRequest struct { - EntryIDs []int64 `json:"entry_ids"` - Status string `json:"status"` + EntryIDs []int64 `json:"entry_ids"` + Status EntryStatus `json:"status"` } // EntryUpdateRequest represents a request to update an entry. @@ -90,3 +96,21 @@ func (e *EntryUpdateRequest) Patch(entry *Entry) { entry.Content = *e.Content } } + +func ToStatuses(statuses []string) []EntryStatus { + // Could use unsafe to make this more optimized + // but I don't think it's worth it + result := make([]EntryStatus, 0, len(statuses)) + for _, status := range statuses { + result = append(result, EntryStatus(status)) + } + return result +} + +func StatusesToString(statuses []EntryStatus) []string { + result := make([]string, 0, len(statuses)) + for _, status := range statuses { + result = append(result, string(status)) + } + return result +} diff --git a/internal/model/model.go b/internal/model/model.go index 64f3400cb79..12d2a54bce4 100644 --- a/internal/model/model.go +++ b/internal/model/model.go @@ -3,6 +3,12 @@ package model // import "miniflux.app/v2/internal/model" +import "strconv" + +func OptionalField[T any](value T) *T { + return &value +} + type Number interface { int | int64 | float64 } @@ -21,6 +27,11 @@ func OptionalString(value string) *string { return nil } -func SetOptionalField[T any](value T) *T { - return &value +func OptionalInt64(value string) *int64 { + if value != "" { + if intValue, err := strconv.ParseInt(value, 10, 64); err == nil { + return &intValue + } + } + return nil } diff --git a/internal/model/user.go b/internal/model/user.go index a16db615ce1..d9406235d87 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -6,7 +6,19 @@ package model // import "miniflux.app/v2/internal/model" import ( "time" + "miniflux.app/v2/internal/config" "miniflux.app/v2/internal/timezone" + "miniflux.app/v2/internal/version" +) + +// MarkReadBehavior list all possible behaviors for automatically marking an entry as read +type MarkReadBehavior string + +const ( + NoAutoMarkAsRead MarkReadBehavior = "no-auto" + MarkAsReadOnView MarkReadBehavior = "on-view" + MarkAsReadOnViewButWaitForPlayerCompletion MarkReadBehavior = "on-view-but-wait-for-player-completion" + MarkAsReadOnlyOnPlayerCompletion MarkReadBehavior = "on-player-completion" ) // User represents a user in the system. @@ -90,11 +102,11 @@ type UserModificationRequest struct { // Patch updates the User object with the modification request. func (u *UserModificationRequest) Patch(user *User) { - if u.Username != nil { + if u.Username != nil && *u.Username != "" && !config.Opts.DisableLocalAuth() { user.Username = *u.Username } - if u.Password != nil { + if u.Password != nil && *u.Password != "" { user.Password = *u.Password } @@ -102,15 +114,15 @@ func (u *UserModificationRequest) Patch(user *User) { user.IsAdmin = *u.IsAdmin } - if u.Theme != nil { + if u.Theme != nil && *u.Theme != "" { user.Theme = *u.Theme } - if u.Language != nil { + if u.Language != nil && *u.Language != "" { user.Language = *u.Language } - if u.Timezone != nil { + if u.Timezone != nil && *u.Timezone != "" { user.Timezone = *u.Timezone } @@ -166,11 +178,11 @@ func (u *UserModificationRequest) Patch(user *User) { user.DisplayMode = *u.DisplayMode } - if u.DefaultReadingSpeed != nil { + if u.DefaultReadingSpeed != nil && *u.DefaultReadingSpeed != 0 { user.DefaultReadingSpeed = *u.DefaultReadingSpeed } - if u.CJKReadingSpeed != nil { + if u.CJKReadingSpeed != nil && *u.CJKReadingSpeed != 0 { user.CJKReadingSpeed = *u.CJKReadingSpeed } @@ -227,3 +239,81 @@ func (u Users) UseTimezone(tz string) { user.UseTimezone(tz) } } + +// MarkAsReadBehavior returns the MarkReadBehavior from the given MarkReadOnView and MarkReadOnMediaPlayerCompletion values. +// Useful to convert the values from the User model to the form +func MarkAsReadBehavior(markReadOnView, markReadOnMediaPlayerCompletion bool) MarkReadBehavior { + switch { + case markReadOnView && !markReadOnMediaPlayerCompletion: + return MarkAsReadOnView + case markReadOnView && markReadOnMediaPlayerCompletion: + return MarkAsReadOnViewButWaitForPlayerCompletion + case !markReadOnView && markReadOnMediaPlayerCompletion: + return MarkAsReadOnlyOnPlayerCompletion + case !markReadOnView && !markReadOnMediaPlayerCompletion: + fallthrough // Explicit defaulting + default: + return NoAutoMarkAsRead + } +} + +// ExtractMarkAsReadBehavior returns the MarkReadOnView and MarkReadOnMediaPlayerCompletion values from the given MarkReadBehavior. +// Useful to extract the values from the form to the User model +func ExtractMarkAsReadBehavior(behavior MarkReadBehavior) (markReadOnView, markReadOnMediaPlayerCompletion bool) { + switch behavior { + case MarkAsReadOnView: + return true, false + case MarkAsReadOnViewButWaitForPlayerCompletion: + return true, true + case MarkAsReadOnlyOnPlayerCompletion: + return false, true + case NoAutoMarkAsRead: + fallthrough // Explicit defaulting + default: + return false, false + } +} + +// UserExport holds user data for exporting to JSON. +type UserExport struct { + UserModificationRequest + Version string `json:"miniflux_version"` +} + +// NewUserExport creates a new UserExport for exporting user data to JSON. +func NewUserExport(u *User) UserExport { + return UserExport{ + UserModificationRequest: UserModificationRequest{ + Username: OptionalString(u.Username), + Theme: OptionalString(u.Theme), + Language: OptionalString(u.Language), + Timezone: OptionalString(u.Timezone), + EntryDirection: OptionalString(u.EntryDirection), + EntryOrder: OptionalString(u.EntryOrder), + Stylesheet: OptionalString(u.Stylesheet), + CustomJS: OptionalString(u.CustomJS), + ExternalFontHosts: OptionalString(u.ExternalFontHosts), + GoogleID: OptionalString(u.GoogleID), + OpenIDConnectID: OptionalString(u.OpenIDConnectID), + EntriesPerPage: OptionalNumber(u.EntriesPerPage), + IsAdmin: OptionalField(u.IsAdmin), + KeyboardShortcuts: OptionalField(u.KeyboardShortcuts), + ShowReadingTime: OptionalField(u.ShowReadingTime), + EntrySwipe: OptionalField(u.EntrySwipe), + GestureNav: OptionalString(u.GestureNav), + DisplayMode: OptionalString(u.DisplayMode), + DefaultReadingSpeed: OptionalNumber(u.DefaultReadingSpeed), + CJKReadingSpeed: OptionalNumber(u.CJKReadingSpeed), + DefaultHomePage: OptionalString(u.DefaultHomePage), + CategoriesSortingOrder: OptionalString(u.CategoriesSortingOrder), + MarkReadOnView: OptionalField(u.MarkReadOnView), + MarkReadOnMediaPlayerCompletion: OptionalField(u.MarkReadOnMediaPlayerCompletion), + MediaPlaybackRate: OptionalField(u.MediaPlaybackRate), + BlockFilterEntryRules: OptionalString(u.BlockFilterEntryRules), + KeepFilterEntryRules: OptionalString(u.KeepFilterEntryRules), + AlwaysOpenExternalLinks: OptionalField(u.AlwaysOpenExternalLinks), + OpenExternalLinksInNewTab: OptionalField(u.OpenExternalLinksInNewTab), + }, + Version: version.Version, + } +} diff --git a/internal/reader/rewrite/url_rewrite_test.go b/internal/reader/rewrite/url_rewrite_test.go index f975078d21b..f58d80a67f9 100644 --- a/internal/reader/rewrite/url_rewrite_test.go +++ b/internal/reader/rewrite/url_rewrite_test.go @@ -87,7 +87,7 @@ func TestRewriteEntryURL(t *testing.T) { feed: &model.Feed{ ID: 1, FeedURL: "https://example.com/feed.xml", - UrlRewriteRules: `rewrite("^https://example.com/[invalid"|"https://rewritten.com/$1")`, + UrlRewriteRules: `rewrite("^https://example.com/invalid"|"https://rewritten.com/$1")`, }, entry: &model.Entry{ URL: "https://example.com/article/123", diff --git a/internal/storage/entry.go b/internal/storage/entry.go index 272e11d2a97..c5bcfc65419 100644 --- a/internal/storage/entry.go +++ b/internal/storage/entry.go @@ -17,20 +17,20 @@ import ( ) // CountAllEntries returns the number of entries for each status in the database. -func (s *Storage) CountAllEntries() map[string]int64 { +func (s *Storage) CountAllEntries() map[model.EntryStatus]int64 { rows, err := s.db.Query(`SELECT status, count(*) FROM entries GROUP BY status`) if err != nil { return nil } defer rows.Close() - results := make(map[string]int64) + results := make(map[model.EntryStatus]int64) results[model.EntryStatusUnread] = 0 results[model.EntryStatusRead] = 0 results[model.EntryStatusRemoved] = 0 for rows.Next() { - var status string + var status model.EntryStatus var count int64 if err := rows.Scan(&status, &count); err != nil { @@ -393,7 +393,7 @@ func (s *Storage) RefreshFeedEntries(userID, feedID int64, entries model.Entries } // ArchiveEntries changes the status of entries to "removed" after the interval (24h minimum). -func (s *Storage) ArchiveEntries(status string, interval time.Duration, limit int) (int64, error) { +func (s *Storage) ArchiveEntries(status model.EntryStatus, interval time.Duration, limit int) (int64, error) { if interval < 0 || limit <= 0 { return 0, nil } @@ -435,7 +435,7 @@ func (s *Storage) ArchiveEntries(status string, interval time.Duration, limit in } // SetEntriesStatus update the status of the given list of entries. -func (s *Storage) SetEntriesStatus(userID int64, entryIDs []int64, status string) error { +func (s *Storage) SetEntriesStatus(userID int64, entryIDs []int64, status model.EntryStatus) error { // Entries that have the model.EntryStatusRemoved status are immutable. query := ` UPDATE @@ -455,7 +455,7 @@ func (s *Storage) SetEntriesStatus(userID int64, entryIDs []int64, status string return nil } -func (s *Storage) SetEntriesStatusCount(userID int64, entryIDs []int64, status string) (int, error) { +func (s *Storage) SetEntriesStatusCount(userID int64, entryIDs []int64, status model.EntryStatus) (int, error) { if err := s.SetEntriesStatus(userID, entryIDs, status); err != nil { return 0, err } diff --git a/internal/storage/entry_pagination_builder.go b/internal/storage/entry_pagination_builder.go index 0e1251ce62e..1c59113a23d 100644 --- a/internal/storage/entry_pagination_builder.go +++ b/internal/storage/entry_pagination_builder.go @@ -52,7 +52,7 @@ func (e *EntryPaginationBuilder) WithCategoryID(categoryID int64) { } // WithStatus adds status to the condition. -func (e *EntryPaginationBuilder) WithStatus(status string) { +func (e *EntryPaginationBuilder) WithStatus(status model.EntryStatus) { if status != "" { e.conditions = append(e.conditions, "e.status = $"+strconv.Itoa(len(e.args)+1)) e.args = append(e.args, status) diff --git a/internal/storage/entry_query_builder.go b/internal/storage/entry_query_builder.go index a3671d03996..c39cf98b8bd 100644 --- a/internal/storage/entry_query_builder.go +++ b/internal/storage/entry_query_builder.go @@ -140,7 +140,7 @@ func (e *EntryQueryBuilder) WithCategoryID(categoryID int64) *EntryQueryBuilder } // WithStatus filter by entry status. -func (e *EntryQueryBuilder) WithStatus(status string) *EntryQueryBuilder { +func (e *EntryQueryBuilder) WithStatus(status model.EntryStatus) *EntryQueryBuilder { if status != "" { e.conditions = append(e.conditions, "e.status = $"+strconv.Itoa(len(e.args)+1)) e.args = append(e.args, status) @@ -149,10 +149,10 @@ func (e *EntryQueryBuilder) WithStatus(status string) *EntryQueryBuilder { } // WithStatuses filter by a list of entry statuses. -func (e *EntryQueryBuilder) WithStatuses(statuses []string) *EntryQueryBuilder { +func (e *EntryQueryBuilder) WithStatuses(statuses []model.EntryStatus) *EntryQueryBuilder { if len(statuses) > 0 { e.conditions = append(e.conditions, fmt.Sprintf("e.status = ANY($%d)", len(e.args)+1)) - e.args = append(e.args, pq.StringArray(statuses)) + e.args = append(e.args, pq.StringArray(model.StatusesToString(statuses))) } return e } @@ -169,7 +169,7 @@ func (e *EntryQueryBuilder) WithTags(tags []string) *EntryQueryBuilder { } // WithoutStatus set the entry status that should not be returned. -func (e *EntryQueryBuilder) WithoutStatus(status string) *EntryQueryBuilder { +func (e *EntryQueryBuilder) WithoutStatus(status model.EntryStatus) *EntryQueryBuilder { if status != "" { e.conditions = append(e.conditions, "e.status <> $"+strconv.Itoa(len(e.args)+1)) e.args = append(e.args, status) diff --git a/internal/storage/feed_query_builder.go b/internal/storage/feed_query_builder.go index 846907f75a8..39da47bc7d5 100644 --- a/internal/storage/feed_query_builder.go +++ b/internal/storage/feed_query_builder.go @@ -324,7 +324,7 @@ func (f *FeedQueryBuilder) fetchFeedCounter() (unreadCounters map[int64]int, rea unreadCounters = make(map[int64]int) for rows.Next() { var feedID int64 - var status string + var status model.EntryStatus var count int if err := rows.Scan(&feedID, &status, &count); err != nil { return nil, nil, fmt.Errorf(`store: unable to fetch feed counter row: %w`, err) diff --git a/internal/storage/integration.go b/internal/storage/integration.go index f5f94a2684e..cb92f44e3da 100644 --- a/internal/storage/integration.go +++ b/internal/storage/integration.go @@ -7,7 +7,7 @@ import ( "database/sql" "fmt" - "golang.org/x/crypto/bcrypt" + "miniflux.app/v2/internal/crypto" "miniflux.app/v2/internal/model" ) @@ -72,7 +72,7 @@ func (s *Storage) GoogleReaderUserCheckPassword(username, password string) error return fmt.Errorf(`store: unable to fetch user: %v`, err) } - if err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)); err != nil { + if err := crypto.CompareHashAndPassword(hash, password); err != nil { return fmt.Errorf(`store: invalid password for "%s" (%v)`, username, err) } diff --git a/internal/storage/user.go b/internal/storage/user.go index 22cd1a77005..d3870394bfd 100644 --- a/internal/storage/user.go +++ b/internal/storage/user.go @@ -14,7 +14,6 @@ import ( "miniflux.app/v2/internal/model" "github.com/lib/pq" - "golang.org/x/crypto/bcrypt" ) // CountUsers returns the total number of users. @@ -740,7 +739,7 @@ func (s *Storage) CheckPassword(username, password string) error { return fmt.Errorf(`store: unable to fetch user: %v`, err) } - if err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)); err != nil { + if err := crypto.CompareHashAndPassword(hash, password); err != nil { return fmt.Errorf(`store: invalid password for "%s" (%v)`, username, err) } diff --git a/internal/template/templates/views/settings.html b/internal/template/templates/views/settings.html index 1ac3280c31a..63c20943b15 100644 --- a/internal/template/templates/views/settings.html +++ b/internal/template/templates/views/settings.html @@ -259,4 +259,20 @@