1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-06-27 16:36:00 +00:00

feat: read external links

This commit is contained in:
Kelly Norton 2025-05-17 13:39:25 -04:00
parent 52b184394f
commit 562abeb997
36 changed files with 397 additions and 303 deletions

View file

@ -17,35 +17,36 @@ const (
// User represents a user in the system. // User represents a user in the system.
type User struct { type User struct {
ID int64 `json:"id"` ID int64 `json:"id"`
Username string `json:"username"` Username string `json:"username"`
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
IsAdmin bool `json:"is_admin"` IsAdmin bool `json:"is_admin"`
Theme string `json:"theme"` Theme string `json:"theme"`
Language string `json:"language"` Language string `json:"language"`
Timezone string `json:"timezone"` Timezone string `json:"timezone"`
EntryDirection string `json:"entry_sorting_direction"` EntryDirection string `json:"entry_sorting_direction"`
EntryOrder string `json:"entry_sorting_order"` EntryOrder string `json:"entry_sorting_order"`
Stylesheet string `json:"stylesheet"` Stylesheet string `json:"stylesheet"`
CustomJS string `json:"custom_js"` CustomJS string `json:"custom_js"`
GoogleID string `json:"google_id"` GoogleID string `json:"google_id"`
OpenIDConnectID string `json:"openid_connect_id"` OpenIDConnectID string `json:"openid_connect_id"`
EntriesPerPage int `json:"entries_per_page"` EntriesPerPage int `json:"entries_per_page"`
KeyboardShortcuts bool `json:"keyboard_shortcuts"` KeyboardShortcuts bool `json:"keyboard_shortcuts"`
ShowReadingTime bool `json:"show_reading_time"` ShowReadingTime bool `json:"show_reading_time"`
EntrySwipe bool `json:"entry_swipe"` EntrySwipe bool `json:"entry_swipe"`
GestureNav string `json:"gesture_nav"` GestureNav string `json:"gesture_nav"`
LastLoginAt *time.Time `json:"last_login_at"` LastLoginAt *time.Time `json:"last_login_at"`
DisplayMode string `json:"display_mode"` DisplayMode string `json:"display_mode"`
DefaultReadingSpeed int `json:"default_reading_speed"` DefaultReadingSpeed int `json:"default_reading_speed"`
CJKReadingSpeed int `json:"cjk_reading_speed"` CJKReadingSpeed int `json:"cjk_reading_speed"`
DefaultHomePage string `json:"default_home_page"` DefaultHomePage string `json:"default_home_page"`
CategoriesSortingOrder string `json:"categories_sorting_order"` CategoriesSortingOrder string `json:"categories_sorting_order"`
MarkReadOnView bool `json:"mark_read_on_view"` MarkReadOnView bool `json:"mark_read_on_view"`
MediaPlaybackRate float64 `json:"media_playback_rate"` MediaPlaybackRate float64 `json:"media_playback_rate"`
BlockFilterEntryRules string `json:"block_filter_entry_rules"` BlockFilterEntryRules string `json:"block_filter_entry_rules"`
KeepFilterEntryRules string `json:"keep_filter_entry_rules"` KeepFilterEntryRules string `json:"keep_filter_entry_rules"`
ExternalFontHosts string `json:"external_font_hosts"` ExternalFontHosts string `json:"external_font_hosts"`
AlwaysOpenExternalLinks bool `json:"always_open_external_links"`
} }
func (u User) String() string { func (u User) String() string {
@ -63,33 +64,34 @@ type UserCreationRequest struct {
// UserModificationRequest represents the request to update a user. // UserModificationRequest represents the request to update a user.
type UserModificationRequest struct { type UserModificationRequest struct {
Username *string `json:"username"` Username *string `json:"username"`
Password *string `json:"password"` Password *string `json:"password"`
IsAdmin *bool `json:"is_admin"` IsAdmin *bool `json:"is_admin"`
Theme *string `json:"theme"` Theme *string `json:"theme"`
Language *string `json:"language"` Language *string `json:"language"`
Timezone *string `json:"timezone"` Timezone *string `json:"timezone"`
EntryDirection *string `json:"entry_sorting_direction"` EntryDirection *string `json:"entry_sorting_direction"`
EntryOrder *string `json:"entry_sorting_order"` EntryOrder *string `json:"entry_sorting_order"`
Stylesheet *string `json:"stylesheet"` Stylesheet *string `json:"stylesheet"`
CustomJS *string `json:"custom_js"` CustomJS *string `json:"custom_js"`
GoogleID *string `json:"google_id"` GoogleID *string `json:"google_id"`
OpenIDConnectID *string `json:"openid_connect_id"` OpenIDConnectID *string `json:"openid_connect_id"`
EntriesPerPage *int `json:"entries_per_page"` EntriesPerPage *int `json:"entries_per_page"`
KeyboardShortcuts *bool `json:"keyboard_shortcuts"` KeyboardShortcuts *bool `json:"keyboard_shortcuts"`
ShowReadingTime *bool `json:"show_reading_time"` ShowReadingTime *bool `json:"show_reading_time"`
EntrySwipe *bool `json:"entry_swipe"` EntrySwipe *bool `json:"entry_swipe"`
GestureNav *string `json:"gesture_nav"` GestureNav *string `json:"gesture_nav"`
DisplayMode *string `json:"display_mode"` DisplayMode *string `json:"display_mode"`
DefaultReadingSpeed *int `json:"default_reading_speed"` DefaultReadingSpeed *int `json:"default_reading_speed"`
CJKReadingSpeed *int `json:"cjk_reading_speed"` CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"` DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"` CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"` MarkReadOnView *bool `json:"mark_read_on_view"`
MediaPlaybackRate *float64 `json:"media_playback_rate"` MediaPlaybackRate *float64 `json:"media_playback_rate"`
BlockFilterEntryRules *string `json:"block_filter_entry_rules"` BlockFilterEntryRules *string `json:"block_filter_entry_rules"`
KeepFilterEntryRules *string `json:"keep_filter_entry_rules"` KeepFilterEntryRules *string `json:"keep_filter_entry_rules"`
ExternalFontHosts *string `json:"external_font_hosts"` ExternalFontHosts *string `json:"external_font_hosts"`
AlwaysOpenExternalLinks *bool `json:"always_open_external_links"`
} }
// Users represents a list of users. // Users represents a list of users.

View file

@ -1073,4 +1073,8 @@ var migrations = []func(tx *sql.Tx, driver string) error{
_, err = tx.Exec(sql) _, err = tx.Exec(sql)
return return
}, },
func(tx *sql.Tx, _ string) (err error) {
_, err = tx.Exec(`ALTER TABLE users ADD COLUMN always_open_external_links bool default 'f'`)
return err
},
} }

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden", "form.prefs.label.mark_read_on_view": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden",
"form.prefs.label.mark_read_on_view_or_media_completion": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden. Audio/Video bei 90%% Wiedergabe als gelesen markieren", "form.prefs.label.mark_read_on_view_or_media_completion": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden. Audio/Video bei 90%% Wiedergabe als gelesen markieren",
"form.prefs.label.media_playback_rate": "Wiedergabegeschwindigkeit von Audio/Video", "form.prefs.label.media_playback_rate": "Wiedergabegeschwindigkeit von Audio/Video",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Geschätzte Lesezeit für Artikel anzeigen", "form.prefs.label.show_reading_time": "Geschätzte Lesezeit für Artikel anzeigen",
"form.prefs.label.theme": "Thema", "form.prefs.label.theme": "Thema",
"form.prefs.label.timezone": "Zeitzone", "form.prefs.label.timezone": "Zeitzone",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Zuletzt verwendeten", "page.api_keys.table.last_used_at": "Zuletzt verwendeten",
"page.api_keys.table.token": "Zeichen", "page.api_keys.table.token": "Zeichen",
"page.api_keys.title": "API-Schlüssel", "page.api_keys.title": "API-Schlüssel",
"page.categories_count": [
"%d Kategorie",
"%d Kategorien"
],
"page.categories.entries": "Artikel", "page.categories.entries": "Artikel",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Es gibt %d Abonnement.", "Es gibt %d Abonnement.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Abonnements", "page.categories.feeds": "Abonnements",
"page.categories.no_feed": "Kein Abonnement.", "page.categories.no_feed": "Kein Abonnement.",
"page.categories.title": "Kategorien", "page.categories.title": "Kategorien",
"page.categories_count": [
"%d Kategorie",
"%d Kategorien"
],
"page.category_label": "Kategorie: %s", "page.category_label": "Kategorie: %s",
"page.edit_category.title": "Kategorie bearbeiten: %s", "page.edit_category.title": "Kategorie bearbeiten: %s",
"page.edit_feed.etag_header": "ETag-Kopfzeile:", "page.edit_feed.etag_header": "ETag-Kopfzeile:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Hauptschlüssel registrieren", "page.settings.webauthn.register": "Hauptschlüssel registrieren",
"page.settings.webauthn.register.error": "Hauptschlüssel kann nicht registriert werden", "page.settings.webauthn.register.error": "Hauptschlüssel kann nicht registriert werden",
"page.shared_entries.title": "Geteilte Artikel",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d geteilter Artikel", "%d geteilter Artikel",
"%d geteilte Artikel" "%d geteilte Artikel"
], ],
"page.shared_entries.title": "Geteilte Artikel", "page.starred.title": "Lesezeichen",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d Lesezeichen", "%d Lesezeichen",
"%d Lesezeichen" "%d Lesezeichen"
], ],
"page.starred.title": "Lesezeichen",
"page.total_entry_count": [ "page.total_entry_count": [
"%d Artikel insgesamt", "%d Artikel insgesamt",
"%d Artikel insgesamt" "%d Artikel insgesamt"
], ],
"page.unread.title": "Ungelesen",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d ungelesener Artikel", "%d ungelesener Artikel",
"%d ungelesene Artikel" "%d ungelesene Artikel"
], ],
"page.unread.title": "Ungelesen",
"page.users.actions": "Aktionen", "page.users.actions": "Aktionen",
"page.users.admin.no": "Nein", "page.users.admin.no": "Nein",
"page.users.admin.yes": "Ja", "page.users.admin.yes": "Ja",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Αυτόματη επισήμανση καταχωρήσεων ως αναγνωσμένων κατά την προβολή", "form.prefs.label.mark_read_on_view": "Αυτόματη επισήμανση καταχωρήσεων ως αναγνωσμένων κατά την προβολή",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Ταχύτητα αναπαραγωγής του ήχου/βίντεο", "form.prefs.label.media_playback_rate": "Ταχύτητα αναπαραγωγής του ήχου/βίντεο",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Εμφάνιση εκτιμώμενου χρόνου ανάγνωσης για άρθρα", "form.prefs.label.show_reading_time": "Εμφάνιση εκτιμώμενου χρόνου ανάγνωσης για άρθρα",
"form.prefs.label.theme": "Θέμα", "form.prefs.label.theme": "Θέμα",
"form.prefs.label.timezone": "Ζώνη Ώρας", "form.prefs.label.timezone": "Ζώνη Ώρας",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Τελευταία Χρήση", "page.api_keys.table.last_used_at": "Τελευταία Χρήση",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "Κλειδιά API", "page.api_keys.title": "Κλειδιά API",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.categories.entries": "Άρθρα", "page.categories.entries": "Άρθρα",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Υπάρχει μία %d ροή.", "Υπάρχει μία %d ροή.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Συνδρομές", "page.categories.feeds": "Συνδρομές",
"page.categories.no_feed": "Καμία ροή.", "page.categories.no_feed": "Καμία ροή.",
"page.categories.title": "Κατηγορίες", "page.categories.title": "Κατηγορίες",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "Επεξεργασία κατηγορίας: % s", "page.edit_category.title": "Επεξεργασία κατηγορίας: % s",
"page.edit_feed.etag_header": "Κεφαλίδα ETag:", "page.edit_feed.etag_header": "Κεφαλίδα ETag:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Εγγραφή κωδικού πρόσβασης", "page.settings.webauthn.register": "Εγγραφή κωδικού πρόσβασης",
"page.settings.webauthn.register.error": "Δεν είναι δυνατή η εγγραφή του κωδικού πρόσβασης", "page.settings.webauthn.register.error": "Δεν είναι δυνατή η εγγραφή του κωδικού πρόσβασης",
"page.shared_entries.title": "Κοινόχρηστες Καταχωρήσεις",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "Κοινόχρηστες Καταχωρήσεις", "page.starred.title": "Αγαπημένo",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "Αγαπημένo",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "Μη αναγνωσμένα",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "Μη αναγνωσμένα",
"page.users.actions": "Eνέργειες", "page.users.actions": "Eνέργειες",
"page.users.admin.no": "Όχι", "page.users.admin.no": "Όχι",
"page.users.admin.yes": "Ναι.", "page.users.admin.yes": "Ναι.",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Automatically mark entries as read when viewed", "form.prefs.label.mark_read_on_view": "Automatically mark entries as read when viewed",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Playback speed of the audio/video", "form.prefs.label.media_playback_rate": "Playback speed of the audio/video",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Show estimated reading time for entries", "form.prefs.label.show_reading_time": "Show estimated reading time for entries",
"form.prefs.label.theme": "Theme", "form.prefs.label.theme": "Theme",
"form.prefs.label.timezone": "Timezone", "form.prefs.label.timezone": "Timezone",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Last Used", "page.api_keys.table.last_used_at": "Last Used",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "API Keys", "page.api_keys.title": "API Keys",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.categories.entries": "Entries", "page.categories.entries": "Entries",
"page.categories.feed_count": [ "page.categories.feed_count": [
"There is %d feed.", "There is %d feed.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Feeds", "page.categories.feeds": "Feeds",
"page.categories.no_feed": "No feed.", "page.categories.no_feed": "No feed.",
"page.categories.title": "Categories", "page.categories.title": "Categories",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "Edit Category: %s", "page.edit_category.title": "Edit Category: %s",
"page.edit_feed.etag_header": "ETag header:", "page.edit_feed.etag_header": "ETag header:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Register passkey", "page.settings.webauthn.register": "Register passkey",
"page.settings.webauthn.register.error": "Unable to register passkey", "page.settings.webauthn.register.error": "Unable to register passkey",
"page.shared_entries.title": "Shared entries",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "Shared entries", "page.starred.title": "Starred",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "Starred",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "Unread",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "Unread",
"page.users.actions": "Actions", "page.users.actions": "Actions",
"page.users.admin.no": "No", "page.users.admin.no": "No",
"page.users.admin.yes": "Yes", "page.users.admin.yes": "Yes",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Marcar automáticamente las entradas como leídas cuando se vean", "form.prefs.label.mark_read_on_view": "Marcar automáticamente las entradas como leídas cuando se vean",
"form.prefs.label.mark_read_on_view_or_media_completion": "Marcar las entradas como leídas cuando se vean. Para audio/video, marcar como leído al 90%% de finalización", "form.prefs.label.mark_read_on_view_or_media_completion": "Marcar las entradas como leídas cuando se vean. Para audio/video, marcar como leído al 90%% de finalización",
"form.prefs.label.media_playback_rate": "Velocidad de reproducción del audio/vídeo", "form.prefs.label.media_playback_rate": "Velocidad de reproducción del audio/vídeo",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Mostrar el tiempo estimado de lectura de los artículos", "form.prefs.label.show_reading_time": "Mostrar el tiempo estimado de lectura de los artículos",
"form.prefs.label.theme": "Tema", "form.prefs.label.theme": "Tema",
"form.prefs.label.timezone": "Zona horaria", "form.prefs.label.timezone": "Zona horaria",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Último utilizado", "page.api_keys.table.last_used_at": "Último utilizado",
"page.api_keys.table.token": "simbólico", "page.api_keys.table.token": "simbólico",
"page.api_keys.title": "Claves API", "page.api_keys.title": "Claves API",
"page.categories_count": [
"%d categoría",
"%d categorías"
],
"page.categories.entries": "Artículos", "page.categories.entries": "Artículos",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Hay %d fuente.", "Hay %d fuente.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Fuentes", "page.categories.feeds": "Fuentes",
"page.categories.no_feed": "Sin fuente.", "page.categories.no_feed": "Sin fuente.",
"page.categories.title": "Categorías", "page.categories.title": "Categorías",
"page.categories_count": [
"%d categoría",
"%d categorías"
],
"page.category_label": "Categoría: %s", "page.category_label": "Categoría: %s",
"page.edit_category.title": "Editar categoría: %s", "page.edit_category.title": "Editar categoría: %s",
"page.edit_feed.etag_header": "Cabecera de ETag:", "page.edit_feed.etag_header": "Cabecera de ETag:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Claves de acceso", "page.settings.webauthn.passkeys": "Claves de acceso",
"page.settings.webauthn.register": "Registrar clave de acceso", "page.settings.webauthn.register": "Registrar clave de acceso",
"page.settings.webauthn.register.error": "No se puede registrar la clave de acceso", "page.settings.webauthn.register.error": "No se puede registrar la clave de acceso",
"page.shared_entries.title": "Artículos compartidos",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d artículo compartido", "%d artículo compartido",
"%d artículos compartidos" "%d artículos compartidos"
], ],
"page.shared_entries.title": "Artículos compartidos", "page.starred.title": "Marcadores",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d artículo marcado", "%d artículo marcado",
"%d artículos marcados" "%d artículos marcados"
], ],
"page.starred.title": "Marcadores",
"page.total_entry_count": [ "page.total_entry_count": [
"%d artículo en total", "%d artículo en total",
"%d artículos en total" "%d artículos en total"
], ],
"page.unread.title": "No leídos",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d artículo no leído", "%d artículo no leído",
"%d artículos no leídos" "%d artículos no leídos"
], ],
"page.unread.title": "No leídos",
"page.users.actions": "Acciones", "page.users.actions": "Acciones",
"page.users.admin.no": "No", "page.users.admin.no": "No",
"page.users.admin.yes": "Sí", "page.users.admin.yes": "Sí",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Merkitse kohdat automaattisesti luetuiksi, kun niitä tarkastellaan", "form.prefs.label.mark_read_on_view": "Merkitse kohdat automaattisesti luetuiksi, kun niitä tarkastellaan",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Äänen/videon toistonopeus", "form.prefs.label.media_playback_rate": "Äänen/videon toistonopeus",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Näytä artikkeleiden arvioitu lukuaika", "form.prefs.label.show_reading_time": "Näytä artikkeleiden arvioitu lukuaika",
"form.prefs.label.theme": "Teema", "form.prefs.label.theme": "Teema",
"form.prefs.label.timezone": "Aikavyöhyke", "form.prefs.label.timezone": "Aikavyöhyke",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Viimeksi käytetty", "page.api_keys.table.last_used_at": "Viimeksi käytetty",
"page.api_keys.table.token": "Tunnus", "page.api_keys.table.token": "Tunnus",
"page.api_keys.title": "API-avaimet", "page.api_keys.title": "API-avaimet",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.categories.entries": "Artikkelit", "page.categories.entries": "Artikkelit",
"page.categories.feed_count": [ "page.categories.feed_count": [
"On %d syöte.", "On %d syöte.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Tilaukset", "page.categories.feeds": "Tilaukset",
"page.categories.no_feed": "Ei syötettä.", "page.categories.no_feed": "Ei syötettä.",
"page.categories.title": "Kategoriat", "page.categories.title": "Kategoriat",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "Muokkaa kategoria: %s", "page.edit_category.title": "Muokkaa kategoria: %s",
"page.edit_feed.etag_header": "ETag-otsikko:", "page.edit_feed.etag_header": "ETag-otsikko:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Rekisteröi salasana", "page.settings.webauthn.register": "Rekisteröi salasana",
"page.settings.webauthn.register.error": "Salasanaa ei voi rekisteröidä", "page.settings.webauthn.register.error": "Salasanaa ei voi rekisteröidä",
"page.shared_entries.title": "Jaetut artikkelit",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "Jaetut artikkelit", "page.starred.title": "Suosikit",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "Suosikit",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "Lukemattomat",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "Lukemattomat",
"page.users.actions": "Toiminnot", "page.users.actions": "Toiminnot",
"page.users.admin.no": "Ei", "page.users.admin.no": "Ei",
"page.users.admin.yes": "Kyllä", "page.users.admin.yes": "Kyllä",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées", "form.prefs.label.mark_read_on_view": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées",
"form.prefs.label.mark_read_on_view_or_media_completion": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées. Pour l'audio/vidéo, marquer comme lues après 90%%", "form.prefs.label.mark_read_on_view_or_media_completion": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées. Pour l'audio/vidéo, marquer comme lues après 90%%",
"form.prefs.label.media_playback_rate": "Vitesse de lecture de l'audio/vidéo", "form.prefs.label.media_playback_rate": "Vitesse de lecture de l'audio/vidéo",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Afficher le temps de lecture estimé des articles", "form.prefs.label.show_reading_time": "Afficher le temps de lecture estimé des articles",
"form.prefs.label.theme": "Thème", "form.prefs.label.theme": "Thème",
"form.prefs.label.timezone": "Fuseau horaire", "form.prefs.label.timezone": "Fuseau horaire",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Dernière utilisation", "page.api_keys.table.last_used_at": "Dernière utilisation",
"page.api_keys.table.token": "Jeton", "page.api_keys.table.token": "Jeton",
"page.api_keys.title": "Clés d'API", "page.api_keys.title": "Clés d'API",
"page.categories_count": [
"%d catégorie",
"%d catégories"
],
"page.categories.entries": "Articles", "page.categories.entries": "Articles",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Il y a %d abonnement.", "Il y a %d abonnement.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Abonnements", "page.categories.feeds": "Abonnements",
"page.categories.no_feed": "Aucun abonnement.", "page.categories.no_feed": "Aucun abonnement.",
"page.categories.title": "Catégories", "page.categories.title": "Catégories",
"page.categories_count": [
"%d catégorie",
"%d catégories"
],
"page.category_label": "Catégorie : %s", "page.category_label": "Catégorie : %s",
"page.edit_category.title": "Modification de la catégorie : %s", "page.edit_category.title": "Modification de la catégorie : %s",
"page.edit_feed.etag_header": "En-tête ETag :", "page.edit_feed.etag_header": "En-tête ETag :",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Clés daccès", "page.settings.webauthn.passkeys": "Clés daccès",
"page.settings.webauthn.register": "Enregister une nouvelle clé daccès", "page.settings.webauthn.register": "Enregister une nouvelle clé daccès",
"page.settings.webauthn.register.error": "Impossible d'enregistrer la clé daccès", "page.settings.webauthn.register.error": "Impossible d'enregistrer la clé daccès",
"page.shared_entries.title": "Articles partagés",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d article partagé", "%d article partagé",
"%d articles partagés" "%d articles partagés"
], ],
"page.shared_entries.title": "Articles partagés", "page.starred.title": "Favoris",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d favori", "%d favori",
"%d favoris" "%d favoris"
], ],
"page.starred.title": "Favoris",
"page.total_entry_count": [ "page.total_entry_count": [
"%d article au total", "%d article au total",
"%d articles au total" "%d articles au total"
], ],
"page.unread.title": "Non lus",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d article non lu", "%d article non lu",
"%d articles non lus" "%d articles non lus"
], ],
"page.unread.title": "Non lus",
"page.users.actions": "Actions", "page.users.actions": "Actions",
"page.users.admin.no": "Non", "page.users.admin.no": "Non",
"page.users.admin.yes": "Oui", "page.users.admin.yes": "Oui",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "देखे जाने पर स्वचालित रूप से प्रविष्टियों को पढ़ने के रूप में चिह्नित करें", "form.prefs.label.mark_read_on_view": "देखे जाने पर स्वचालित रूप से प्रविष्टियों को पढ़ने के रूप में चिह्नित करें",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "ऑडियो/वीडियो की प्लेबैक गति", "form.prefs.label.media_playback_rate": "ऑडियो/वीडियो की प्लेबैक गति",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "विषय के लिए अनुमानित पढ़ने का समय दिखाएं", "form.prefs.label.show_reading_time": "विषय के लिए अनुमानित पढ़ने का समय दिखाएं",
"form.prefs.label.theme": "थीम", "form.prefs.label.theme": "थीम",
"form.prefs.label.timezone": "समय क्षेत्र", "form.prefs.label.timezone": "समय क्षेत्र",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "आखरी इस्त्तमाल किया गया", "page.api_keys.table.last_used_at": "आखरी इस्त्तमाल किया गया",
"page.api_keys.table.token": "टोकन", "page.api_keys.table.token": "टोकन",
"page.api_keys.title": "एपीआई कुंजी", "page.api_keys.title": "एपीआई कुंजी",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.categories.entries": "विषयवस्तुया", "page.categories.entries": "विषयवस्तुया",
"page.categories.feed_count": [ "page.categories.feed_count": [
"%d फ़ीड बाकी है।", "%d फ़ीड बाकी है।",
@ -440,6 +437,10 @@
"page.categories.feeds": "सदस्यता ले", "page.categories.feeds": "सदस्यता ले",
"page.categories.no_feed": "कोई फ़ीड नहीं है।", "page.categories.no_feed": "कोई फ़ीड नहीं है।",
"page.categories.title": "श्रेणियाँ", "page.categories.title": "श्रेणियाँ",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "%s श्रेणी संपाद करे", "page.edit_category.title": "%s श्रेणी संपाद करे",
"page.edit_feed.etag_header": "ईटाग हैडर:", "page.edit_feed.etag_header": "ईटाग हैडर:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "रजिस्टर पासकी", "page.settings.webauthn.register": "रजिस्टर पासकी",
"page.settings.webauthn.register.error": "पासकी पंजीकृत करने में असमर्थ", "page.settings.webauthn.register.error": "पासकी पंजीकृत करने में असमर्थ",
"page.shared_entries.title": "साझा किया हुआ प्रविष्टि",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "साझा किया हुआ प्रविष्टि", "page.starred.title": "तारांकित",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "तारांकित",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "अपठित",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "अपठित",
"page.users.actions": "कार्रवाई", "page.users.actions": "कार्रवाई",
"page.users.admin.no": "नहीं", "page.users.admin.no": "नहीं",
"page.users.admin.yes": "हां", "page.users.admin.yes": "हां",

View file

@ -346,6 +346,7 @@
"form.prefs.label.mark_read_on_view": "Secara otomatis menandai entri sebagai telah dibaca saat dilihat", "form.prefs.label.mark_read_on_view": "Secara otomatis menandai entri sebagai telah dibaca saat dilihat",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Kecepatan pemutaran audio/video", "form.prefs.label.media_playback_rate": "Kecepatan pemutaran audio/video",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Tampilkan perkiraan waktu baca untuk artikel", "form.prefs.label.show_reading_time": "Tampilkan perkiraan waktu baca untuk artikel",
"form.prefs.label.theme": "Tema", "form.prefs.label.theme": "Tema",
"form.prefs.label.timezone": "Zona Waktu", "form.prefs.label.timezone": "Zona Waktu",
@ -426,9 +427,6 @@
"page.api_keys.table.last_used_at": "Terakhir Digunakan", "page.api_keys.table.last_used_at": "Terakhir Digunakan",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "Kunci API", "page.api_keys.title": "Kunci API",
"page.categories_count": [
"%d category"
],
"page.categories.entries": "Artikel", "page.categories.entries": "Artikel",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Ada %d umpan." "Ada %d umpan."
@ -436,6 +434,9 @@
"page.categories.feeds": "Langganan", "page.categories.feeds": "Langganan",
"page.categories.no_feed": "Tidak ada umpan.", "page.categories.no_feed": "Tidak ada umpan.",
"page.categories.title": "Kategori", "page.categories.title": "Kategori",
"page.categories_count": [
"%d category"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "Sunting Kategori: %s", "page.edit_category.title": "Sunting Kategori: %s",
"page.edit_feed.etag_header": "Tajuk ETag:", "page.edit_feed.etag_header": "Tajuk ETag:",
@ -538,21 +539,21 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Register passkey", "page.settings.webauthn.register": "Register passkey",
"page.settings.webauthn.register.error": "Unable to register passkey", "page.settings.webauthn.register.error": "Unable to register passkey",
"page.shared_entries.title": "Entri yang Dibagikan",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry" "%d shared entry"
], ],
"page.shared_entries.title": "Entri yang Dibagikan", "page.starred.title": "Markah",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry" "%d starred entry"
], ],
"page.starred.title": "Markah",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total" "%d entry in total"
], ],
"page.unread.title": "Belum Dibaca",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry" "%d unread entry"
], ],
"page.unread.title": "Belum Dibaca",
"page.users.actions": "Tindakan", "page.users.actions": "Tindakan",
"page.users.admin.no": "Tidak", "page.users.admin.no": "Tidak",
"page.users.admin.yes": "Ya", "page.users.admin.yes": "Ya",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Contrassegna automaticamente le voci come lette quando visualizzate", "form.prefs.label.mark_read_on_view": "Contrassegna automaticamente le voci come lette quando visualizzate",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Velocità di riproduzione dell'audio/video", "form.prefs.label.media_playback_rate": "Velocità di riproduzione dell'audio/video",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Mostra il tempo di lettura stimato per gli articoli", "form.prefs.label.show_reading_time": "Mostra il tempo di lettura stimato per gli articoli",
"form.prefs.label.theme": "Tema", "form.prefs.label.theme": "Tema",
"form.prefs.label.timezone": "Fuso orario", "form.prefs.label.timezone": "Fuso orario",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Ultimo uso", "page.api_keys.table.last_used_at": "Ultimo uso",
"page.api_keys.table.token": "Gettone", "page.api_keys.table.token": "Gettone",
"page.api_keys.title": "Chiavi API", "page.api_keys.title": "Chiavi API",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.categories.entries": "Articoli", "page.categories.entries": "Articoli",
"page.categories.feed_count": [ "page.categories.feed_count": [
"C'è %d feed.", "C'è %d feed.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Abbonamenti", "page.categories.feeds": "Abbonamenti",
"page.categories.no_feed": "Nessun feed.", "page.categories.no_feed": "Nessun feed.",
"page.categories.title": "Categorie", "page.categories.title": "Categorie",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "Modifica categoria: %s", "page.edit_category.title": "Modifica categoria: %s",
"page.edit_feed.etag_header": "Header ETag:", "page.edit_feed.etag_header": "Header ETag:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Registra la chiave di accesso", "page.settings.webauthn.register": "Registra la chiave di accesso",
"page.settings.webauthn.register.error": "Impossibile registrare la passkey", "page.settings.webauthn.register.error": "Impossibile registrare la passkey",
"page.shared_entries.title": "Voci condivise",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "Voci condivise", "page.starred.title": "Preferiti",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "Preferiti",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "Da leggere",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "Da leggere",
"page.users.actions": "Azioni", "page.users.actions": "Azioni",
"page.users.admin.no": "No", "page.users.admin.no": "No",
"page.users.admin.yes": "Sì", "page.users.admin.yes": "Sì",

View file

@ -346,6 +346,7 @@
"form.prefs.label.mark_read_on_view": "表示時にエントリを自動的に既読としてマークします", "form.prefs.label.mark_read_on_view": "表示時にエントリを自動的に既読としてマークします",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "オーディオ/ビデオの再生速度", "form.prefs.label.media_playback_rate": "オーディオ/ビデオの再生速度",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "記事の推定読書時間を表示する", "form.prefs.label.show_reading_time": "記事の推定読書時間を表示する",
"form.prefs.label.theme": "テーマ", "form.prefs.label.theme": "テーマ",
"form.prefs.label.timezone": "タイムゾーン", "form.prefs.label.timezone": "タイムゾーン",
@ -426,9 +427,6 @@
"page.api_keys.table.last_used_at": "最終使用", "page.api_keys.table.last_used_at": "最終使用",
"page.api_keys.table.token": "トークン", "page.api_keys.table.token": "トークン",
"page.api_keys.title": "API キー", "page.api_keys.title": "API キー",
"page.categories_count": [
"%d category"
],
"page.categories.entries": "記事一覧", "page.categories.entries": "記事一覧",
"page.categories.feed_count": [ "page.categories.feed_count": [
"%d 件のフィードがあります。" "%d 件のフィードがあります。"
@ -436,6 +434,9 @@
"page.categories.feeds": "フィード一覧", "page.categories.feeds": "フィード一覧",
"page.categories.no_feed": "フィードはありません。", "page.categories.no_feed": "フィードはありません。",
"page.categories.title": "カテゴリ", "page.categories.title": "カテゴリ",
"page.categories_count": [
"%d category"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "カテゴリを編集: %s", "page.edit_category.title": "カテゴリを編集: %s",
"page.edit_feed.etag_header": "ETag ヘッダー:", "page.edit_feed.etag_header": "ETag ヘッダー:",
@ -538,21 +539,21 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "パスキーを登録する", "page.settings.webauthn.register": "パスキーを登録する",
"page.settings.webauthn.register.error": "パスキーを登録できません", "page.settings.webauthn.register.error": "パスキーを登録できません",
"page.shared_entries.title": "共有エントリ",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry" "%d shared entry"
], ],
"page.shared_entries.title": "共有エントリ", "page.starred.title": "星付き",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry" "%d starred entry"
], ],
"page.starred.title": "星付き",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total" "%d entry in total"
], ],
"page.unread.title": "未読",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry" "%d unread entry"
], ],
"page.unread.title": "未読",
"page.users.actions": "アクション", "page.users.actions": "アクション",
"page.users.admin.no": "非管理者", "page.users.admin.no": "非管理者",
"page.users.admin.yes": "管理者", "page.users.admin.yes": "管理者",

View file

@ -346,6 +346,7 @@
"form.prefs.label.mark_read_on_view": "Phah khui ê sî-chūn sūn-sòa kā siau-sit chù chòe tha̍k kè", "form.prefs.label.mark_read_on_view": "Phah khui ê sî-chūn sūn-sòa kā siau-sit chù chòe tha̍k kè",
"form.prefs.label.mark_read_on_view_or_media_completion": "Phah khui ê sî-chūn sūn-sòa kā siau-sit chù chòe tha̍k kè, m̄-koh nā-sī im-sìn, sī-sìn tio̍h tī hòng-sàng kàu 90%% ê si-chun chiah lâi chù", "form.prefs.label.mark_read_on_view_or_media_completion": "Phah khui ê sî-chūn sūn-sòa kā siau-sit chù chòe tha̍k kè, m̄-koh nā-sī im-sìn, sī-sìn tio̍h tī hòng-sàng kàu 90%% ê si-chun chiah lâi chù",
"form.prefs.label.media_playback_rate": "Im-sìn, sī-sìn pàng ê sok-tō͘", "form.prefs.label.media_playback_rate": "Im-sìn, sī-sìn pàng ê sok-tō͘",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Hián-sī siau-sit àn-sǹg ài gōa-kú lâi tha̍k", "form.prefs.label.show_reading_time": "Hián-sī siau-sit àn-sǹg ài gōa-kú lâi tha̍k",
"form.prefs.label.theme": "Chú-tôe", "form.prefs.label.theme": "Chú-tôe",
"form.prefs.label.timezone": "Sî-khu", "form.prefs.label.timezone": "Sî-khu",
@ -426,9 +427,6 @@
"page.api_keys.table.last_used_at": "Siōng-bóe pái sú-iōng", "page.api_keys.table.last_used_at": "Siōng-bóe pái sú-iōng",
"page.api_keys.table.token": "Só-sî", "page.api_keys.table.token": "Só-sî",
"page.api_keys.title": "API só-sî", "page.api_keys.title": "API só-sî",
"page.categories_count": [
"%d ê lūi-pia̍t"
],
"page.categories.entries": "Siau-sit", "page.categories.entries": "Siau-sit",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Ū %d ê Siau-sit lâi-goân" "Ū %d ê Siau-sit lâi-goân"
@ -436,6 +434,9 @@
"page.categories.feeds": "Siau-sit lâi-goân", "page.categories.feeds": "Siau-sit lâi-goân",
"page.categories.no_feed": "Ah-bô siau-sit lâi-goân", "page.categories.no_feed": "Ah-bô siau-sit lâi-goân",
"page.categories.title": "Lūi-pia̍t", "page.categories.title": "Lūi-pia̍t",
"page.categories_count": [
"%d ê lūi-pia̍t"
],
"page.category_label": "Lūi-pia̍t: %s", "page.category_label": "Lūi-pia̍t: %s",
"page.edit_category.title": "Pian-chi̍p lūi-pia̍t: %s", "page.edit_category.title": "Pian-chi̍p lūi-pia̍t: %s",
"page.edit_feed.etag_header": "ETag piau-thâu:", "page.edit_feed.etag_header": "ETag piau-thâu:",
@ -538,21 +539,21 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Chù-chheh Passkey", "page.settings.webauthn.register": "Chù-chheh Passkey",
"page.settings.webauthn.register.error": "Bô-hoat-tō͘ chù-chheh Passkey", "page.settings.webauthn.register.error": "Bô-hoat-tō͘ chù-chheh Passkey",
"page.shared_entries.title": "Hun-hióng kè ê siau-sit",
"page.shared_entries_count": [ "page.shared_entries_count": [
"Í-keng hun-hióng %d ê siau-sit" "Í-keng hun-hióng %d ê siau-sit"
], ],
"page.shared_entries.title": "Hun-hióng kè ê siau-sit", "page.starred.title": "Siu-chông",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d ê siu-chông ê siau-sit" "%d ê siu-chông ê siau-sit"
], ],
"page.starred.title": "Siu-chông",
"page.total_entry_count": [ "page.total_entry_count": [
"Lóng-chóng %d ê siau-sit" "Lóng-chóng %d ê siau-sit"
], ],
"page.unread.title": "Ah-bōe tha̍k",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d ê siau-sit ah-bōe tha̍k" "%d ê siau-sit ah-bōe tha̍k"
], ],
"page.unread.title": "Ah-bōe tha̍k",
"page.users.actions": "chhau-chok", "page.users.actions": "chhau-chok",
"page.users.admin.no": "Hóⁿ", "page.users.admin.no": "Hóⁿ",
"page.users.admin.yes": "Sī", "page.users.admin.yes": "Sī",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Markeer artikelen automatisch als gelezen wanneer ze worden bekeken", "form.prefs.label.mark_read_on_view": "Markeer artikelen automatisch als gelezen wanneer ze worden bekeken",
"form.prefs.label.mark_read_on_view_or_media_completion": "Markeer artikelen als gelezen wanneer ze worden bekeken. Voor audio/video, markeer als gelezen bij 90%% voltooiing", "form.prefs.label.mark_read_on_view_or_media_completion": "Markeer artikelen als gelezen wanneer ze worden bekeken. Voor audio/video, markeer als gelezen bij 90%% voltooiing",
"form.prefs.label.media_playback_rate": "Afspeelsnelheid van de audio/video", "form.prefs.label.media_playback_rate": "Afspeelsnelheid van de audio/video",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Toon geschatte leestijd van artikelen", "form.prefs.label.show_reading_time": "Toon geschatte leestijd van artikelen",
"form.prefs.label.theme": "Thema", "form.prefs.label.theme": "Thema",
"form.prefs.label.timezone": "Tijdzone", "form.prefs.label.timezone": "Tijdzone",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Laatst gebruikt", "page.api_keys.table.last_used_at": "Laatst gebruikt",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "API-sleutels", "page.api_keys.title": "API-sleutels",
"page.categories_count": [
"%d categorie",
"%d categorieën"
],
"page.categories.entries": "Artikelen", "page.categories.entries": "Artikelen",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Er is %d feed.", "Er is %d feed.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Feeds", "page.categories.feeds": "Feeds",
"page.categories.no_feed": "Geen feed.", "page.categories.no_feed": "Geen feed.",
"page.categories.title": "Categorieën", "page.categories.title": "Categorieën",
"page.categories_count": [
"%d categorie",
"%d categorieën"
],
"page.category_label": "Categorie: %s", "page.category_label": "Categorie: %s",
"page.edit_category.title": "Bewerk categorie: %s", "page.edit_category.title": "Bewerk categorie: %s",
"page.edit_feed.etag_header": "ETAG header:", "page.edit_feed.etag_header": "ETAG header:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Passkey registreren", "page.settings.webauthn.register": "Passkey registreren",
"page.settings.webauthn.register.error": "Kan passkey niet registreren", "page.settings.webauthn.register.error": "Kan passkey niet registreren",
"page.shared_entries.title": "Gedeelde artikelen",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d gedeeld artikel", "%d gedeeld artikel",
"%d gedeelde artikelen" "%d gedeelde artikelen"
], ],
"page.shared_entries.title": "Gedeelde artikelen", "page.starred.title": "Favorieten",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d favoriet artikel", "%d favoriet artikel",
"%d favoriete artikelen" "%d favoriete artikelen"
], ],
"page.starred.title": "Favorieten",
"page.total_entry_count": [ "page.total_entry_count": [
"%d artikel totaal", "%d artikel totaal",
"%d artikelen totaal" "%d artikelen totaal"
], ],
"page.unread.title": "Ongelezen",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d ongelezen artikel", "%d ongelezen artikel",
"%d ongelezen artikelen" "%d ongelezen artikelen"
], ],
"page.unread.title": "Ongelezen",
"page.users.actions": "Acties", "page.users.actions": "Acties",
"page.users.admin.no": "Nee", "page.users.admin.no": "Nee",
"page.users.admin.yes": "Ja", "page.users.admin.yes": "Ja",

View file

@ -350,6 +350,7 @@
"form.prefs.label.mark_read_on_view": "Automatycznie oznacz wpisy jako przeczytane podczas przeglądania", "form.prefs.label.mark_read_on_view": "Automatycznie oznacz wpisy jako przeczytane podczas przeglądania",
"form.prefs.label.mark_read_on_view_or_media_completion": "Oznacz wpisy jako przeczytane po wyświetleniu. W przypadku audio i wideo oznacz jako przeczytane po ukończeniu 90%%", "form.prefs.label.mark_read_on_view_or_media_completion": "Oznacz wpisy jako przeczytane po wyświetleniu. W przypadku audio i wideo oznacz jako przeczytane po ukończeniu 90%%",
"form.prefs.label.media_playback_rate": "Szybkość odtwarzania audio i wideo", "form.prefs.label.media_playback_rate": "Szybkość odtwarzania audio i wideo",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Pokaż szacowany czas czytania wpisów", "form.prefs.label.show_reading_time": "Pokaż szacowany czas czytania wpisów",
"form.prefs.label.theme": "Wygląd", "form.prefs.label.theme": "Wygląd",
"form.prefs.label.timezone": "Strefa czasowa", "form.prefs.label.timezone": "Strefa czasowa",
@ -430,11 +431,6 @@
"page.api_keys.table.last_used_at": "Ostatnio używane", "page.api_keys.table.last_used_at": "Ostatnio używane",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "Klucze API", "page.api_keys.title": "Klucze API",
"page.categories_count": [
"%d kategoria",
"%d kategorie",
"%d kategorii"
],
"page.categories.entries": "Wpisy", "page.categories.entries": "Wpisy",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Jest %d kanał.", "Jest %d kanał.",
@ -444,6 +440,11 @@
"page.categories.feeds": "Kanały", "page.categories.feeds": "Kanały",
"page.categories.no_feed": "Brak kanałów.", "page.categories.no_feed": "Brak kanałów.",
"page.categories.title": "Kategorie", "page.categories.title": "Kategorie",
"page.categories_count": [
"%d kategoria",
"%d kategorie",
"%d kategorii"
],
"page.category_label": "Kategoria: %s", "page.category_label": "Kategoria: %s",
"page.edit_category.title": "Edytuj kategorię: %s", "page.edit_category.title": "Edytuj kategorię: %s",
"page.edit_feed.etag_header": "Nagłówek ETag:", "page.edit_feed.etag_header": "Nagłówek ETag:",
@ -552,29 +553,29 @@
"page.settings.webauthn.passkeys": "Klucze dostępu", "page.settings.webauthn.passkeys": "Klucze dostępu",
"page.settings.webauthn.register": "Zarejestruj klucz dostępu", "page.settings.webauthn.register": "Zarejestruj klucz dostępu",
"page.settings.webauthn.register.error": "Nie można zarejestrować klucza dostępu", "page.settings.webauthn.register.error": "Nie można zarejestrować klucza dostępu",
"page.shared_entries.title": "Udostępnione wpisy",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d udostępniony wpis", "%d udostępniony wpis",
"%d udostępnione wpisy", "%d udostępnione wpisy",
"%d udostępnionych wpisów" "%d udostępnionych wpisów"
], ],
"page.shared_entries.title": "Udostępnione wpisy", "page.starred.title": "Ulubione",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d ulubiony wpis", "%d ulubiony wpis",
"%d ulubione wpisy", "%d ulubione wpisy",
"%d ulubionych wpisów" "%d ulubionych wpisów"
], ],
"page.starred.title": "Ulubione",
"page.total_entry_count": [ "page.total_entry_count": [
"%d wpis łącznie", "%d wpis łącznie",
"%d wpisy łącznie", "%d wpisy łącznie",
"%d wpisów łącznie" "%d wpisów łącznie"
], ],
"page.unread.title": "Nieprzeczytane",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d nieprzeczytany wpis", "%d nieprzeczytany wpis",
"%d nieprzeczytane wpisy", "%d nieprzeczytane wpisy",
"%d nieprzeczytanych wpisów" "%d nieprzeczytanych wpisów"
], ],
"page.unread.title": "Nieprzeczytane",
"page.users.actions": "Działania", "page.users.actions": "Działania",
"page.users.admin.no": "Nie", "page.users.admin.no": "Nie",
"page.users.admin.yes": "Tak", "page.users.admin.yes": "Tak",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Marcar automaticamente as entradas como lidas quando visualizadas", "form.prefs.label.mark_read_on_view": "Marcar automaticamente as entradas como lidas quando visualizadas",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Velocidade de reprodução do áudio/vídeo", "form.prefs.label.media_playback_rate": "Velocidade de reprodução do áudio/vídeo",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Mostrar tempo estimado de leitura de artigos", "form.prefs.label.show_reading_time": "Mostrar tempo estimado de leitura de artigos",
"form.prefs.label.theme": "Tema", "form.prefs.label.theme": "Tema",
"form.prefs.label.timezone": "Fuso horário", "form.prefs.label.timezone": "Fuso horário",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Ultima utilização", "page.api_keys.table.last_used_at": "Ultima utilização",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "Chaves de API", "page.api_keys.title": "Chaves de API",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.categories.entries": "Itens", "page.categories.entries": "Itens",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Existe %d fonte.", "Existe %d fonte.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Inscrições", "page.categories.feeds": "Inscrições",
"page.categories.no_feed": "Sem fonte.", "page.categories.no_feed": "Sem fonte.",
"page.categories.title": "Categorias", "page.categories.title": "Categorias",
"page.categories_count": [
"%d category",
"%d categories"
],
"page.category_label": "Category: %s", "page.category_label": "Category: %s",
"page.edit_category.title": "Editar categoria: %s", "page.edit_category.title": "Editar categoria: %s",
"page.edit_feed.etag_header": "Cabeçalho 'ETag':", "page.edit_feed.etag_header": "Cabeçalho 'ETag':",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Registrar senha", "page.settings.webauthn.register": "Registrar senha",
"page.settings.webauthn.register.error": "Não foi possível registrar a senha", "page.settings.webauthn.register.error": "Não foi possível registrar a senha",
"page.shared_entries.title": "Itens compartilhados",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "Itens compartilhados", "page.starred.title": "Favoritos",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "Favoritos",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "Não lidos",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "Não lidos",
"page.users.actions": "Ações", "page.users.actions": "Ações",
"page.users.admin.no": "Não", "page.users.admin.no": "Não",
"page.users.admin.yes": "Sim", "page.users.admin.yes": "Sim",

View file

@ -350,6 +350,7 @@
"form.prefs.label.mark_read_on_view": "Marchează intrările ca citite la vizualizare", "form.prefs.label.mark_read_on_view": "Marchează intrările ca citite la vizualizare",
"form.prefs.label.mark_read_on_view_or_media_completion": "Marchează intrările ca citite la vizualizare. Pentru audio/video, marchează ca citit la redarea a 90%% de conținut", "form.prefs.label.mark_read_on_view_or_media_completion": "Marchează intrările ca citite la vizualizare. Pentru audio/video, marchează ca citit la redarea a 90%% de conținut",
"form.prefs.label.media_playback_rate": "Viteza de rulare audio/video", "form.prefs.label.media_playback_rate": "Viteza de rulare audio/video",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Afișare timp estimat de citire pentru înregistrări", "form.prefs.label.show_reading_time": "Afișare timp estimat de citire pentru înregistrări",
"form.prefs.label.theme": "Temă", "form.prefs.label.theme": "Temă",
"form.prefs.label.timezone": "Fus orar", "form.prefs.label.timezone": "Fus orar",
@ -430,11 +431,6 @@
"page.api_keys.table.last_used_at": "Utilizat ultima dată", "page.api_keys.table.last_used_at": "Utilizat ultima dată",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "Chei API", "page.api_keys.title": "Chei API",
"page.categories_count": [
"%d categorie",
"%d categorii",
"%d categorie găsită"
],
"page.categories.entries": "Intrări", "page.categories.entries": "Intrări",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Este %d flux.", "Este %d flux.",
@ -444,6 +440,11 @@
"page.categories.feeds": "Fluxuri", "page.categories.feeds": "Fluxuri",
"page.categories.no_feed": "Nici un flux.", "page.categories.no_feed": "Nici un flux.",
"page.categories.title": "Categorii", "page.categories.title": "Categorii",
"page.categories_count": [
"%d categorie",
"%d categorii",
"%d categorie găsită"
],
"page.category_label": "Categorie: %s", "page.category_label": "Categorie: %s",
"page.edit_category.title": "Editare Categorie: %s", "page.edit_category.title": "Editare Categorie: %s",
"page.edit_feed.etag_header": "Antet ETag:", "page.edit_feed.etag_header": "Antet ETag:",
@ -552,29 +553,29 @@
"page.settings.webauthn.passkeys": "Chei Acces", "page.settings.webauthn.passkeys": "Chei Acces",
"page.settings.webauthn.register": "Înregistrare cheie acces", "page.settings.webauthn.register": "Înregistrare cheie acces",
"page.settings.webauthn.register.error": "Eroare la înregistrarea cheii de acces", "page.settings.webauthn.register.error": "Eroare la înregistrarea cheii de acces",
"page.shared_entries.title": "Înregistrări partajate",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d înregistrare partajată", "%d înregistrare partajată",
"%d înregistrări partajate", "%d înregistrări partajate",
"%d înregistrări partajate" "%d înregistrări partajate"
], ],
"page.shared_entries.title": "Înregistrări partajate", "page.starred.title": "Marcate",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d înregistrare marcată", "%d înregistrare marcată",
"%d Înregistrări marcate", "%d Înregistrări marcate",
"%d Înregistrări marcate" "%d Înregistrări marcate"
], ],
"page.starred.title": "Marcate",
"page.total_entry_count": [ "page.total_entry_count": [
"%d intrare în total", "%d intrare în total",
"%d intrări în total", "%d intrări în total",
"%d intrări în total" "%d intrări în total"
], ],
"page.unread.title": "Necitite",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d înregistrare necitită", "%d înregistrare necitită",
"%d înregistrări necitite", "%d înregistrări necitite",
"%d înregistrări necitite" "%d înregistrări necitite"
], ],
"page.unread.title": "Necitite",
"page.users.actions": "Acțiuni", "page.users.actions": "Acțiuni",
"page.users.admin.no": "Nu", "page.users.admin.no": "Nu",
"page.users.admin.yes": "Da", "page.users.admin.yes": "Da",

View file

@ -30,9 +30,9 @@
"alert.pocket_linked": "Ваш Pocket аккаунт теперь привязан!", "alert.pocket_linked": "Ваш Pocket аккаунт теперь привязан!",
"alert.prefs_saved": "Предпочтения сохранены!", "alert.prefs_saved": "Предпочтения сохранены!",
"alert.too_many_feeds_refresh": [ "alert.too_many_feeds_refresh": [
"Вы запустили слишком много обновлений подписок. Подождите %d минуту для нового запуска", "Вы запустили слишком много обновлений подписок. Подождите %d минуту для нового запуска",
"Вы запустили слишком много обновлений подписок. Подождите %d минут для нового запуска", "Вы запустили слишком много обновлений подписок. Подождите %d минут для нового запуска",
"Вы запустили слишком много обновлений подписок. Подождите %d минут для нового запуска" "Вы запустили слишком много обновлений подписок. Подождите %d минут для нового запуска"
], ],
"confirm.loading": "В процессе…", "confirm.loading": "В процессе…",
"confirm.no": "нет", "confirm.no": "нет",
@ -350,6 +350,7 @@
"form.prefs.label.mark_read_on_view": "Автоматически отмечать записи как прочитанные при просмотре", "form.prefs.label.mark_read_on_view": "Автоматически отмечать записи как прочитанные при просмотре",
"form.prefs.label.mark_read_on_view_or_media_completion": "Отмечать статьи как прочитанные при просмотре. Для аудио/видео - при 90%% завершения воспроизведения", "form.prefs.label.mark_read_on_view_or_media_completion": "Отмечать статьи как прочитанные при просмотре. Для аудио/видео - при 90%% завершения воспроизведения",
"form.prefs.label.media_playback_rate": "Скорость воспроизведения аудио/видео", "form.prefs.label.media_playback_rate": "Скорость воспроизведения аудио/видео",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Показать примерное время чтения статей", "form.prefs.label.show_reading_time": "Показать примерное время чтения статей",
"form.prefs.label.theme": "Тема", "form.prefs.label.theme": "Тема",
"form.prefs.label.timezone": "Часовой пояс", "form.prefs.label.timezone": "Часовой пояс",
@ -430,11 +431,6 @@
"page.api_keys.table.last_used_at": "Последнее использование", "page.api_keys.table.last_used_at": "Последнее использование",
"page.api_keys.table.token": "Токен", "page.api_keys.table.token": "Токен",
"page.api_keys.title": "API-ключи", "page.api_keys.title": "API-ключи",
"page.categories_count": [
"%d категория",
"%d категории",
"%d категорий"
],
"page.categories.entries": "Статьи", "page.categories.entries": "Статьи",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Есть %d подписка.", "Есть %d подписка.",
@ -444,6 +440,11 @@
"page.categories.feeds": "Подписки", "page.categories.feeds": "Подписки",
"page.categories.no_feed": "Нет подписок.", "page.categories.no_feed": "Нет подписок.",
"page.categories.title": "Категории", "page.categories.title": "Категории",
"page.categories_count": [
"%d категория",
"%d категории",
"%d категорий"
],
"page.category_label": "Категории: %s", "page.category_label": "Категории: %s",
"page.edit_category.title": "Изменить категорию: %s", "page.edit_category.title": "Изменить категорию: %s",
"page.edit_feed.etag_header": "Заголовок ETag:", "page.edit_feed.etag_header": "Заголовок ETag:",
@ -552,29 +553,29 @@
"page.settings.webauthn.passkeys": "Ключи доступа", "page.settings.webauthn.passkeys": "Ключи доступа",
"page.settings.webauthn.register": "Зарегистрировать пароль", "page.settings.webauthn.register": "Зарегистрировать пароль",
"page.settings.webauthn.register.error": "Не удается зарегистрировать пароль", "page.settings.webauthn.register.error": "Не удается зарегистрировать пароль",
"page.shared_entries.title": "Общедоступные статьи",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d общедоступная статья", "%d общедоступная статья",
"%d общедоступных статьи", "%d общедоступных статьи",
"%d общедоступных статей" "%d общедоступных статей"
], ],
"page.shared_entries.title": "Общедоступные статьи", "page.starred.title": "Избранное",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d избранная статья", "%d избранная статья",
"%d избранные статьи", "%d избранные статьи",
"%d избранных статей" "%d избранных статей"
], ],
"page.starred.title": "Избранное",
"page.total_entry_count": [ "page.total_entry_count": [
"%d статья всего", "%d статья всего",
"%d статьи всего", "%d статьи всего",
"%d статей всего" "%d статей всего"
], ],
"page.unread.title": "Непрочитанное",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d непрочитанная статья", "%d непрочитанная статья",
"%d непрочитанных статьи", "%d непрочитанных статьи",
"%d непрочитанных статей" "%d непрочитанных статей"
], ],
"page.unread.title": "Непрочитанное",
"page.users.actions": "Действия", "page.users.actions": "Действия",
"page.users.admin.no": "Нет", "page.users.admin.no": "Нет",
"page.users.admin.yes": "Да", "page.users.admin.yes": "Да",

View file

@ -348,6 +348,7 @@
"form.prefs.label.mark_read_on_view": "Makaleler görüntülendiğinde otomatik olarak okundu olarak işaretle", "form.prefs.label.mark_read_on_view": "Makaleler görüntülendiğinde otomatik olarak okundu olarak işaretle",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Ses/video oynatma hızı", "form.prefs.label.media_playback_rate": "Ses/video oynatma hızı",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Makaleler için tahmini okuma süresini göster", "form.prefs.label.show_reading_time": "Makaleler için tahmini okuma süresini göster",
"form.prefs.label.theme": "Tema", "form.prefs.label.theme": "Tema",
"form.prefs.label.timezone": "Saat Dilimi", "form.prefs.label.timezone": "Saat Dilimi",
@ -428,10 +429,6 @@
"page.api_keys.table.last_used_at": "Son Kullanılma", "page.api_keys.table.last_used_at": "Son Kullanılma",
"page.api_keys.table.token": "Token", "page.api_keys.table.token": "Token",
"page.api_keys.title": "API Anahtarları", "page.api_keys.title": "API Anahtarları",
"page.categories_count": [
"%d kategori",
"%d kategori"
],
"page.categories.entries": "Makaleler", "page.categories.entries": "Makaleler",
"page.categories.feed_count": [ "page.categories.feed_count": [
"%d besleme var.", "%d besleme var.",
@ -440,6 +437,10 @@
"page.categories.feeds": "Beslemeler", "page.categories.feeds": "Beslemeler",
"page.categories.no_feed": "Besleme yok.", "page.categories.no_feed": "Besleme yok.",
"page.categories.title": "Kategoriler", "page.categories.title": "Kategoriler",
"page.categories_count": [
"%d kategori",
"%d kategori"
],
"page.category_label": "Kategori: %s", "page.category_label": "Kategori: %s",
"page.edit_category.title": "Kategoriyi Düzenle: %s", "page.edit_category.title": "Kategoriyi Düzenle: %s",
"page.edit_feed.etag_header": "ETag başlığı:", "page.edit_feed.etag_header": "ETag başlığı:",
@ -545,25 +546,25 @@
"page.settings.webauthn.passkeys": "Passkeyler", "page.settings.webauthn.passkeys": "Passkeyler",
"page.settings.webauthn.register": "Passkey'i kaydet", "page.settings.webauthn.register": "Passkey'i kaydet",
"page.settings.webauthn.register.error": "Passkey kaydedilemiyor", "page.settings.webauthn.register.error": "Passkey kaydedilemiyor",
"page.shared_entries.title": "Paylaşılan makaleler",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d paylaşılan makaleler", "%d paylaşılan makaleler",
"%d paylaşılan makaleler" "%d paylaşılan makaleler"
], ],
"page.shared_entries.title": "Paylaşılan makaleler", "page.starred.title": "Yıldızlı",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d yıldızlanmış makale", "%d yıldızlanmış makale",
"%d yıldızlanmış makale" "%d yıldızlanmış makale"
], ],
"page.starred.title": "Yıldızlı",
"page.total_entry_count": [ "page.total_entry_count": [
"Toplamda %d makale", "Toplamda %d makale",
"Toplamda %d makale" "Toplamda %d makale"
], ],
"page.unread.title": "Okunmadı",
"page.unread_entry_count": [ "page.unread_entry_count": [
"Toplamda %d okunmamış makale", "Toplamda %d okunmamış makale",
"Toplamda %d okunmamış makale" "Toplamda %d okunmamış makale"
], ],
"page.unread.title": "Okunmadı",
"page.users.actions": "Eylemler", "page.users.actions": "Eylemler",
"page.users.admin.no": "Hayır", "page.users.admin.no": "Hayır",
"page.users.admin.yes": "Evet", "page.users.admin.yes": "Evet",

View file

@ -350,6 +350,7 @@
"form.prefs.label.mark_read_on_view": "Автоматично позначати записи як прочитані під час перегляду", "form.prefs.label.mark_read_on_view": "Автоматично позначати записи як прочитані під час перегляду",
"form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion",
"form.prefs.label.media_playback_rate": "Швидкість відтворення аудіо/відео", "form.prefs.label.media_playback_rate": "Швидкість відтворення аудіо/відео",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "Показувати приблизний час читання для записів", "form.prefs.label.show_reading_time": "Показувати приблизний час читання для записів",
"form.prefs.label.theme": "Тема", "form.prefs.label.theme": "Тема",
"form.prefs.label.timezone": "Часовий пояс", "form.prefs.label.timezone": "Часовий пояс",
@ -430,11 +431,6 @@
"page.api_keys.table.last_used_at": "Дата останнього використання", "page.api_keys.table.last_used_at": "Дата останнього використання",
"page.api_keys.table.token": "Токен", "page.api_keys.table.token": "Токен",
"page.api_keys.title": "Ключі API", "page.api_keys.title": "Ключі API",
"page.categories_count": [
"%d category",
"%d categories",
"%d categories"
],
"page.categories.entries": "Статті", "page.categories.entries": "Статті",
"page.categories.feed_count": [ "page.categories.feed_count": [
"Містить %d стрічку.", "Містить %d стрічку.",
@ -444,6 +440,11 @@
"page.categories.feeds": "Підписки", "page.categories.feeds": "Підписки",
"page.categories.no_feed": "Немає стрічки.", "page.categories.no_feed": "Немає стрічки.",
"page.categories.title": "Категорії", "page.categories.title": "Категорії",
"page.categories_count": [
"%d category",
"%d categories",
"%d categories"
],
"page.category_label": "Категорія: %s", "page.category_label": "Категорія: %s",
"page.edit_category.title": "Редагування категорії: %s", "page.edit_category.title": "Редагування категорії: %s",
"page.edit_feed.etag_header": "Заголовок ETag:", "page.edit_feed.etag_header": "Заголовок ETag:",
@ -552,29 +553,29 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "Зареєструвати пароль", "page.settings.webauthn.register": "Зареєструвати пароль",
"page.settings.webauthn.register.error": "Не вдалося зареєструвати ключ доступу", "page.settings.webauthn.register.error": "Не вдалося зареєструвати ключ доступу",
"page.shared_entries.title": "Спільні записи",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d shared entry", "%d shared entry",
"%d shared entries", "%d shared entries",
"%d shared entries" "%d shared entries"
], ],
"page.shared_entries.title": "Спільні записи", "page.starred.title": "З зірочкою",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d starred entry", "%d starred entry",
"%d starred entries", "%d starred entries",
"%d starred entries" "%d starred entries"
], ],
"page.starred.title": "З зірочкою",
"page.total_entry_count": [ "page.total_entry_count": [
"%d entry in total", "%d entry in total",
"%d entries in total", "%d entries in total",
"%d entries in total" "%d entries in total"
], ],
"page.unread.title": "Непрочитане",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d unread entry", "%d unread entry",
"%d unread entries", "%d unread entries",
"%d unread entries" "%d unread entries"
], ],
"page.unread.title": "Непрочитане",
"page.users.actions": "Дії", "page.users.actions": "Дії",
"page.users.admin.no": "Ні", "page.users.admin.no": "Ні",
"page.users.admin.yes": "Так", "page.users.admin.yes": "Так",

View file

@ -346,6 +346,7 @@
"form.prefs.label.mark_read_on_view": "查看时自动将条目标记为已读", "form.prefs.label.mark_read_on_view": "查看时自动将条目标记为已读",
"form.prefs.label.mark_read_on_view_or_media_completion": "当浏览时标记条目为已读。对于音频/视频当播放完成90%%时标记为已读", "form.prefs.label.mark_read_on_view_or_media_completion": "当浏览时标记条目为已读。对于音频/视频当播放完成90%%时标记为已读",
"form.prefs.label.media_playback_rate": "音频/视频的播放速度", "form.prefs.label.media_playback_rate": "音频/视频的播放速度",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "显示文章的预计阅读时间", "form.prefs.label.show_reading_time": "显示文章的预计阅读时间",
"form.prefs.label.theme": "主题", "form.prefs.label.theme": "主题",
"form.prefs.label.timezone": "时区", "form.prefs.label.timezone": "时区",
@ -426,9 +427,6 @@
"page.api_keys.table.last_used_at": "最后使用", "page.api_keys.table.last_used_at": "最后使用",
"page.api_keys.table.token": "令牌", "page.api_keys.table.token": "令牌",
"page.api_keys.title": "API 密钥", "page.api_keys.title": "API 密钥",
"page.categories_count": [
"%d 分类"
],
"page.categories.entries": "查看内容", "page.categories.entries": "查看内容",
"page.categories.feed_count": [ "page.categories.feed_count": [
"有 %d 个源" "有 %d 个源"
@ -436,6 +434,9 @@
"page.categories.feeds": "查看源", "page.categories.feeds": "查看源",
"page.categories.no_feed": "没有源", "page.categories.no_feed": "没有源",
"page.categories.title": "分类", "page.categories.title": "分类",
"page.categories_count": [
"%d 分类"
],
"page.category_label": "分类: %s", "page.category_label": "分类: %s",
"page.edit_category.title": "编辑分类 : %s", "page.edit_category.title": "编辑分类 : %s",
"page.edit_feed.etag_header": "ETag 标题:", "page.edit_feed.etag_header": "ETag 标题:",
@ -538,21 +539,21 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "注册 Passkey", "page.settings.webauthn.register": "注册 Passkey",
"page.settings.webauthn.register.error": "无法注册 Passkey", "page.settings.webauthn.register.error": "无法注册 Passkey",
"page.shared_entries.title": "已分享的文章",
"page.shared_entries_count": [ "page.shared_entries_count": [
"%d 已分享的文章" "%d 已分享的文章"
], ],
"page.shared_entries.title": "已分享的文章", "page.starred.title": "收藏",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d 收藏的文章" "%d 收藏的文章"
], ],
"page.starred.title": "收藏",
"page.total_entry_count": [ "page.total_entry_count": [
"%d 文章总数" "%d 文章总数"
], ],
"page.unread.title": "未读",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d 未读的文章" "%d 未读的文章"
], ],
"page.unread.title": "未读",
"page.users.actions": "操作", "page.users.actions": "操作",
"page.users.admin.no": "否", "page.users.admin.no": "否",
"page.users.admin.yes": "是", "page.users.admin.yes": "是",

View file

@ -346,6 +346,7 @@
"form.prefs.label.mark_read_on_view": "檢視時自動將文章標記為已讀", "form.prefs.label.mark_read_on_view": "檢視時自動將文章標記為已讀",
"form.prefs.label.mark_read_on_view_or_media_completion": "檢視文章即標記為已讀;若是音訊/視訊則在 90% 播放完成時標記", "form.prefs.label.mark_read_on_view_or_media_completion": "檢視文章即標記為已讀;若是音訊/視訊則在 90% 播放完成時標記",
"form.prefs.label.media_playback_rate": "音訊/視訊播放速度", "form.prefs.label.media_playback_rate": "音訊/視訊播放速度",
"form.prefs.label.always_open_external_links": "Read articles by opening external links",
"form.prefs.label.show_reading_time": "顯示文章的預計閱讀時間", "form.prefs.label.show_reading_time": "顯示文章的預計閱讀時間",
"form.prefs.label.theme": "主題", "form.prefs.label.theme": "主題",
"form.prefs.label.timezone": "時區", "form.prefs.label.timezone": "時區",
@ -426,9 +427,6 @@
"page.api_keys.table.last_used_at": "最後使用", "page.api_keys.table.last_used_at": "最後使用",
"page.api_keys.table.token": "金鑰", "page.api_keys.table.token": "金鑰",
"page.api_keys.title": "API 金鑰", "page.api_keys.title": "API 金鑰",
"page.categories_count": [
"%d 個分類"
],
"page.categories.entries": "檢視內容", "page.categories.entries": "檢視內容",
"page.categories.feed_count": [ "page.categories.feed_count": [
"有 %d 個 Feed" "有 %d 個 Feed"
@ -436,6 +434,9 @@
"page.categories.feeds": "檢視 Feeds", "page.categories.feeds": "檢視 Feeds",
"page.categories.no_feed": "沒有 Feed", "page.categories.no_feed": "沒有 Feed",
"page.categories.title": "分類", "page.categories.title": "分類",
"page.categories_count": [
"%d 個分類"
],
"page.category_label": "分類:%s", "page.category_label": "分類:%s",
"page.edit_category.title": "編輯分類 : %s", "page.edit_category.title": "編輯分類 : %s",
"page.edit_feed.etag_header": "ETag 標頭:", "page.edit_feed.etag_header": "ETag 標頭:",
@ -538,21 +539,21 @@
"page.settings.webauthn.passkeys": "Passkeys", "page.settings.webauthn.passkeys": "Passkeys",
"page.settings.webauthn.register": "註冊 Passkey", "page.settings.webauthn.register": "註冊 Passkey",
"page.settings.webauthn.register.error": "無法註冊 Passkey", "page.settings.webauthn.register.error": "無法註冊 Passkey",
"page.shared_entries.title": "已分享的文章",
"page.shared_entries_count": [ "page.shared_entries_count": [
"已分享 %d 篇文章" "已分享 %d 篇文章"
], ],
"page.shared_entries.title": "已分享的文章", "page.starred.title": "收藏",
"page.starred_entry_count": [ "page.starred_entry_count": [
"%d 篇收藏文章" "%d 篇收藏文章"
], ],
"page.starred.title": "收藏",
"page.total_entry_count": [ "page.total_entry_count": [
"總共 %d 篇文章" "總共 %d 篇文章"
], ],
"page.unread.title": "未讀",
"page.unread_entry_count": [ "page.unread_entry_count": [
"%d 篇未讀文章" "%d 篇未讀文章"
], ],
"page.unread.title": "未讀",
"page.users.actions": "操作", "page.users.actions": "操作",
"page.users.admin.no": "否", "page.users.admin.no": "否",
"page.users.admin.yes": "是", "page.users.admin.yes": "是",

View file

@ -41,6 +41,7 @@ type User struct {
MediaPlaybackRate float64 `json:"media_playback_rate"` MediaPlaybackRate float64 `json:"media_playback_rate"`
BlockFilterEntryRules string `json:"block_filter_entry_rules"` BlockFilterEntryRules string `json:"block_filter_entry_rules"`
KeepFilterEntryRules string `json:"keep_filter_entry_rules"` KeepFilterEntryRules string `json:"keep_filter_entry_rules"`
AlwaysOpenExternalLinks bool `json:"always_open_external_links"`
} }
// UserCreationRequest represents the request to create a user. // UserCreationRequest represents the request to create a user.
@ -82,6 +83,7 @@ type UserModificationRequest struct {
MediaPlaybackRate *float64 `json:"media_playback_rate"` MediaPlaybackRate *float64 `json:"media_playback_rate"`
BlockFilterEntryRules *string `json:"block_filter_entry_rules"` BlockFilterEntryRules *string `json:"block_filter_entry_rules"`
KeepFilterEntryRules *string `json:"keep_filter_entry_rules"` KeepFilterEntryRules *string `json:"keep_filter_entry_rules"`
AlwaysOpenExternalLinks *bool `json:"always_open_external_links"`
} }
// Patch updates the User object with the modification request. // Patch updates the User object with the modification request.
@ -197,6 +199,10 @@ func (u *UserModificationRequest) Patch(user *User) {
if u.KeepFilterEntryRules != nil { if u.KeepFilterEntryRules != nil {
user.KeepFilterEntryRules = *u.KeepFilterEntryRules user.KeepFilterEntryRules = *u.KeepFilterEntryRules
} }
if u.AlwaysOpenExternalLinks != nil {
user.AlwaysOpenExternalLinks = *u.AlwaysOpenExternalLinks
}
} }
// UseTimezone converts last login date to the given timezone. // UseTimezone converts last login date to the given timezone.

View file

@ -96,7 +96,8 @@ func (s *Storage) CreateUser(userCreationRequest *model.UserCreationRequest) (*m
mark_read_on_view, mark_read_on_view,
media_playback_rate, media_playback_rate,
block_filter_entry_rules, block_filter_entry_rules,
keep_filter_entry_rules keep_filter_entry_rules,
always_open_external_links
` `
tx, err := s.db.Begin() tx, err := s.db.Begin()
@ -140,6 +141,7 @@ func (s *Storage) CreateUser(userCreationRequest *model.UserCreationRequest) (*m
&user.MediaPlaybackRate, &user.MediaPlaybackRate,
&user.BlockFilterEntryRules, &user.BlockFilterEntryRules,
&user.KeepFilterEntryRules, &user.KeepFilterEntryRules,
&user.AlwaysOpenExternalLinks,
) )
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
@ -204,9 +206,10 @@ func (s *Storage) UpdateUser(user *model.User) error {
mark_read_on_media_player_completion=$25, mark_read_on_media_player_completion=$25,
media_playback_rate=$26, media_playback_rate=$26,
block_filter_entry_rules=$27, block_filter_entry_rules=$27,
keep_filter_entry_rules=$28 keep_filter_entry_rules=$28,
always_open_external_links=$29
WHERE WHERE
id=$29 id=$30
` `
_, err = s.db.Exec( _, err = s.db.Exec(
@ -239,6 +242,7 @@ func (s *Storage) UpdateUser(user *model.User) error {
user.MediaPlaybackRate, user.MediaPlaybackRate,
user.BlockFilterEntryRules, user.BlockFilterEntryRules,
user.KeepFilterEntryRules, user.KeepFilterEntryRules,
user.AlwaysOpenExternalLinks,
user.ID, user.ID,
) )
if err != nil { if err != nil {
@ -273,9 +277,10 @@ func (s *Storage) UpdateUser(user *model.User) error {
mark_read_on_media_player_completion=$24, mark_read_on_media_player_completion=$24,
media_playback_rate=$25, media_playback_rate=$25,
block_filter_entry_rules=$26, block_filter_entry_rules=$26,
keep_filter_entry_rules=$27 keep_filter_entry_rules=$27,
always_open_external_links=$28
WHERE WHERE
id=$28 id=$29
` `
_, err := s.db.Exec( _, err := s.db.Exec(
@ -307,6 +312,7 @@ func (s *Storage) UpdateUser(user *model.User) error {
user.MediaPlaybackRate, user.MediaPlaybackRate,
user.BlockFilterEntryRules, user.BlockFilterEntryRules,
user.KeepFilterEntryRules, user.KeepFilterEntryRules,
user.AlwaysOpenExternalLinks,
user.ID, user.ID,
) )
@ -360,7 +366,8 @@ func (s *Storage) UserByID(userID int64) (*model.User, error) {
mark_read_on_media_player_completion, mark_read_on_media_player_completion,
media_playback_rate, media_playback_rate,
block_filter_entry_rules, block_filter_entry_rules,
keep_filter_entry_rules keep_filter_entry_rules,
always_open_external_links
FROM FROM
users users
WHERE WHERE
@ -401,7 +408,8 @@ func (s *Storage) UserByUsername(username string) (*model.User, error) {
mark_read_on_media_player_completion, mark_read_on_media_player_completion,
media_playback_rate, media_playback_rate,
block_filter_entry_rules, block_filter_entry_rules,
keep_filter_entry_rules keep_filter_entry_rules,
always_open_external_links
FROM FROM
users users
WHERE WHERE
@ -442,7 +450,8 @@ func (s *Storage) UserByField(field, value string) (*model.User, error) {
mark_read_on_media_player_completion, mark_read_on_media_player_completion,
media_playback_rate, media_playback_rate,
block_filter_entry_rules, block_filter_entry_rules,
keep_filter_entry_rules keep_filter_entry_rules,
always_open_external_links
FROM FROM
users users
WHERE WHERE
@ -490,7 +499,8 @@ func (s *Storage) UserByAPIKey(token string) (*model.User, error) {
u.mark_read_on_media_player_completion, u.mark_read_on_media_player_completion,
media_playback_rate, media_playback_rate,
u.block_filter_entry_rules, u.block_filter_entry_rules,
u.keep_filter_entry_rules u.keep_filter_entry_rules,
u.always_open_external_links,
FROM FROM
users u users u
LEFT JOIN LEFT JOIN
@ -533,6 +543,7 @@ func (s *Storage) fetchUser(query string, args ...interface{}) (*model.User, err
&user.MediaPlaybackRate, &user.MediaPlaybackRate,
&user.BlockFilterEntryRules, &user.BlockFilterEntryRules,
&user.KeepFilterEntryRules, &user.KeepFilterEntryRules,
&user.AlwaysOpenExternalLinks,
) )
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
@ -646,7 +657,8 @@ func (s *Storage) Users() (model.Users, error) {
mark_read_on_media_player_completion, mark_read_on_media_player_completion,
media_playback_rate, media_playback_rate,
block_filter_entry_rules, block_filter_entry_rules,
keep_filter_entry_rules keep_filter_entry_rules,
always_open_external_links
FROM FROM
users users
ORDER BY username ASC ORDER BY username ASC
@ -690,6 +702,7 @@ func (s *Storage) Users() (model.Users, error) {
&user.MediaPlaybackRate, &user.MediaPlaybackRate,
&user.BlockFilterEntryRules, &user.BlockFilterEntryRules,
&user.KeepFilterEntryRules, &user.KeepFilterEntryRules,
&user.AlwaysOpenExternalLinks,
) )
if err != nil { if err != nil {

View file

@ -207,6 +207,8 @@
<label><input type="checkbox" name="entry_swipe" value="1" {{ if .form.EntrySwipe }}checked{{ end }}> {{ t "form.prefs.label.entry_swipe" }}</label> <label><input type="checkbox" name="entry_swipe" value="1" {{ if .form.EntrySwipe }}checked{{ end }}> {{ t "form.prefs.label.entry_swipe" }}</label>
<label><input type="checkbox" name="always_open_external_links" value="1" {{ if .form.AlwaysOpenExternalLinks }}checked{{ end }}> {{ t "form.prefs.label.always_open_external_links" }}</label>
<label for="form-custom-css">{{t "form.prefs.label.custom_css" }}</label> <label for="form-custom-css">{{t "form.prefs.label.custom_css" }}</label>
<textarea id="form-custom-css" name="custom_css" cols="40" rows="10" spellcheck="false">{{ .form.CustomCSS }}</textarea> <textarea id="form-custom-css" name="custom_css" cols="40" rows="10" spellcheck="false">{{ .form.CustomCSS }}</textarea>

View file

@ -48,6 +48,11 @@ func (h *handler) showStarredEntryPage(w http.ResponseWriter, r *http.Request) {
entry.Status = model.EntryStatusRead entry.Status = model.EntryStatusRead
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection) entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection)
entryPaginationBuilder.WithStarred() entryPaginationBuilder.WithStarred()
prevEntry, nextEntry, err := entryPaginationBuilder.Entries() prevEntry, nextEntry, err := entryPaginationBuilder.Entries()

View file

@ -51,6 +51,11 @@ func (h *handler) showCategoryEntryPage(w http.ResponseWriter, r *http.Request)
entry.Status = model.EntryStatusRead entry.Status = model.EntryStatusRead
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection) entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection)
entryPaginationBuilder.WithCategoryID(categoryID) entryPaginationBuilder.WithCategoryID(categoryID)
prevEntry, nextEntry, err := entryPaginationBuilder.Entries() prevEntry, nextEntry, err := entryPaginationBuilder.Entries()

View file

@ -51,6 +51,11 @@ func (h *handler) showFeedEntryPage(w http.ResponseWriter, r *http.Request) {
entry.Status = model.EntryStatusRead entry.Status = model.EntryStatusRead
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection) entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection)
entryPaginationBuilder.WithFeedID(feedID) entryPaginationBuilder.WithFeedID(feedID)
prevEntry, nextEntry, err := entryPaginationBuilder.Entries() prevEntry, nextEntry, err := entryPaginationBuilder.Entries()

View file

@ -38,6 +38,11 @@ func (h *handler) showReadEntryPage(w http.ResponseWriter, r *http.Request) {
return return
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, "changed_at", "desc") entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, "changed_at", "desc")
entryPaginationBuilder.WithStatus(model.EntryStatusRead) entryPaginationBuilder.WithStatus(model.EntryStatusRead)
prevEntry, nextEntry, err := entryPaginationBuilder.Entries() prevEntry, nextEntry, err := entryPaginationBuilder.Entries()

View file

@ -50,6 +50,11 @@ func (h *handler) showSearchEntryPage(w http.ResponseWriter, r *http.Request) {
entry.Status = model.EntryStatusRead entry.Status = model.EntryStatusRead
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection) entryPaginationBuilder := storage.NewEntryPaginationBuilder(h.store, user.ID, entry.ID, user.EntryOrder, user.EntryDirection)
entryPaginationBuilder.WithSearchQuery(searchQuery) entryPaginationBuilder.WithSearchQuery(searchQuery)
prevEntry, nextEntry, err := entryPaginationBuilder.Entries() prevEntry, nextEntry, err := entryPaginationBuilder.Entries()

View file

@ -79,6 +79,11 @@ func (h *handler) showUnreadEntryPage(w http.ResponseWriter, r *http.Request) {
} }
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
sess := session.New(h.store, request.SessionID(r)) sess := session.New(h.store, request.SessionID(r))
view := view.New(h.tpl, r, sess) view := view.New(h.tpl, r, sess)
view.Set("entry", entry) view.Set("entry", entry)

View file

@ -48,10 +48,11 @@ type SettingsForm struct {
CategoriesSortingOrder string CategoriesSortingOrder string
MarkReadOnView bool MarkReadOnView bool
// MarkReadBehavior is a string representation of the MarkReadOnView and MarkReadOnMediaPlayerCompletion fields together // MarkReadBehavior is a string representation of the MarkReadOnView and MarkReadOnMediaPlayerCompletion fields together
MarkReadBehavior MarkReadBehavior MarkReadBehavior MarkReadBehavior
MediaPlaybackRate float64 MediaPlaybackRate float64
BlockFilterEntryRules string BlockFilterEntryRules string
KeepFilterEntryRules string KeepFilterEntryRules string
AlwaysOpenExternalLinks bool
} }
// MarkAsReadBehavior returns the MarkReadBehavior from the given MarkReadOnView and MarkReadOnMediaPlayerCompletion values. // MarkAsReadBehavior returns the MarkReadBehavior from the given MarkReadOnView and MarkReadOnMediaPlayerCompletion values.
@ -114,6 +115,7 @@ func (s *SettingsForm) Merge(user *model.User) *model.User {
user.MediaPlaybackRate = s.MediaPlaybackRate user.MediaPlaybackRate = s.MediaPlaybackRate
user.BlockFilterEntryRules = s.BlockFilterEntryRules user.BlockFilterEntryRules = s.BlockFilterEntryRules
user.KeepFilterEntryRules = s.KeepFilterEntryRules user.KeepFilterEntryRules = s.KeepFilterEntryRules
user.AlwaysOpenExternalLinks = s.AlwaysOpenExternalLinks
MarkReadOnView, MarkReadOnMediaPlayerCompletion := ExtractMarkAsReadBehavior(s.MarkReadBehavior) MarkReadOnView, MarkReadOnMediaPlayerCompletion := ExtractMarkAsReadBehavior(s.MarkReadBehavior)
user.MarkReadOnView = MarkReadOnView user.MarkReadOnView = MarkReadOnView
@ -179,31 +181,32 @@ func NewSettingsForm(r *http.Request) *SettingsForm {
mediaPlaybackRate = 1 mediaPlaybackRate = 1
} }
return &SettingsForm{ return &SettingsForm{
Username: r.FormValue("username"), Username: r.FormValue("username"),
Password: r.FormValue("password"), Password: r.FormValue("password"),
Confirmation: r.FormValue("confirmation"), Confirmation: r.FormValue("confirmation"),
Theme: r.FormValue("theme"), Theme: r.FormValue("theme"),
Language: r.FormValue("language"), Language: r.FormValue("language"),
Timezone: r.FormValue("timezone"), Timezone: r.FormValue("timezone"),
EntryDirection: r.FormValue("entry_direction"), EntryDirection: r.FormValue("entry_direction"),
EntryOrder: r.FormValue("entry_order"), EntryOrder: r.FormValue("entry_order"),
EntriesPerPage: int(entriesPerPage), EntriesPerPage: int(entriesPerPage),
KeyboardShortcuts: r.FormValue("keyboard_shortcuts") == "1", KeyboardShortcuts: r.FormValue("keyboard_shortcuts") == "1",
ShowReadingTime: r.FormValue("show_reading_time") == "1", ShowReadingTime: r.FormValue("show_reading_time") == "1",
CustomCSS: r.FormValue("custom_css"), CustomCSS: r.FormValue("custom_css"),
CustomJS: r.FormValue("custom_js"), CustomJS: r.FormValue("custom_js"),
ExternalFontHosts: r.FormValue("external_font_hosts"), ExternalFontHosts: r.FormValue("external_font_hosts"),
EntrySwipe: r.FormValue("entry_swipe") == "1", EntrySwipe: r.FormValue("entry_swipe") == "1",
GestureNav: r.FormValue("gesture_nav"), GestureNav: r.FormValue("gesture_nav"),
DisplayMode: r.FormValue("display_mode"), DisplayMode: r.FormValue("display_mode"),
DefaultReadingSpeed: int(defaultReadingSpeed), DefaultReadingSpeed: int(defaultReadingSpeed),
CJKReadingSpeed: int(cjkReadingSpeed), CJKReadingSpeed: int(cjkReadingSpeed),
DefaultHomePage: r.FormValue("default_home_page"), DefaultHomePage: r.FormValue("default_home_page"),
CategoriesSortingOrder: r.FormValue("categories_sorting_order"), CategoriesSortingOrder: r.FormValue("categories_sorting_order"),
MarkReadOnView: r.FormValue("mark_read_on_view") == "1", MarkReadOnView: r.FormValue("mark_read_on_view") == "1",
MarkReadBehavior: MarkReadBehavior(r.FormValue("mark_read_behavior")), MarkReadBehavior: MarkReadBehavior(r.FormValue("mark_read_behavior")),
MediaPlaybackRate: mediaPlaybackRate, MediaPlaybackRate: mediaPlaybackRate,
BlockFilterEntryRules: r.FormValue("block_filter_entry_rules"), BlockFilterEntryRules: r.FormValue("block_filter_entry_rules"),
KeepFilterEntryRules: r.FormValue("keep_filter_entry_rules"), KeepFilterEntryRules: r.FormValue("keep_filter_entry_rules"),
AlwaysOpenExternalLinks: r.FormValue("always_open_external_links") == "1",
} }
} }

View file

@ -9,20 +9,21 @@ import (
func TestValid(t *testing.T) { func TestValid(t *testing.T) {
settings := &SettingsForm{ settings := &SettingsForm{
Username: "user", Username: "user",
Password: "hunter2", Password: "hunter2",
Confirmation: "hunter2", Confirmation: "hunter2",
Theme: "default", Theme: "default",
Language: "en_US", Language: "en_US",
Timezone: "UTC", Timezone: "UTC",
EntryDirection: "asc", EntryDirection: "asc",
EntriesPerPage: 50, EntriesPerPage: 50,
DisplayMode: "standalone", DisplayMode: "standalone",
GestureNav: "tap", GestureNav: "tap",
DefaultReadingSpeed: 35, DefaultReadingSpeed: 35,
CJKReadingSpeed: 25, CJKReadingSpeed: 25,
DefaultHomePage: "unread", DefaultHomePage: "unread",
MediaPlaybackRate: 1.25, MediaPlaybackRate: 1.25,
AlwaysOpenExternalLinks: true,
} }
err := settings.Validate() err := settings.Validate()
@ -33,20 +34,21 @@ func TestValid(t *testing.T) {
func TestConfirmationEmpty(t *testing.T) { func TestConfirmationEmpty(t *testing.T) {
settings := &SettingsForm{ settings := &SettingsForm{
Username: "user", Username: "user",
Password: "hunter2", Password: "hunter2",
Confirmation: "", Confirmation: "",
Theme: "default", Theme: "default",
Language: "en_US", Language: "en_US",
Timezone: "UTC", Timezone: "UTC",
EntryDirection: "asc", EntryDirection: "asc",
EntriesPerPage: 50, EntriesPerPage: 50,
DisplayMode: "standalone", DisplayMode: "standalone",
GestureNav: "tap", GestureNav: "tap",
DefaultReadingSpeed: 35, DefaultReadingSpeed: 35,
CJKReadingSpeed: 25, CJKReadingSpeed: 25,
DefaultHomePage: "unread", DefaultHomePage: "unread",
MediaPlaybackRate: 1.25, MediaPlaybackRate: 1.25,
AlwaysOpenExternalLinks: true,
} }
err := settings.Validate() err := settings.Validate()
@ -61,20 +63,21 @@ func TestConfirmationEmpty(t *testing.T) {
func TestConfirmationIncorrect(t *testing.T) { func TestConfirmationIncorrect(t *testing.T) {
settings := &SettingsForm{ settings := &SettingsForm{
Username: "user", Username: "user",
Password: "hunter2", Password: "hunter2",
Confirmation: "unter2", Confirmation: "unter2",
Theme: "default", Theme: "default",
Language: "en_US", Language: "en_US",
Timezone: "UTC", Timezone: "UTC",
EntryDirection: "asc", EntryDirection: "asc",
EntriesPerPage: 50, EntriesPerPage: 50,
DisplayMode: "standalone", DisplayMode: "standalone",
GestureNav: "tap", GestureNav: "tap",
DefaultReadingSpeed: 35, DefaultReadingSpeed: 35,
CJKReadingSpeed: 25, CJKReadingSpeed: 25,
DefaultHomePage: "unread", DefaultHomePage: "unread",
MediaPlaybackRate: 1.25, MediaPlaybackRate: 1.25,
AlwaysOpenExternalLinks: true,
} }
err := settings.Validate() err := settings.Validate()

View file

@ -23,29 +23,30 @@ func (h *handler) showSettingsPage(w http.ResponseWriter, r *http.Request) {
} }
settingsForm := form.SettingsForm{ settingsForm := form.SettingsForm{
Username: user.Username, Username: user.Username,
Theme: user.Theme, Theme: user.Theme,
Language: user.Language, Language: user.Language,
Timezone: user.Timezone, Timezone: user.Timezone,
EntryDirection: user.EntryDirection, EntryDirection: user.EntryDirection,
EntryOrder: user.EntryOrder, EntryOrder: user.EntryOrder,
EntriesPerPage: user.EntriesPerPage, EntriesPerPage: user.EntriesPerPage,
KeyboardShortcuts: user.KeyboardShortcuts, KeyboardShortcuts: user.KeyboardShortcuts,
ShowReadingTime: user.ShowReadingTime, ShowReadingTime: user.ShowReadingTime,
CustomCSS: user.Stylesheet, CustomCSS: user.Stylesheet,
CustomJS: user.CustomJS, CustomJS: user.CustomJS,
ExternalFontHosts: user.ExternalFontHosts, ExternalFontHosts: user.ExternalFontHosts,
EntrySwipe: user.EntrySwipe, EntrySwipe: user.EntrySwipe,
GestureNav: user.GestureNav, GestureNav: user.GestureNav,
DisplayMode: user.DisplayMode, DisplayMode: user.DisplayMode,
DefaultReadingSpeed: user.DefaultReadingSpeed, DefaultReadingSpeed: user.DefaultReadingSpeed,
CJKReadingSpeed: user.CJKReadingSpeed, CJKReadingSpeed: user.CJKReadingSpeed,
DefaultHomePage: user.DefaultHomePage, DefaultHomePage: user.DefaultHomePage,
CategoriesSortingOrder: user.CategoriesSortingOrder, CategoriesSortingOrder: user.CategoriesSortingOrder,
MarkReadBehavior: form.MarkAsReadBehavior(user.MarkReadOnView, user.MarkReadOnMediaPlayerCompletion), MarkReadBehavior: form.MarkAsReadBehavior(user.MarkReadOnView, user.MarkReadOnMediaPlayerCompletion),
MediaPlaybackRate: user.MediaPlaybackRate, MediaPlaybackRate: user.MediaPlaybackRate,
BlockFilterEntryRules: user.BlockFilterEntryRules, BlockFilterEntryRules: user.BlockFilterEntryRules,
KeepFilterEntryRules: user.KeepFilterEntryRules, KeepFilterEntryRules: user.KeepFilterEntryRules,
AlwaysOpenExternalLinks: user.AlwaysOpenExternalLinks,
} }
timezones, err := h.store.Timezones() timezones, err := h.store.Timezones()

View file

@ -88,6 +88,11 @@ func (h *handler) showUnreadCategoryEntryPage(w http.ResponseWriter, r *http.Req
} }
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
sess := session.New(h.store, request.SessionID(r)) sess := session.New(h.store, request.SessionID(r))
view := view.New(h.tpl, r, sess) view := view.New(h.tpl, r, sess)
view.Set("entry", entry) view.Set("entry", entry)

View file

@ -88,6 +88,11 @@ func (h *handler) showUnreadFeedEntryPage(w http.ResponseWriter, r *http.Request
} }
} }
if user.AlwaysOpenExternalLinks {
html.Redirect(w, r, entry.URL)
return
}
sess := session.New(h.store, request.SessionID(r)) sess := session.New(h.store, request.SessionID(r))
view := view.New(h.tpl, r, sess) view := view.New(h.tpl, r, sess)
view.Set("entry", entry) view.Set("entry", entry)