Browse Source

Group settings form fields into fieldsets

Frédéric Guillot 2 years ago
parent
commit
2104eb85d7

+ 7 - 0
internal/locale/translations/de_DE.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Dieses Abonnement nicht aktualisieren",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Einträge in der globalen Ungelesen-Liste ausblenden",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Titel",
     "form.category.hide_globally": "Einträge in der globalen Ungelesen-Liste ausblenden",
     "form.user.label.username": "Benutzername",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Standard Startseite",
     "form.prefs.label.categories_sorting_order": "Kategorien sortieren",
     "form.prefs.label.mark_read_on_view": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML Datei",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Fever API aktivieren",

+ 7 - 0
internal/locale/translations/el_EL.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Μη ανανέωση αυτής της ροής",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Απόκρυψη καταχωρήσεων σε γενική λίστα μη αναγνωσμένων",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Τίτλος",
     "form.category.hide_globally": "Απόκρυψη καταχωρήσεων σε γενική λίστα μη αναγνωσμένων",
     "form.user.label.username": "Χρήστης",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Προεπιλεγμένη αρχική σελίδα",
     "form.prefs.label.categories_sorting_order": "Ταξινόμηση κατηγοριών",
     "form.prefs.label.mark_read_on_view": "Αυτόματη επισήμανση καταχωρήσεων ως αναγνωσμένων κατά την προβολή",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "Αρχείο OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Ενεργοποιήστε το Fever API",

+ 7 - 0
internal/locale/translations/en_US.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Do not refresh this feed",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Hide entries in global unread list",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Title",
     "form.category.hide_globally": "Hide entries in global unread list",
     "form.user.label.username": "Username",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Default home page",
     "form.prefs.label.categories_sorting_order": "Categories sorting",
     "form.prefs.label.mark_read_on_view": "Automatically mark entries as read when viewed",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML file",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Activate Fever API",

+ 7 - 0
internal/locale/translations/es_ES.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "No actualice este feed",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Ocultar artículos en la lista global de no leídos",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Título",
     "form.category.hide_globally": "Ocultar artículos en la lista global de no leídos",
     "form.user.label.username": "Nombre de usuario",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Página de inicio por defecto",
     "form.prefs.label.categories_sorting_order": "Clasificación por categorías",
     "form.prefs.label.mark_read_on_view": "Marcar automáticamente las entradas como leídas cuando se vean",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "Archivo OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Activar API de Fever",

+ 7 - 0
internal/locale/translations/fi_FI.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Älä päivitä tätä syötettä",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Piilota artikkelit lukemattomien listassa",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Otsikko",
     "form.category.hide_globally": "Piilota artikkelit lukemattomien listassa",
     "form.user.label.username": "Käyttäjätunnus",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Oletusarvoinen etusivu",
     "form.prefs.label.categories_sorting_order": "Kategorioiden lajittelu",
     "form.prefs.label.mark_read_on_view": "Merkitse kohdat automaattisesti luetuiksi, kun niitä tarkastellaan",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML-tiedosto",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Ota Fever API käyttöön",

+ 20 - 13
internal/locale/translations/fr_FR.json

@@ -279,7 +279,7 @@
     "form.feed.label.cookie": "Définir les cookies",
     "form.feed.label.scraper_rules": "Règles pour récupérer le contenu original",
     "form.feed.label.rewrite_rules": "Règles de réécriture",
-    "form.feed.label.apprise_service_urls": "Comma separated list of Apprise service URLs",
+    "form.feed.label.apprise_service_urls": "Liste séparée par des virgules des URL du service Apprise",
     "form.feed.label.blocklist_rules": "Règles de blocage",
     "form.feed.label.keeplist_rules": "Règles d'autorisation",
     "form.feed.label.urlrewrite_rules": "Règles de réécriture d'URL",
@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Ne pas actualiser ce flux",
     "form.feed.label.no_media_player": "Pas de lecteur multimedia (audio/vidéo)",
     "form.feed.label.hide_globally": "Masquer les entrées dans la liste globale non lue",
+    "form.feed.fieldset.general": "Général",
+    "form.feed.fieldset.rules": "Règles",
+    "form.feed.fieldset.network_settings": "Paramètres réseau",
+    "form.feed.fieldset.integration": "Services tiers",
     "form.category.label.title": "Titre",
     "form.category.hide_globally": "Masquer les entrées dans la liste globale non lue",
     "form.user.label.username": "Nom d'utilisateur",
@@ -320,11 +324,14 @@
     "form.prefs.label.entry_swipe": "Activer le balayage des entrées sur les écrans tactiles",
     "form.prefs.label.gesture_nav": "Geste pour naviguer entre les entrées",
     "form.prefs.label.show_reading_time": "Afficher le temps de lecture estimé des articles",
-    "form.prefs.label.custom_css": "CSS personnalisé",
+    "form.prefs.label.custom_css": "Feuille de style personnalisée",
     "form.prefs.label.entry_order": "Colonne de tri des entrées",
     "form.prefs.label.default_home_page": "Page d'accueil par défaut",
     "form.prefs.label.categories_sorting_order": "Colonne de tri des catégories",
     "form.prefs.label.mark_read_on_view": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées",
+    "form.prefs.fieldset.application_settings": "Paramètres de l'application",
+    "form.prefs.fieldset.authentication_settings": "Paramètres d'authentification",
+    "form.prefs.fieldset.reader_settings": "Paramètres du lecteur",
     "form.import.label.file": "Fichier OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Activer l'API de Fever",
@@ -356,9 +363,9 @@
     "form.integration.notion_activate": "Sauvegarder les articles vers Notion",
     "form.integration.notion_page_id": "Identifiant de la page Notion",
     "form.integration.notion_token": "Jeton d'accès de l'API de Notion",
-    "form.integration.apprise_activate": "Emvoyer les articles vers Apprise",
-    "form.integration.apprise_url": "Apprise API URL",
-    "form.integration.apprise_services_url": "Comma separated list of Apprise services",
+    "form.integration.apprise_activate": "Envoyer les articles vers Apprise",
+    "form.integration.apprise_url": "URL de l'API Apprise",
+    "form.integration.apprise_services_url": "Liste des services Apprise séparés par des virgules",
     "form.integration.nunux_keeper_activate": "Sauvegarder les articles vers Nunux Keeper",
     "form.integration.nunux_keeper_endpoint": "URL de l'API de Nunux Keeper",
     "form.integration.nunux_keeper_api_key": "Clé d'API de Nunux Keeper",
@@ -366,13 +373,13 @@
     "form.integration.espial_endpoint": "URL de l'API de Espial",
     "form.integration.espial_api_key": "Clé d'API de Espial",
     "form.integration.espial_tags": "Libellés de Espial",
-    "form.integration.readwise_activate": "Save entries to Readwise Reader",
-    "form.integration.readwise_api_key": "Readwise Reader Access Token",
-    "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
+    "form.integration.readwise_activate": "Enregistrer les entrées dans Readwise Reader",
+    "form.integration.readwise_api_key": "Jeton d'accès au lecteur Readwise",
+    "form.integration.readwise_api_key_link": "Obtenez votre jeton d'accès Readwise",
     "form.integration.telegram_bot_activate": "Envoyer les nouveaux articles vers Telegram",
     "form.integration.telegram_bot_token": "Jeton de sécurité de l'API du Bot Telegram",
-    "form.integration.telegram_chat_id": "Identifiant de discussion",
-    "form.integration.telegram_topic_id": "Topic ID",
+    "form.integration.telegram_chat_id": "Identifiant de discussion (Chat ID)",
+    "form.integration.telegram_topic_id": "Identifiant du sujet (Topic ID)",
     "form.integration.telegram_bot_disable_web_page_preview": "Désactiver l'aperçu de la page Web",
     "form.integration.telegram_bot_disable_notification": "Désactiver les notifications",
     "form.integration.linkding_activate": "Sauvegarder les articles vers Linkding",
@@ -392,9 +399,9 @@
     "form.integration.shaarli_activate": "Sauvegarder les articles vers Shaarli",
     "form.integration.shaarli_endpoint": "URL de l'API de Shaarli",
     "form.integration.shaarli_api_secret": "Clé d'API de Shaarli API",
-    "form.integration.webhook_activate": "Enable Webhook",
-    "form.integration.webhook_url": "Webhook URL",
-    "form.integration.webhook_secret": "Webhook Secret",
+    "form.integration.webhook_activate": "Activer le webhook",
+    "form.integration.webhook_url": "URL du webhook",
+    "form.integration.webhook_secret": "Secret du webhook",
     "form.api_key.label.description": "Libellé de la clé d'API",
     "form.submit.loading": "Chargement...",
     "form.submit.saving": "Sauvegarde en cours...",

+ 7 - 0
internal/locale/translations/hi_IN.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "इस फ़ीड को रीफ़्रेश न करें",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "वैश्विक अपठित सूची में प्रविष्टियां छिपाएं",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "शीर्षक",
     "form.category.hide_globally": "वैश्विक अपठित सूची में प्रविष्टियां छिपाएं",
     "form.user.label.username": "उपयोगकर्ता नाम",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "डिफ़ॉल्ट होमपेज़",
     "form.prefs.label.categories_sorting_order": "श्रेणियाँ छँटाई",
     "form.prefs.label.mark_read_on_view": "देखे जाने पर स्वचालित रूप से प्रविष्टियों को पढ़ने के रूप में चिह्नित करें",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "ओपीएमएल फ़ाइल",
     "form.import.label.url": "यूआरएल",
     "form.integration.fever_activate": "फीवर एपीआई सक्रिय करें",

+ 7 - 0
internal/locale/translations/id_ID.json

@@ -286,6 +286,10 @@
     "form.feed.label.disabled": "Jangan perbarui umpan ini",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Sembunyikan entri di daftar belum dibaca global",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Judul",
     "form.category.hide_globally": "Sembunyikan entri di daftar belum dibaca global",
     "form.user.label.username": "Nama Pengguna",
@@ -322,6 +326,9 @@
     "form.prefs.label.default_home_page": "Beranda Baku",
     "form.prefs.label.categories_sorting_order": "Pengurutan Kategori",
     "form.prefs.label.mark_read_on_view": "Secara otomatis menandai entri sebagai telah dibaca saat dilihat",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "Berkas OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Aktifkan API Fever",

+ 7 - 0
internal/locale/translations/it_IT.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Non aggiornare questo feed",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Nascondere le voci nella lista globale dei non letti",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Titolo",
     "form.category.hide_globally": "Nascondere le voci nella lista globale dei non letti",
     "form.user.label.username": "Nome utente",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Pagina iniziale predefinita",
     "form.prefs.label.categories_sorting_order": "Ordinamento delle categorie",
     "form.prefs.label.mark_read_on_view": "Contrassegna automaticamente le voci come lette quando visualizzate",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "File OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Abilita l'API di Fever",

+ 7 - 0
internal/locale/translations/ja_JP.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "このフィードを更新しない",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "未読一覧に記事を表示しない",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "タイトル",
     "form.category.hide_globally": "未読一覧に記事を表示しない",
     "form.user.label.username": "ユーザー名",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "デフォルトのトップページ",
     "form.prefs.label.categories_sorting_order": "カテゴリの表示順",
     "form.prefs.label.mark_read_on_view": "表示時にエントリを自動的に既読としてマークします",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML ファイル",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Fever API を有効にする",

+ 7 - 0
internal/locale/translations/nl_NL.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Vernieuw deze feed niet",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Verberg items in de globale ongelezen lijst",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Naam",
     "form.category.hide_globally": "Verberg items in de globale ongelezen lijst",
     "form.user.label.username": "Gebruikersnaam",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Standaard startpagina",
     "form.prefs.label.categories_sorting_order": "Categorieën sorteren",
     "form.prefs.label.mark_read_on_view": "Items automatisch markeren als gelezen wanneer ze worden bekeken",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML-bestand",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Activeer Fever API",

+ 7 - 0
internal/locale/translations/pl_PL.json

@@ -291,6 +291,10 @@
     "form.feed.label.disabled": "Nie odświeżaj tego kanału",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Ukryj wpisy na globalnej liście nieprzeczytanych",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Tytuł",
     "form.category.hide_globally": "Ukryj wpisy na globalnej liście nieprzeczytanych",
     "form.user.label.username": "Nazwa użytkownika",
@@ -327,6 +331,9 @@
     "form.prefs.label.default_home_page": "Domyślna strona główna",
     "form.prefs.label.categories_sorting_order": "Sortowanie kategorii",
     "form.prefs.label.mark_read_on_view": "Automatycznie oznaczaj wpisy jako przeczytane podczas przeglądania",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "Plik OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Aktywuj Fever API",

+ 7 - 0
internal/locale/translations/pt_BR.json

@@ -289,6 +289,10 @@
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.fetch_via_proxy": "Buscar via proxy",
     "form.feed.label.hide_globally": "Ocultar entradas na lista global não lida",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Título",
     "form.category.hide_globally": "Ocultar entradas na lista global não lida",
     "form.user.label.username": "Nome de usuário",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Página inicial predefinida",
     "form.prefs.label.categories_sorting_order": "Classificação das categorias",
     "form.prefs.label.mark_read_on_view": "Marcar automaticamente as entradas como lidas quando visualizadas",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "Arquivo OPML",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Ativar API do Fever",

+ 7 - 0
internal/locale/translations/ru_RU.json

@@ -291,6 +291,10 @@
     "form.feed.label.disabled": "Не обновлять эту подписку",
     "form.feed.label.no_media_player": "Отключить медиаплеер (аудио и видео)",
     "form.feed.label.hide_globally": "Скрыть записи в глобальном списке непрочитанных",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Название",
     "form.category.hide_globally": "Скрыть записи в глобальном списке непрочитанных",
     "form.user.label.username": "Имя пользователя",
@@ -327,6 +331,9 @@
     "form.prefs.label.default_home_page": "Домашняя страница по умолчанию",
     "form.prefs.label.categories_sorting_order": "Сортировка категорий",
     "form.prefs.label.mark_read_on_view": "Автоматически отмечать записи как прочитанные при просмотре",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML файл",
     "form.import.label.url": "Ссылка",
     "form.integration.fever_activate": "Активировать Fever API",

+ 7 - 0
internal/locale/translations/tr_TR.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "Bu beslemeyi yenileme",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "Genel okunmamış listesindeki girişleri gizle",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "Başlık",
     "form.category.hide_globally": "Genel okunmamış listesindeki girişleri gizle",
     "form.user.label.username": "Kullanıcı Adı",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "Varsayılan ana sayfa",
     "form.prefs.label.categories_sorting_order": "Kategoriler sıralama",
     "form.prefs.label.mark_read_on_view": "Girişleri görüntülendiğinde otomatik olarak okundu olarak işaretle",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML dosyası",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "Fever API'yi Etkinleştir",

+ 442 - 435
internal/locale/translations/uk_UA.json

@@ -1,437 +1,444 @@
 {
-  "confirm.question": "Ви впевнені?",
-  "confirm.question.refresh": "Ви хочете змусити оновити?",
-  "confirm.yes": "так",
-  "confirm.no": "ні",
-  "confirm.loading": "В процесі...",
-  "action.subscribe": "Підписатись",
-  "action.save": "Зберегти",
-  "action.or": "або",
-  "action.cancel": "скасувати",
-  "action.remove": "Видалити",
-  "action.remove_feed": "Видалити стрічку",
-  "action.update": "Зберегти",
-  "action.edit": "Редагувати",
-  "action.download": "Завантажити",
-  "action.import": "Імпортувати",
-  "action.login": "Увійти",
-  "action.home_screen": "Додати до головного екрану",
-  "tooltip.keyboard_shortcuts": "Комбінація клавіш: %s",
-  "tooltip.logged_user": "Здійснено вхід як %s",
-  "menu.unread": "Непрочитане",
-  "menu.starred": "З зірочкою",
-  "menu.history": "Історія",
-  "menu.feeds": "Стрічки",
-  "menu.categories": "Категорії",
-  "menu.settings": "Налаштування",
-  "menu.logout": "Вийти",
-  "menu.preferences": "Уподобання",
-  "menu.integrations": "Інтеграції",
-  "menu.sessions": "Сеанси",
-  "menu.users": "Користувачі",
-  "menu.about": "Про додаток",
-  "menu.export": "Експорт",
-  "menu.import": "Імпорт",
-  "menu.create_category": "Створити категорію",
-  "menu.mark_page_as_read": "Відмітити цю сторінку як прочитане",
-  "menu.mark_all_as_read": "Відмітити все як прочитане",
-  "menu.show_all_entries": "Показати всі записи",
-  "menu.show_only_unread_entries": "Показати тільки непрочитані записи",
-  "menu.refresh_feed": "Оновити",
-  "menu.refresh_all_feeds": "Оновити всі стрічки у фоновому режимі",
-  "menu.edit_feed": "Редагувати",
-  "menu.edit_category": "Редагувати",
-  "menu.add_feed": "Додати підписку",
-  "menu.add_user": "Додати користувачв",
-  "menu.flush_history": "Очистити історію",
-  "menu.feed_entries": "Записи",
-  "menu.api_keys": "Ключі API",
-  "menu.create_api_key": "Створити новий ключ API",
-  "menu.shared_entries": "Спільні записи",
-  "search.label": "Пошук",
-  "search.placeholder": "Шукати...",
-  "pagination.next": "Вперед",
-  "pagination.previous": "Назад",
-  "entry.status.unread": "Непрочитане",
-  "entry.status.read": "Прочитане",
-  "entry.status.toast.unread": "Відмічено непрочитаним",
-  "entry.status.toast.read": "Відмічено прочитаним",
-  "entry.status.title": "Змінити стан запису",
-  "entry.bookmark.toggle.on": "Поставити зірочку",
-  "entry.bookmark.toggle.off": "Прибрати зірочку",
-  "entry.bookmark.toast.on": "З зірочкою",
-  "entry.bookmark.toast.off": "Без зірочки",
-  "entry.state.saving": "Зберігаю...",
-  "entry.state.loading": "Завантаження...",
-  "entry.save.label": "Зберегти",
-  "entry.save.title": "Зберегти цю статтю",
-  "entry.save.completed": "Готово!",
-  "entry.save.toast.completed": "Стаття збережена",
-  "entry.scraper.label": "Завантажити",
-  "entry.scraper.title": "Отримати оригінальний зміст",
-  "entry.scraper.completed": "Готово!",
-  "entry.external_link.label": "Зовнішнє посилання",
-  "entry.comments.label": "Коментарі",
-  "entry.comments.title": "Дивитися коментарі",
-  "entry.share.label": "Поділитись",
-  "entry.share.title": "Поділитись статтєю",
-  "entry.unshare.label": "Не ділитися",
-  "entry.shared_entry.title": "Відкрити публічне посилання",
-  "entry.shared_entry.label": "Поділитись",
-  "entry.estimated_reading_time": [
-    "читати %d хвилину",
-    "читати %d хвилини",
-    "читати %d хвилин"
-  ],
-  "entry.tags.label": "Теги:",
-  "page.shared_entries.title": "Спильні записи",
-  "page.unread.title": "Непрочитане",
-  "page.starred.title": "З зірочкою",
-  "page.categories.title": "Категорії",
-  "page.categories.no_feed": "Немає стрічки.",
-  "page.categories.entries": "Статті",
-  "page.categories.feeds": "Підписки",
-  "page.categories.feed_count": [
-    "Містить %d стрічку.",
-    "Містить %d стрічки.",
-    "Містить %d стрічок."
-  ],
-  "page.categories.unread_counter": "Кількість непрочитаних записів",
-  "page.new_category.title": "Нова категорія",
-  "page.new_user.title": "Новий користувач",
-  "page.edit_category.title": "Редагування категорії: %s",
-  "page.edit_user.title": "Редагування користувача: %s",
-  "page.feeds.title": "Стрічки",
-  "page.feeds.last_check": "Остання перевірка:",
-  "page.feeds.unread_counter": "Кількість непрочитаних записів",
-  "page.feeds.read_counter": "Кількість прочитаних записів",
-  "page.feeds.error_count": [
-    "%d помилка",
-    "%d помилки",
-    "%d помилок"
-  ],
-  "page.history.title": "Історія",
-  "page.import.title": "Імпорт",
-  "page.search.title": "Результати пошуку",
-  "page.about.title": "Про додадок",
-  "page.about.credits": "Титри",
-  "page.about.version": "Версія:",
-  "page.about.build_date": "Дата побудови:",
-  "page.about.author": "Автор:",
-  "page.about.license": "Ліцензія:",
-  "page.about.global_config_options": "Параметри глобальної конфігурації",
-  "page.about.postgres_version": "Версія Postgres:",
-  "page.about.go_version": "Версія Go:",
-  "page.add_feed.title": "Нова підписка",
-  "page.add_feed.no_category": "Немає категорії. Ви маєте додати принаймні одну категорію.",
-  "page.add_feed.label.url": "URL",
-  "page.add_feed.submit": "Знайти підписку",
-  "page.add_feed.legend.advanced_options": "Розширені опції",
-  "page.add_feed.choose_feed": "Обрати підписку",
-  "page.edit_feed.title": "Редагування стрічки: %s",
-  "page.edit_feed.last_check": "Остання перевірка:",
-  "page.edit_feed.last_modified_header": "Заголовок LastModified:",
-  "page.edit_feed.etag_header": "Заголовок ETag:",
-  "page.edit_feed.no_header": "Немає",
-  "page.edit_feed.last_parsing_error": "Остання помилка аналізу",
-  "page.entry.attachments": "Додатки",
-  "page.keyboard_shortcuts.title": "Комбінації клавиш",
-  "page.keyboard_shortcuts.subtitle.sections": "Навігація по розділах",
-  "page.keyboard_shortcuts.subtitle.items": "Навігація по записах",
-  "page.keyboard_shortcuts.subtitle.pages": "Навігація по сторінках",
-  "page.keyboard_shortcuts.subtitle.actions": "Дії",
-  "page.keyboard_shortcuts.go_to_unread": "Перейти до непрочитаних",
-  "page.keyboard_shortcuts.go_to_starred": "Перейти до закладок",
-  "page.keyboard_shortcuts.go_to_history": "Перейти до історії",
-  "page.keyboard_shortcuts.go_to_feeds": "Перейти до стрічок",
-  "page.keyboard_shortcuts.go_to_categories": "Перейти до категорій",
-  "page.keyboard_shortcuts.go_to_settings": "Перейти до налаштувань",
-  "page.keyboard_shortcuts.show_keyboard_shortcuts": "Показати комбінації клавиш",
-  "page.keyboard_shortcuts.go_to_previous_item": "Перейти до попереднього запису",
-  "page.keyboard_shortcuts.go_to_next_item": "Перейти до наступного запису",
-  "page.keyboard_shortcuts.go_to_feed": "Перейти до стрічки",
-  "page.keyboard_shortcuts.go_to_previous_page": "Перейти до попередньої сторінки",
-  "page.keyboard_shortcuts.go_to_next_page": "Перейти до наступної сторінки",
-  "page.keyboard_shortcuts.open_item": "Відкрити виділений запис",
-  "page.keyboard_shortcuts.open_original": "Відкрити оригінальне посилання",
-  "page.keyboard_shortcuts.open_original_same_window": "Відкрити оригінальне посилання в поточній вкладці",
-  "page.keyboard_shortcuts.open_comments": "Відкрити посилання на коментарі",
-  "page.keyboard_shortcuts.open_comments_same_window": "Відкрити посилання на коментарі в поточній вкладці",
-  "page.keyboard_shortcuts.toggle_read_status_next": "Переключити статус читання, перейти до наступного",
-  "page.keyboard_shortcuts.toggle_read_status_prev": "Переключити статус читання, перейти до попереднього",
-  "page.keyboard_shortcuts.refresh_all_feeds": "Оновити всі стрічки в фоновому режимі",
-  "page.keyboard_shortcuts.mark_page_as_read": "Відмітити поточну сторінку як прочитане",
-  "page.keyboard_shortcuts.download_content": "Завантажити оригінальний зміст",
-  "page.keyboard_shortcuts.toggle_bookmark_status": "Переключити статус закладки",
-  "page.keyboard_shortcuts.save_article": "Зберегти статтю",
-  "page.keyboard_shortcuts.scroll_item_to_top": "Прокрутити запис догори",
-  "page.keyboard_shortcuts.remove_feed": "Видалити цю стрічку",
-  "page.keyboard_shortcuts.go_to_search": "Поставити фокус на поле пошуку",
-  "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments",
-  "page.keyboard_shortcuts.close_modal": "Закрити модальне діалогове вікно",
-  "page.users.title": "Користувачі",
-  "page.users.username": "Ім’я користувача",
-  "page.users.never_logged": "Ніколи",
-  "page.users.admin.yes": "Так",
-  "page.users.admin.no": "Ні",
-  "page.users.actions": "Дії",
-  "page.users.last_login": "Дата останнього входу",
-  "page.users.is_admin": "Адміністратор",
-  "page.settings.title": "Налаштування ",
-  "page.settings.link_google_account": "Підключити мій обліковий запис Google",
-  "page.settings.unlink_google_account": "Відключити мій обліковий запис Google",
-  "page.settings.link_oidc_account": "Підключити мій обліковий запис OpenID Connect",
-  "page.settings.unlink_oidc_account": "Відключити мій обліковий запис OpenID Connect",
-  "page.login.title": "Вхід",
-  "page.login.google_signin": "Увійти через Google",
-  "page.login.oidc_signin": "Увійти через OpenID Connect",
-  "page.integrations.title": "Інтеграції",
-  "page.integration.miniflux_api": "Miniflux API",
-  "page.integration.miniflux_api_endpoint": "Адреса доступу API",
-  "page.integration.miniflux_api_username": "Ім’я користувача",
-  "page.integration.miniflux_api_password": "Пароль",
-  "page.integration.miniflux_api_password_value": "Пароль до вашого облікового запису",
-  "page.integration.bookmarklet": "Букмарклет",
-  "page.integration.bookmarklet.name": "Додати до Miniflux",
-  "page.integration.bookmarklet.instructions": "Перетягніть це посилання до своїх закладок.",
-  "page.integration.bookmarklet.help": "Це спеціальне посилання дозволяє підписатися на веб-сайт безпосередньо за допомогою закладки у вашому веб-браузері.",
-  "page.sessions.title": "Сеанси",
-  "page.sessions.table.date": "Дата",
-  "page.sessions.table.ip": "IP адреса",
-  "page.sessions.table.user_agent": "User Agent",
-  "page.sessions.table.actions": "Дії",
-  "page.sessions.table.current_session": "Поточний сеанс",
-  "page.api_keys.title": "Ключі API",
-  "page.api_keys.table.description": "Опис",
-  "page.api_keys.table.token": "Токен",
-  "page.api_keys.table.last_used_at": "Дата останнього використання",
-  "page.api_keys.table.created_at": "Дата створення",
-  "page.api_keys.table.actions": "Дії",
-  "page.api_keys.never_used": "Ніколи не використався",
-  "page.new_api_key.title": "Створити ключ API",
-  "page.offline.title": "Автономний режим",
-  "page.offline.message": "Ви офлайн",
-  "page.offline.refresh_page": "Спробуйте оновити сторінку",
-  "alert.no_shared_entry": "Немає спільного запису.",
-  "alert.no_bookmark": "Наразі закладки відсутні.",
-  "alert.no_category": "Немає категорії.",
-  "alert.no_category_entry": "У цій категорії немає записів.",
-  "alert.no_feed_entry": "У цій стрічці немає записів.",
-  "alert.no_feed": "У вас немає підписок.",
-  "alert.no_feed_in_category": "У цій категорії немає підписок.",
-  "alert.no_history": "Наразі історія порожня.",
-  "alert.feed_error": "З цією стрічкою трапилась помилка",
-  "alert.no_search_result": "Немає результатів для цього пошуку.",
-  "alert.no_unread_entry": "Немає непрочитаних статей.",
-  "alert.no_user": "Ви єдиний користувач.",
-  "alert.account_unlinked": "Тепер ваш зовнішній обліковий запис підключено!",
-  "alert.account_linked": "Тепер ваш зовнішній обліковий запис від’єднано!",
-  "alert.pocket_linked": "Тепер ваш обліковий запис Pocket підключено!",
-  "alert.prefs_saved": "Уподобання збережено!",
-  "error.unlink_account_without_password": "Ви маєте встановити пароль, щоб мати можливість увійти наступного разу",
-  "error.duplicate_linked_account": "Вже є обліковий запис, під’єднаний до цього провайдера!",
-  "error.duplicate_fever_username": "Вже є обліковий запис з таким самим користувачем Fever!",
-  "error.duplicate_googlereader_username": "Вже є обліковий запис з таким самим користувачем Google Reader!",
-  "error.pocket_request_token": "Не вдалося отримати токен доступу з Pocket!",
-  "error.pocket_access_token": "Не вдалося отримати токен доступу з Pocket!",
-  "error.category_already_exists": "Така категорія вже існує.",
-  "error.unable_to_create_category": "Не вдається сворити категорію.",
-  "error.unable_to_update_category": "Не вдається відредагувати категорію.",
-  "error.user_already_exists": "Такий користувач вже існує.",
-  "error.unable_to_create_user": "Не вдається створити користувача.",
-  "error.unable_to_update_user": "Не вдається оновити користувача.",
-  "error.unable_to_update_feed": "Не вдається оновити стрічку.",
-  "error.subscription_not_found": "Не знайшлося жодної підписки.",
-  "error.invalid_theme": "Недійсна тема.",
-  "error.invalid_language": "Недійсна мова.",
-  "error.invalid_timezone": "Недійсний часовий пояс.",
-  "error.invalid_entry_direction": "Недійсний напрямок запису.",
-  "error.invalid_display_mode": "Недійсний режим відображення.",
-  "error.invalid_gesture_nav": "Недійсна навігація жестами.",
-  "error.invalid_default_home_page": "Недійсна домашня сторінка за замовчуванням!",
-  "error.empty_file": "Цей файл порожній.",
-  "error.bad_credentials": "Невірне ім’я користувача або пароль.",
-  "error.fields_mandatory": "Всі поля є обов’язковими.",
-  "error.title_required": "Назва є обов’язковою.",
-  "error.different_passwords": "Паролі не співпадають.",
-  "error.password_min_length": "Пароль має складати щонайменше 6 символів.",
-  "error.settings_mandatory_fields": "Поля імені, теми, мови та часового поясу є обов’язковими.",
-  "error.settings_reading_speed_is_positive": "Швидкість читання має бути додатнім цілим числом.",
-  "error.entries_per_page_invalid": "Число записів на сторінку недійсне.",
-  "error.feed_mandatory_fields": "URL та категорія є обов’язковими.",
-  "error.feed_already_exists": "Така стрічка вже існує.",
-  "error.invalid_feed_url": "Недійсна URL-адреса стрічки.",
-  "error.invalid_site_url": "Недійсна URL-адреса сайту.",
-  "error.feed_url_not_empty": "URL-адреса стрічки не може бути порожньою.",
-  "error.site_url_not_empty": "URL-адреса сайту не може бути порожньою.",
-  "error.feed_title_not_empty": "Назва стрічки не може бути порожньою.",
-  "error.feed_category_not_found": "Категорія не існує або належить до іншого користувача.",
-  "error.feed_invalid_blocklist_rule": "Правило списку блокувань недійсне.",
-  "error.feed_invalid_keeplist_rule": "Правило списку дозволень недійсне.",
-  "error.user_mandatory_fields": "Ім’я користувача є обов’язковим.",
-  "error.api_key_already_exists": "Такий ключ API вже існує.",
-  "error.unable_to_create_api_key": "Не вдається створити такий ключ API",
-  "form.feed.label.title": "Назва",
-  "form.feed.label.site_url": "URL-адреса сайту",
-  "form.feed.label.feed_url": "URL-адреса стрічки",
-  "form.feed.label.category": "Категорія",
-  "form.feed.label.crawler": "Завантажувати оригінальний вміст",
-  "form.feed.label.feed_username": "Ім’я користувача для завантаження",
-  "form.feed.label.feed_password": "Пароль для завантаження",
-  "form.feed.label.user_agent": "Назначити User Agent",
-  "form.feed.label.cookie": "Встановити кукі",
-  "form.feed.label.scraper_rules": "Правила Scraper",
-  "form.feed.label.rewrite_rules": "Правила Rewrite",
-  "form.feed.label.blocklist_rules": "Правила блокування",
-  "form.feed.label.keeplist_rules": "Правила дозволення",
-  "form.feed.label.urlrewrite_rules": "Правила перезапису URL-адрес",
-  "form.feed.label.apprise_service_urls": "Comma separated list of Apprise service URLs",
-  "form.feed.label.ignore_http_cache": "Ігнорувати кеш HTTP",
-  "form.feed.label.allow_self_signed_certificates": "Дозволити сертифікати з власним підписом або недійсні",
-  "form.feed.label.fetch_via_proxy": "Використати проксі-сервер",
-  "form.feed.label.disabled": "Не оновлювати цю стрічку",
-  "form.feed.label.no_media_player": "No media player (audio/video)",
-  "form.feed.label.hide_globally": "Приховати записи в глобальному списку непрочитаного",
-  "form.category.label.title": "Назва",
-  "form.category.hide_globally": "Приховати записи в глобальному списку непрочитаного",
-  "form.user.label.username": "Ім’я користувача",
-  "form.user.label.password": "Пароль",
-  "form.user.label.confirmation": "Підтверждення паролю",
-  "form.user.label.admin": "Адміністратор",
-  "form.prefs.label.language": "Мова",
-  "form.prefs.label.timezone": "Часовий пояс",
-  "form.prefs.label.theme": "Тема",
-  "form.prefs.label.entry_sorting": "Сортування записів",
-  "form.prefs.label.entries_per_page": "Кількість записів на сторінку",
-  "form.prefs.label.default_reading_speed": "Швидкість читання для інших мов (слів на хвилину)",
-  "form.prefs.label.cjk_reading_speed": "Швидкість читання для китайської, корейської та японської мови (символів на хвилину)",
-  "form.prefs.label.display_mode": "Режим відображення Progressive Web App (PWA).",
-  "form.prefs.select.older_first": "Старіші записи спочатку",
-  "form.prefs.select.recent_first": "Останні записи спочатку",
-  "form.prefs.select.fullscreen": "Повний екран",
-  "form.prefs.select.standalone": "Автономний",
-  "form.prefs.select.minimal_ui": "Мінімальний",
-  "form.prefs.select.browser": "Браузер",
-  "form.prefs.select.publish_time": "Дата публікації запису",
-  "form.prefs.select.created_time": "Дата створення запису",
-  "form.prefs.select.alphabetical": "За алфавітом",
-  "form.prefs.select.unread_count": "Кількість непрочитаних",
-  "form.prefs.select.none": "Жодного",
-  "form.prefs.select.tap": "Двічі натисніть",
-  "form.prefs.select.swipe": "Проведіть пальцем",
-  "form.prefs.label.keyboard_shortcuts": "Увімкнути комбінації клавиш",
-  "form.prefs.label.entry_swipe": "Увімкніть введення пальцем на сенсорних екранах",
-  "form.prefs.label.gesture_nav": "Жест для переходу між записами",
-  "form.prefs.label.show_reading_time": "Показувати приблизний час читання для записів",
-  "form.prefs.label.custom_css": "Спеціальний CSS",
-  "form.prefs.label.entry_order": "Стовпець сортування записів",
-  "form.prefs.label.default_home_page": "Домашня сторінка за умовчанням",
-  "form.prefs.label.categories_sorting_order": "Сортування за категоріями",
-  "form.prefs.label.mark_read_on_view": "Автоматично позначати записи як прочитані під час перегляду",
-  "form.import.label.file": "Файл OPML",
-  "form.import.label.url": "URL-адреса",
-  "form.integration.fever_activate": "Увімкнути API Fever",
-  "form.integration.fever_username": "Ім’я користувача Fever",
-  "form.integration.fever_password": "Пароль Fever",
-  "form.integration.fever_endpoint": "Адреса доступу API Fever:",
-  "form.integration.googlereader_activate": "Увімкнути API Google Reader",
-  "form.integration.googlereader_username": "Ім’я користувача Google Reader",
-  "form.integration.googlereader_password": "Пароль Google Reader",
-  "form.integration.googlereader_endpoint": "Адреса доступу API Google Reader:",
-  "form.integration.pinboard_activate": "Зберігати статті до Pinboard",
-  "form.integration.pinboard_token": "API ключ від Pinboard",
-  "form.integration.pinboard_tags": "Теги для Pinboard",
-  "form.integration.pinboard_bookmark": "Відмічати закладку як непрочитану",
-  "form.integration.instapaper_activate": "Зберігати статті до Instapaper",
-  "form.integration.instapaper_username": "Ім’я користувача Instapaper",
-  "form.integration.instapaper_password": "Пароль Instapaper",
-  "form.integration.pocket_activate": "Зберігати статті до Pocket",
-  "form.integration.pocket_consumer_key": "Pocket Consumer Key",
-  "form.integration.pocket_access_token": "Pocket Access Token",
-  "form.integration.pocket_connect_link": "Підключити ваш обліковий запис Pocket",
-  "form.integration.wallabag_activate": "Зберігати статті до Wallabag",
-  "form.integration.wallabag_only_url": "Надіслати лише URL (замість повного вмісту)",
-  "form.integration.wallabag_endpoint": "Wallabag API Endpoint",
-  "form.integration.wallabag_client_id": "Wallabag Client ID",
-  "form.integration.wallabag_client_secret": "Wallabag Client Secret",
-  "form.integration.wallabag_username": "Ім’я користувача Wallabag",
-  "form.integration.wallabag_password": "Пароль Wallabag",
-  "form.integration.notion_activate": "Save entries to Notion",
-  "form.integration.notion_page_id": "Notion Page ID",
-  "form.integration.notion_token": "Notion Secret Token",
-  "form.integration.apprise_activate": "Push entries to Apprise",
-  "form.integration.apprise_url": "Apprise API URL",
-  "form.integration.apprise_services_url": "Comma separated list of Apprise service URLs",
-  "form.integration.nunux_keeper_activate": "Зберігати статті до Nunux Keeper",
-  "form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint",
-  "form.integration.nunux_keeper_api_key": "Ключ API Nunux Keeper",
-  "form.integration.espial_activate": "Зберігати статті до Espial",
-  "form.integration.espial_endpoint": "Espial API Endpoint",
-  "form.integration.espial_api_key": "Ключ API Espial",
-  "form.integration.espial_tags": "Теги для Espial",
-  "form.integration.readwise_activate": "Save entries to Readwise Reader",
-  "form.integration.readwise_api_key": "Readwise Reader Access Token",
-  "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
-  "form.integration.telegram_bot_activate": "Відправляти нові статті до чату Telegram",
-  "form.integration.telegram_bot_token": "Токен боту",
-  "form.integration.telegram_topic_id": "Topic ID",
-  "form.integration.telegram_bot_disable_web_page_preview": "Disable web page preview",
-  "form.integration.telegram_bot_disable_notification": "Disable notification",
-  "form.integration.telegram_chat_id": "ID чату",
-  "form.integration.linkding_activate": "Зберігати статті до Linkding",
-  "form.integration.linkding_endpoint": "Linkding API Endpoint",
-  "form.integration.linkding_api_key": "Ключ API Linkding",
-  "form.integration.linkding_tags": "Linkding Tags",
-  "form.integration.linkding_bookmark": "Відмічати закладку як непрочитану",
-  "form.integration.matrix_bot_activate": "Перенесення нових статей в Матрицю",
-  "form.integration.matrix_bot_user": "Ім'я користувача для Matrix",
-  "form.integration.matrix_bot_password": "Пароль для користувача Matrix",
-  "form.integration.matrix_bot_url": "URL-адреса сервера Матриці",
-  "form.integration.matrix_bot_chat_id": "Ідентифікатор кімнати Матриці",
-  "form.integration.shiori_activate": "Save articles to Shiori",
-  "form.integration.shiori_endpoint": "Shiori API Endpoint",
-  "form.integration.shiori_username": "Shiori Username",
-  "form.integration.shiori_password": "Shiori Password",
-  "form.integration.shaarli_activate": "Save articles to Shaarli",
-  "form.integration.shaarli_endpoint": "Shaarli URL",
-  "form.integration.shaarli_api_secret": "Shaarli API Secret",
-  "form.integration.webhook_activate": "Enable Webhook",
-  "form.integration.webhook_url": "Webhook URL",
-  "form.integration.webhook_secret": "Webhook Secret",
-  "form.api_key.label.description": "Назва ключа API",
-  "form.submit.loading": "Завантаження...",
-  "form.submit.saving": "Зберігаю...",
-  "time_elapsed.not_yet": "ще ні",
-  "time_elapsed.yesterday": "вчора",
-  "time_elapsed.now": "прямо зараз",
-  "time_elapsed.minutes": [
-    "%d хвилину тому",
-    "%d хвилини тому",
-    "%d хвилин тому"
-  ],
-  "time_elapsed.hours": [
-    "%d годину тому",
-    "%d години тому",
-    "%d годин тому"
-  ],
-  "time_elapsed.days": [
-    "%d день тому",
-    "%d дні тому",
-    "%d днів тому"
-  ],
-  "time_elapsed.weeks": [
-    "%d тиждень тому",
-    "%d тижня тому",
-    "%d тижнів тому"
-  ],
-  "time_elapsed.months": [
-    "%d місяць тому",
-    "%d місяця тому",
-    "%d місяців  тому"
-  ],
-  "time_elapsed.years": [
-    "%d рік тому",
-    "%d роки тому",
-    "%d років тому"
-  ]
+    "confirm.question": "Ви впевнені?",
+    "confirm.question.refresh": "Ви хочете змусити оновити?",
+    "confirm.yes": "так",
+    "confirm.no": "ні",
+    "confirm.loading": "В процесі...",
+    "action.subscribe": "Підписатись",
+    "action.save": "Зберегти",
+    "action.or": "або",
+    "action.cancel": "скасувати",
+    "action.remove": "Видалити",
+    "action.remove_feed": "Видалити стрічку",
+    "action.update": "Зберегти",
+    "action.edit": "Редагувати",
+    "action.download": "Завантажити",
+    "action.import": "Імпортувати",
+    "action.login": "Увійти",
+    "action.home_screen": "Додати до головного екрану",
+    "tooltip.keyboard_shortcuts": "Комбінація клавіш: %s",
+    "tooltip.logged_user": "Здійснено вхід як %s",
+    "menu.unread": "Непрочитане",
+    "menu.starred": "З зірочкою",
+    "menu.history": "Історія",
+    "menu.feeds": "Стрічки",
+    "menu.categories": "Категорії",
+    "menu.settings": "Налаштування",
+    "menu.logout": "Вийти",
+    "menu.preferences": "Уподобання",
+    "menu.integrations": "Інтеграції",
+    "menu.sessions": "Сеанси",
+    "menu.users": "Користувачі",
+    "menu.about": "Про додаток",
+    "menu.export": "Експорт",
+    "menu.import": "Імпорт",
+    "menu.create_category": "Створити категорію",
+    "menu.mark_page_as_read": "Відмітити цю сторінку як прочитане",
+    "menu.mark_all_as_read": "Відмітити все як прочитане",
+    "menu.show_all_entries": "Показати всі записи",
+    "menu.show_only_unread_entries": "Показати тільки непрочитані записи",
+    "menu.refresh_feed": "Оновити",
+    "menu.refresh_all_feeds": "Оновити всі стрічки у фоновому режимі",
+    "menu.edit_feed": "Редагувати",
+    "menu.edit_category": "Редагувати",
+    "menu.add_feed": "Додати підписку",
+    "menu.add_user": "Додати користувачв",
+    "menu.flush_history": "Очистити історію",
+    "menu.feed_entries": "Записи",
+    "menu.api_keys": "Ключі API",
+    "menu.create_api_key": "Створити новий ключ API",
+    "menu.shared_entries": "Спільні записи",
+    "search.label": "Пошук",
+    "search.placeholder": "Шукати...",
+    "pagination.next": "Вперед",
+    "pagination.previous": "Назад",
+    "entry.status.unread": "Непрочитане",
+    "entry.status.read": "Прочитане",
+    "entry.status.toast.unread": "Відмічено непрочитаним",
+    "entry.status.toast.read": "Відмічено прочитаним",
+    "entry.status.title": "Змінити стан запису",
+    "entry.bookmark.toggle.on": "Поставити зірочку",
+    "entry.bookmark.toggle.off": "Прибрати зірочку",
+    "entry.bookmark.toast.on": "З зірочкою",
+    "entry.bookmark.toast.off": "Без зірочки",
+    "entry.state.saving": "Зберігаю...",
+    "entry.state.loading": "Завантаження...",
+    "entry.save.label": "Зберегти",
+    "entry.save.title": "Зберегти цю статтю",
+    "entry.save.completed": "Готово!",
+    "entry.save.toast.completed": "Стаття збережена",
+    "entry.scraper.label": "Завантажити",
+    "entry.scraper.title": "Отримати оригінальний зміст",
+    "entry.scraper.completed": "Готово!",
+    "entry.external_link.label": "Зовнішнє посилання",
+    "entry.comments.label": "Коментарі",
+    "entry.comments.title": "Дивитися коментарі",
+    "entry.share.label": "Поділитись",
+    "entry.share.title": "Поділитись статтєю",
+    "entry.unshare.label": "Не ділитися",
+    "entry.shared_entry.title": "Відкрити публічне посилання",
+    "entry.shared_entry.label": "Поділитись",
+    "entry.estimated_reading_time": [
+        "читати %d хвилину",
+        "читати %d хвилини",
+        "читати %d хвилин"
+    ],
+    "entry.tags.label": "Теги:",
+    "page.shared_entries.title": "Спильні записи",
+    "page.unread.title": "Непрочитане",
+    "page.starred.title": "З зірочкою",
+    "page.categories.title": "Категорії",
+    "page.categories.no_feed": "Немає стрічки.",
+    "page.categories.entries": "Статті",
+    "page.categories.feeds": "Підписки",
+    "page.categories.feed_count": [
+        "Містить %d стрічку.",
+        "Містить %d стрічки.",
+        "Містить %d стрічок."
+    ],
+    "page.categories.unread_counter": "Кількість непрочитаних записів",
+    "page.new_category.title": "Нова категорія",
+    "page.new_user.title": "Новий користувач",
+    "page.edit_category.title": "Редагування категорії: %s",
+    "page.edit_user.title": "Редагування користувача: %s",
+    "page.feeds.title": "Стрічки",
+    "page.feeds.last_check": "Остання перевірка:",
+    "page.feeds.unread_counter": "Кількість непрочитаних записів",
+    "page.feeds.read_counter": "Кількість прочитаних записів",
+    "page.feeds.error_count": [
+        "%d помилка",
+        "%d помилки",
+        "%d помилок"
+    ],
+    "page.history.title": "Історія",
+    "page.import.title": "Імпорт",
+    "page.search.title": "Результати пошуку",
+    "page.about.title": "Про додадок",
+    "page.about.credits": "Титри",
+    "page.about.version": "Версія:",
+    "page.about.build_date": "Дата побудови:",
+    "page.about.author": "Автор:",
+    "page.about.license": "Ліцензія:",
+    "page.about.global_config_options": "Параметри глобальної конфігурації",
+    "page.about.postgres_version": "Версія Postgres:",
+    "page.about.go_version": "Версія Go:",
+    "page.add_feed.title": "Нова підписка",
+    "page.add_feed.no_category": "Немає категорії. Ви маєте додати принаймні одну категорію.",
+    "page.add_feed.label.url": "URL",
+    "page.add_feed.submit": "Знайти підписку",
+    "page.add_feed.legend.advanced_options": "Розширені опції",
+    "page.add_feed.choose_feed": "Обрати підписку",
+    "page.edit_feed.title": "Редагування стрічки: %s",
+    "page.edit_feed.last_check": "Остання перевірка:",
+    "page.edit_feed.last_modified_header": "Заголовок LastModified:",
+    "page.edit_feed.etag_header": "Заголовок ETag:",
+    "page.edit_feed.no_header": "Немає",
+    "page.edit_feed.last_parsing_error": "Остання помилка аналізу",
+    "page.entry.attachments": "Додатки",
+    "page.keyboard_shortcuts.title": "Комбінації клавиш",
+    "page.keyboard_shortcuts.subtitle.sections": "Навігація по розділах",
+    "page.keyboard_shortcuts.subtitle.items": "Навігація по записах",
+    "page.keyboard_shortcuts.subtitle.pages": "Навігація по сторінках",
+    "page.keyboard_shortcuts.subtitle.actions": "Дії",
+    "page.keyboard_shortcuts.go_to_unread": "Перейти до непрочитаних",
+    "page.keyboard_shortcuts.go_to_starred": "Перейти до закладок",
+    "page.keyboard_shortcuts.go_to_history": "Перейти до історії",
+    "page.keyboard_shortcuts.go_to_feeds": "Перейти до стрічок",
+    "page.keyboard_shortcuts.go_to_categories": "Перейти до категорій",
+    "page.keyboard_shortcuts.go_to_settings": "Перейти до налаштувань",
+    "page.keyboard_shortcuts.show_keyboard_shortcuts": "Показати комбінації клавиш",
+    "page.keyboard_shortcuts.go_to_previous_item": "Перейти до попереднього запису",
+    "page.keyboard_shortcuts.go_to_next_item": "Перейти до наступного запису",
+    "page.keyboard_shortcuts.go_to_feed": "Перейти до стрічки",
+    "page.keyboard_shortcuts.go_to_previous_page": "Перейти до попередньої сторінки",
+    "page.keyboard_shortcuts.go_to_next_page": "Перейти до наступної сторінки",
+    "page.keyboard_shortcuts.open_item": "Відкрити виділений запис",
+    "page.keyboard_shortcuts.open_original": "Відкрити оригінальне посилання",
+    "page.keyboard_shortcuts.open_original_same_window": "Відкрити оригінальне посилання в поточній вкладці",
+    "page.keyboard_shortcuts.open_comments": "Відкрити посилання на коментарі",
+    "page.keyboard_shortcuts.open_comments_same_window": "Відкрити посилання на коментарі в поточній вкладці",
+    "page.keyboard_shortcuts.toggle_read_status_next": "Переключити статус читання, перейти до наступного",
+    "page.keyboard_shortcuts.toggle_read_status_prev": "Переключити статус читання, перейти до попереднього",
+    "page.keyboard_shortcuts.refresh_all_feeds": "Оновити всі стрічки в фоновому режимі",
+    "page.keyboard_shortcuts.mark_page_as_read": "Відмітити поточну сторінку як прочитане",
+    "page.keyboard_shortcuts.download_content": "Завантажити оригінальний зміст",
+    "page.keyboard_shortcuts.toggle_bookmark_status": "Переключити статус закладки",
+    "page.keyboard_shortcuts.save_article": "Зберегти статтю",
+    "page.keyboard_shortcuts.scroll_item_to_top": "Прокрутити запис догори",
+    "page.keyboard_shortcuts.remove_feed": "Видалити цю стрічку",
+    "page.keyboard_shortcuts.go_to_search": "Поставити фокус на поле пошуку",
+    "page.keyboard_shortcuts.toggle_entry_attachments": "Toggle open/close entry attachments",
+    "page.keyboard_shortcuts.close_modal": "Закрити модальне діалогове вікно",
+    "page.users.title": "Користувачі",
+    "page.users.username": "Ім’я користувача",
+    "page.users.never_logged": "Ніколи",
+    "page.users.admin.yes": "Так",
+    "page.users.admin.no": "Ні",
+    "page.users.actions": "Дії",
+    "page.users.last_login": "Дата останнього входу",
+    "page.users.is_admin": "Адміністратор",
+    "page.settings.title": "Налаштування ",
+    "page.settings.link_google_account": "Підключити мій обліковий запис Google",
+    "page.settings.unlink_google_account": "Відключити мій обліковий запис Google",
+    "page.settings.link_oidc_account": "Підключити мій обліковий запис OpenID Connect",
+    "page.settings.unlink_oidc_account": "Відключити мій обліковий запис OpenID Connect",
+    "page.login.title": "Вхід",
+    "page.login.google_signin": "Увійти через Google",
+    "page.login.oidc_signin": "Увійти через OpenID Connect",
+    "page.integrations.title": "Інтеграції",
+    "page.integration.miniflux_api": "Miniflux API",
+    "page.integration.miniflux_api_endpoint": "Адреса доступу API",
+    "page.integration.miniflux_api_username": "Ім’я користувача",
+    "page.integration.miniflux_api_password": "Пароль",
+    "page.integration.miniflux_api_password_value": "Пароль до вашого облікового запису",
+    "page.integration.bookmarklet": "Букмарклет",
+    "page.integration.bookmarklet.name": "Додати до Miniflux",
+    "page.integration.bookmarklet.instructions": "Перетягніть це посилання до своїх закладок.",
+    "page.integration.bookmarklet.help": "Це спеціальне посилання дозволяє підписатися на веб-сайт безпосередньо за допомогою закладки у вашому веб-браузері.",
+    "page.sessions.title": "Сеанси",
+    "page.sessions.table.date": "Дата",
+    "page.sessions.table.ip": "IP адреса",
+    "page.sessions.table.user_agent": "User Agent",
+    "page.sessions.table.actions": "Дії",
+    "page.sessions.table.current_session": "Поточний сеанс",
+    "page.api_keys.title": "Ключі API",
+    "page.api_keys.table.description": "Опис",
+    "page.api_keys.table.token": "Токен",
+    "page.api_keys.table.last_used_at": "Дата останнього використання",
+    "page.api_keys.table.created_at": "Дата створення",
+    "page.api_keys.table.actions": "Дії",
+    "page.api_keys.never_used": "Ніколи не використався",
+    "page.new_api_key.title": "Створити ключ API",
+    "page.offline.title": "Автономний режим",
+    "page.offline.message": "Ви офлайн",
+    "page.offline.refresh_page": "Спробуйте оновити сторінку",
+    "alert.no_shared_entry": "Немає спільного запису.",
+    "alert.no_bookmark": "Наразі закладки відсутні.",
+    "alert.no_category": "Немає категорії.",
+    "alert.no_category_entry": "У цій категорії немає записів.",
+    "alert.no_feed_entry": "У цій стрічці немає записів.",
+    "alert.no_feed": "У вас немає підписок.",
+    "alert.no_feed_in_category": "У цій категорії немає підписок.",
+    "alert.no_history": "Наразі історія порожня.",
+    "alert.feed_error": "З цією стрічкою трапилась помилка",
+    "alert.no_search_result": "Немає результатів для цього пошуку.",
+    "alert.no_unread_entry": "Немає непрочитаних статей.",
+    "alert.no_user": "Ви єдиний користувач.",
+    "alert.account_unlinked": "Тепер ваш зовнішній обліковий запис підключено!",
+    "alert.account_linked": "Тепер ваш зовнішній обліковий запис від’єднано!",
+    "alert.pocket_linked": "Тепер ваш обліковий запис Pocket підключено!",
+    "alert.prefs_saved": "Уподобання збережено!",
+    "error.unlink_account_without_password": "Ви маєте встановити пароль, щоб мати можливість увійти наступного разу",
+    "error.duplicate_linked_account": "Вже є обліковий запис, під’єднаний до цього провайдера!",
+    "error.duplicate_fever_username": "Вже є обліковий запис з таким самим користувачем Fever!",
+    "error.duplicate_googlereader_username": "Вже є обліковий запис з таким самим користувачем Google Reader!",
+    "error.pocket_request_token": "Не вдалося отримати токен доступу з Pocket!",
+    "error.pocket_access_token": "Не вдалося отримати токен доступу з Pocket!",
+    "error.category_already_exists": "Така категорія вже існує.",
+    "error.unable_to_create_category": "Не вдається сворити категорію.",
+    "error.unable_to_update_category": "Не вдається відредагувати категорію.",
+    "error.user_already_exists": "Такий користувач вже існує.",
+    "error.unable_to_create_user": "Не вдається створити користувача.",
+    "error.unable_to_update_user": "Не вдається оновити користувача.",
+    "error.unable_to_update_feed": "Не вдається оновити стрічку.",
+    "error.subscription_not_found": "Не знайшлося жодної підписки.",
+    "error.invalid_theme": "Недійсна тема.",
+    "error.invalid_language": "Недійсна мова.",
+    "error.invalid_timezone": "Недійсний часовий пояс.",
+    "error.invalid_entry_direction": "Недійсний напрямок запису.",
+    "error.invalid_display_mode": "Недійсний режим відображення.",
+    "error.invalid_gesture_nav": "Недійсна навігація жестами.",
+    "error.invalid_default_home_page": "Недійсна домашня сторінка за замовчуванням!",
+    "error.empty_file": "Цей файл порожній.",
+    "error.bad_credentials": "Невірне ім’я користувача або пароль.",
+    "error.fields_mandatory": "Всі поля є обов’язковими.",
+    "error.title_required": "Назва є обов’язковою.",
+    "error.different_passwords": "Паролі не співпадають.",
+    "error.password_min_length": "Пароль має складати щонайменше 6 символів.",
+    "error.settings_mandatory_fields": "Поля імені, теми, мови та часового поясу є обов’язковими.",
+    "error.settings_reading_speed_is_positive": "Швидкість читання має бути додатнім цілим числом.",
+    "error.entries_per_page_invalid": "Число записів на сторінку недійсне.",
+    "error.feed_mandatory_fields": "URL та категорія є обов’язковими.",
+    "error.feed_already_exists": "Така стрічка вже існує.",
+    "error.invalid_feed_url": "Недійсна URL-адреса стрічки.",
+    "error.invalid_site_url": "Недійсна URL-адреса сайту.",
+    "error.feed_url_not_empty": "URL-адреса стрічки не може бути порожньою.",
+    "error.site_url_not_empty": "URL-адреса сайту не може бути порожньою.",
+    "error.feed_title_not_empty": "Назва стрічки не може бути порожньою.",
+    "error.feed_category_not_found": "Категорія не існує або належить до іншого користувача.",
+    "error.feed_invalid_blocklist_rule": "Правило списку блокувань недійсне.",
+    "error.feed_invalid_keeplist_rule": "Правило списку дозволень недійсне.",
+    "error.user_mandatory_fields": "Ім’я користувача є обов’язковим.",
+    "error.api_key_already_exists": "Такий ключ API вже існує.",
+    "error.unable_to_create_api_key": "Не вдається створити такий ключ API",
+    "form.feed.label.title": "Назва",
+    "form.feed.label.site_url": "URL-адреса сайту",
+    "form.feed.label.feed_url": "URL-адреса стрічки",
+    "form.feed.label.category": "Категорія",
+    "form.feed.label.crawler": "Завантажувати оригінальний вміст",
+    "form.feed.label.feed_username": "Ім’я користувача для завантаження",
+    "form.feed.label.feed_password": "Пароль для завантаження",
+    "form.feed.label.user_agent": "Назначити User Agent",
+    "form.feed.label.cookie": "Встановити кукі",
+    "form.feed.label.scraper_rules": "Правила Scraper",
+    "form.feed.label.rewrite_rules": "Правила Rewrite",
+    "form.feed.label.blocklist_rules": "Правила блокування",
+    "form.feed.label.keeplist_rules": "Правила дозволення",
+    "form.feed.label.urlrewrite_rules": "Правила перезапису URL-адрес",
+    "form.feed.label.apprise_service_urls": "Comma separated list of Apprise service URLs",
+    "form.feed.label.ignore_http_cache": "Ігнорувати кеш HTTP",
+    "form.feed.label.allow_self_signed_certificates": "Дозволити сертифікати з власним підписом або недійсні",
+    "form.feed.label.fetch_via_proxy": "Використати проксі-сервер",
+    "form.feed.label.disabled": "Не оновлювати цю стрічку",
+    "form.feed.label.no_media_player": "No media player (audio/video)",
+    "form.feed.label.hide_globally": "Приховати записи в глобальному списку непрочитаного",
+    "form.category.label.title": "Назва",
+    "form.category.hide_globally": "Приховати записи в глобальному списку непрочитаного",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
+    "form.user.label.username": "Ім’я користувача",
+    "form.user.label.password": "Пароль",
+    "form.user.label.confirmation": "Підтверждення паролю",
+    "form.user.label.admin": "Адміністратор",
+    "form.prefs.label.language": "Мова",
+    "form.prefs.label.timezone": "Часовий пояс",
+    "form.prefs.label.theme": "Тема",
+    "form.prefs.label.entry_sorting": "Сортування записів",
+    "form.prefs.label.entries_per_page": "Кількість записів на сторінку",
+    "form.prefs.label.default_reading_speed": "Швидкість читання для інших мов (слів на хвилину)",
+    "form.prefs.label.cjk_reading_speed": "Швидкість читання для китайської, корейської та японської мови (символів на хвилину)",
+    "form.prefs.label.display_mode": "Режим відображення Progressive Web App (PWA).",
+    "form.prefs.select.older_first": "Старіші записи спочатку",
+    "form.prefs.select.recent_first": "Останні записи спочатку",
+    "form.prefs.select.fullscreen": "Повний екран",
+    "form.prefs.select.standalone": "Автономний",
+    "form.prefs.select.minimal_ui": "Мінімальний",
+    "form.prefs.select.browser": "Браузер",
+    "form.prefs.select.publish_time": "Дата публікації запису",
+    "form.prefs.select.created_time": "Дата створення запису",
+    "form.prefs.select.alphabetical": "За алфавітом",
+    "form.prefs.select.unread_count": "Кількість непрочитаних",
+    "form.prefs.select.none": "Жодного",
+    "form.prefs.select.tap": "Двічі натисніть",
+    "form.prefs.select.swipe": "Проведіть пальцем",
+    "form.prefs.label.keyboard_shortcuts": "Увімкнути комбінації клавиш",
+    "form.prefs.label.entry_swipe": "Увімкніть введення пальцем на сенсорних екранах",
+    "form.prefs.label.gesture_nav": "Жест для переходу між записами",
+    "form.prefs.label.show_reading_time": "Показувати приблизний час читання для записів",
+    "form.prefs.label.custom_css": "Спеціальний CSS",
+    "form.prefs.label.entry_order": "Стовпець сортування записів",
+    "form.prefs.label.default_home_page": "Домашня сторінка за умовчанням",
+    "form.prefs.label.categories_sorting_order": "Сортування за категоріями",
+    "form.prefs.label.mark_read_on_view": "Автоматично позначати записи як прочитані під час перегляду",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
+    "form.import.label.file": "Файл OPML",
+    "form.import.label.url": "URL-адреса",
+    "form.integration.fever_activate": "Увімкнути API Fever",
+    "form.integration.fever_username": "Ім’я користувача Fever",
+    "form.integration.fever_password": "Пароль Fever",
+    "form.integration.fever_endpoint": "Адреса доступу API Fever:",
+    "form.integration.googlereader_activate": "Увімкнути API Google Reader",
+    "form.integration.googlereader_username": "Ім’я користувача Google Reader",
+    "form.integration.googlereader_password": "Пароль Google Reader",
+    "form.integration.googlereader_endpoint": "Адреса доступу API Google Reader:",
+    "form.integration.pinboard_activate": "Зберігати статті до Pinboard",
+    "form.integration.pinboard_token": "API ключ від Pinboard",
+    "form.integration.pinboard_tags": "Теги для Pinboard",
+    "form.integration.pinboard_bookmark": "Відмічати закладку як непрочитану",
+    "form.integration.instapaper_activate": "Зберігати статті до Instapaper",
+    "form.integration.instapaper_username": "Ім’я користувача Instapaper",
+    "form.integration.instapaper_password": "Пароль Instapaper",
+    "form.integration.pocket_activate": "Зберігати статті до Pocket",
+    "form.integration.pocket_consumer_key": "Pocket Consumer Key",
+    "form.integration.pocket_access_token": "Pocket Access Token",
+    "form.integration.pocket_connect_link": "Підключити ваш обліковий запис Pocket",
+    "form.integration.wallabag_activate": "Зберігати статті до Wallabag",
+    "form.integration.wallabag_only_url": "Надіслати лише URL (замість повного вмісту)",
+    "form.integration.wallabag_endpoint": "Wallabag API Endpoint",
+    "form.integration.wallabag_client_id": "Wallabag Client ID",
+    "form.integration.wallabag_client_secret": "Wallabag Client Secret",
+    "form.integration.wallabag_username": "Ім’я користувача Wallabag",
+    "form.integration.wallabag_password": "Пароль Wallabag",
+    "form.integration.notion_activate": "Save entries to Notion",
+    "form.integration.notion_page_id": "Notion Page ID",
+    "form.integration.notion_token": "Notion Secret Token",
+    "form.integration.apprise_activate": "Push entries to Apprise",
+    "form.integration.apprise_url": "Apprise API URL",
+    "form.integration.apprise_services_url": "Comma separated list of Apprise service URLs",
+    "form.integration.nunux_keeper_activate": "Зберігати статті до Nunux Keeper",
+    "form.integration.nunux_keeper_endpoint": "Nunux Keeper API Endpoint",
+    "form.integration.nunux_keeper_api_key": "Ключ API Nunux Keeper",
+    "form.integration.espial_activate": "Зберігати статті до Espial",
+    "form.integration.espial_endpoint": "Espial API Endpoint",
+    "form.integration.espial_api_key": "Ключ API Espial",
+    "form.integration.espial_tags": "Теги для Espial",
+    "form.integration.readwise_activate": "Save entries to Readwise Reader",
+    "form.integration.readwise_api_key": "Readwise Reader Access Token",
+    "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
+    "form.integration.telegram_bot_activate": "Відправляти нові статті до чату Telegram",
+    "form.integration.telegram_bot_token": "Токен боту",
+    "form.integration.telegram_topic_id": "Topic ID",
+    "form.integration.telegram_bot_disable_web_page_preview": "Disable web page preview",
+    "form.integration.telegram_bot_disable_notification": "Disable notification",
+    "form.integration.telegram_chat_id": "ID чату",
+    "form.integration.linkding_activate": "Зберігати статті до Linkding",
+    "form.integration.linkding_endpoint": "Linkding API Endpoint",
+    "form.integration.linkding_api_key": "Ключ API Linkding",
+    "form.integration.linkding_tags": "Linkding Tags",
+    "form.integration.linkding_bookmark": "Відмічати закладку як непрочитану",
+    "form.integration.matrix_bot_activate": "Перенесення нових статей в Матрицю",
+    "form.integration.matrix_bot_user": "Ім'я користувача для Matrix",
+    "form.integration.matrix_bot_password": "Пароль для користувача Matrix",
+    "form.integration.matrix_bot_url": "URL-адреса сервера Матриці",
+    "form.integration.matrix_bot_chat_id": "Ідентифікатор кімнати Матриці",
+    "form.integration.shiori_activate": "Save articles to Shiori",
+    "form.integration.shiori_endpoint": "Shiori API Endpoint",
+    "form.integration.shiori_username": "Shiori Username",
+    "form.integration.shiori_password": "Shiori Password",
+    "form.integration.shaarli_activate": "Save articles to Shaarli",
+    "form.integration.shaarli_endpoint": "Shaarli URL",
+    "form.integration.shaarli_api_secret": "Shaarli API Secret",
+    "form.integration.webhook_activate": "Enable Webhook",
+    "form.integration.webhook_url": "Webhook URL",
+    "form.integration.webhook_secret": "Webhook Secret",
+    "form.api_key.label.description": "Назва ключа API",
+    "form.submit.loading": "Завантаження...",
+    "form.submit.saving": "Зберігаю...",
+    "time_elapsed.not_yet": "ще ні",
+    "time_elapsed.yesterday": "вчора",
+    "time_elapsed.now": "прямо зараз",
+    "time_elapsed.minutes": [
+        "%d хвилину тому",
+        "%d хвилини тому",
+        "%d хвилин тому"
+    ],
+    "time_elapsed.hours": [
+        "%d годину тому",
+        "%d години тому",
+        "%d годин тому"
+    ],
+    "time_elapsed.days": [
+        "%d день тому",
+        "%d дні тому",
+        "%d днів тому"
+    ],
+    "time_elapsed.weeks": [
+        "%d тиждень тому",
+        "%d тижня тому",
+        "%d тижнів тому"
+    ],
+    "time_elapsed.months": [
+        "%d місяць тому",
+        "%d місяця тому",
+        "%d місяців    тому"
+    ],
+    "time_elapsed.years": [
+        "%d рік тому",
+        "%d роки тому",
+        "%d років тому"
+    ]
 }

+ 7 - 0
internal/locale/translations/zh_CN.json

@@ -287,6 +287,10 @@
     "form.feed.label.disabled": "请勿刷新此源",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "隐藏全局未读列表中的文章",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "标题",
     "form.category.hide_globally": "隐藏全局未读列表中的文章",
     "form.user.label.username": "用户名",
@@ -323,6 +327,9 @@
     "form.prefs.label.default_home_page": "默认主页",
     "form.prefs.label.categories_sorting_order": "分类排序",
     "form.prefs.label.mark_read_on_view": "查看时自动将条目标记为已读",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML 文件",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "启用 Fever API",

+ 7 - 0
internal/locale/translations/zh_TW.json

@@ -289,6 +289,10 @@
     "form.feed.label.disabled": "請勿重新整理此Feed",
     "form.feed.label.no_media_player": "No media player (audio/video)",
     "form.feed.label.hide_globally": "隱藏全域性未讀列表中的文章",
+    "form.feed.fieldset.general": "General",
+    "form.feed.fieldset.rules": "Rules",
+    "form.feed.fieldset.network_settings": "Network Settings",
+    "form.feed.fieldset.integration": "Third-Party Services",
     "form.category.label.title": "標題",
     "form.category.hide_globally": "隱藏全域性未讀列表中的文章",
     "form.user.label.username": "使用者名稱",
@@ -325,6 +329,9 @@
     "form.prefs.label.default_home_page": "默認主頁",
     "form.prefs.label.categories_sorting_order": "分類排序",
     "form.prefs.label.mark_read_on_view": "查看時自動將條目標記為已讀",
+    "form.prefs.fieldset.application_settings": "Application Settings",
+    "form.prefs.fieldset.authentication_settings": "Authentication Settings",
+    "form.prefs.fieldset.reader_settings": "Reader Settings",
     "form.import.label.file": "OPML 檔案",
     "form.import.label.url": "URL",
     "form.integration.fever_activate": "啟用 Fever API",

+ 142 - 114
internal/template/templates/views/edit_feed.html

@@ -40,120 +40,148 @@
             <div class="alert alert-error">{{ t .errorMessage }}</div>
         {{ end }}
 
-        <label for="form-category">{{ t "form.feed.label.category" }}</label>
-        <select id="form-category" name="category_id" autofocus>
-        {{ range .categories }}
-            <option value="{{ .ID }}" {{ if eq .ID $.form.CategoryID }}selected="selected"{{ end }}>{{ .Title }}</option>
-        {{ end }}
-        </select>
-
-        <label for="form-title">{{ t "form.feed.label.title" }}</label>
-        <input type="text" name="title" id="form-title" value="{{ .form.Title }}" spellcheck="false" required>
-
-        <label for="form-site-url">{{ t "form.feed.label.site_url" }}</label>
-        <input type="url" name="site_url" id="form-site-url" placeholder="https://domain.tld/" value="{{ .form.SiteURL }}" spellcheck="false" required>
-
-        <label for="form-feed-url">{{ t "form.feed.label.feed_url" }}</label>
-        <input type="url" name="feed_url" id="form-feed-url" placeholder="https://domain.tld/" value="{{ .form.FeedURL }}" spellcheck="false" required>
-
-        <label for="form-feed-username">{{ t "form.feed.label.feed_username" }}</label>
-        <input type="text" name="feed_username" id="form-feed-username" value="{{ .form.Username }}" spellcheck="false">
-
-        <label for="form-feed-password">{{ t "form.feed.label.feed_password" }}</label>
-        <!--
-            We are using the type "text" otherwise Firefox always autocomplete this password:
-
-            - autocomplete="off" or autocomplete="new-password" doesn't change anything
-            - Changing the input ID doesn't change anything
-            - Using a different input name doesn't change anything
-        -->
-        <input type="text" name="feed_password" id="form-feed-password" value="{{ .form.Password }}" spellcheck="false">
-
-	    <label for="form-user-agent">{{ t "form.feed.label.user_agent" }}</label>
-	    <input type="text" name="user_agent" id="form-user-agent" placeholder="{{ .defaultUserAgent }}" value="{{ .form.UserAgent }}" spellcheck="false">
-
-        <label for="form-cookie">{{ t "form.feed.label.cookie" }}</label>
-        <input type="text" name="cookie" id="form-cookie" value="{{ .form.Cookie }}" spellcheck="false">
-
-        <div class="form-label-row">
-            <label for="form-scraper-rules">
-                {{ t "form.feed.label.scraper_rules" }}
-            </label>
-            &nbsp;
-            <a href="https://miniflux.app/docs/rules.html#scraper-rules" target="_blank">
-                {{ icon "external-link" }}
-            </a>
-        </div>
-        <input type="text" name="scraper_rules" id="form-scraper-rules" value="{{ .form.ScraperRules }}" spellcheck="false">
-
-        <div class="form-label-row">
-            <label for="form-rewrite-rules">
-                {{ t "form.feed.label.rewrite_rules" }}
-            </label>
-            &nbsp;
-            <a href="https://miniflux.app/docs/rules.html#rewrite-rules" target="_blank">
-                {{ icon "external-link" }}
-            </a>
-        </div>
-        <input type="text" name="rewrite_rules" id="form-rewrite-rules" value="{{ .form.RewriteRules }}" spellcheck="false">
-        <div class="form-label-row">
-            <label for="form-blocklist-rules">
-                {{ t "form.feed.label.blocklist_rules" }}
-            </label>
-            &nbsp;
-            <a href=" https://miniflux.app/docs/rules.html#filtering-rules" target="_blank">
-                {{ icon "external-link" }}
-            </a>
-        </div>
-        <input type="text" name="blocklist_rules" id="form-blocklist-rules" value="{{ .form.BlocklistRules }}" spellcheck="false">
-
-        <div class="form-label-row">
-            <label for="form-keeplist-rules">
-                {{ t "form.feed.label.keeplist_rules" }}
-            </label>
-            &nbsp;
-            <a href=" https://miniflux.app/docs/rules.html#filtering-rules" target="_blank">
-                {{ icon "external-link" }}
-            </a>
-        </div>
-        <input type="text" name="keeplist_rules" id="form-keeplist-rules" value="{{ .form.KeeplistRules }}" spellcheck="false">
-
-        <div class="form-label-row">
-            <label for="form-urlrewrite-rules">
-                {{ t "form.feed.label.urlrewrite_rules" }}
-            </label>
-            &nbsp;
-            <a href=" https://miniflux.app/docs/rules.html#rewriteurl-rules" target="_blank">
-                {{ icon "external-link" }}
-            </a>
-        </div>
-        <input type="text" name="urlrewrite_rules" id="form-urlrewrite-rules" value="{{ .form.UrlRewriteRules }}" spellcheck="false">
-
-        <div class="form-label-row">
-            <label for="form-apprise-service-urls">
-                {{ t "form.feed.label.apprise_service_urls" }}
-            </label>
-            &nbsp;
-        </div>
-        <input type="text" name="apprise_service_urls" id="form-apprise-service-urls" value="{{ .form.AppriseServiceURLs }}" spellcheck="false">
-
-        <label><input type="checkbox" name="crawler" value="1" {{ if .form.Crawler }}checked{{ end }}> {{ t "form.feed.label.crawler" }}</label>
-        <label><input type="checkbox" name="ignore_http_cache" value="1" {{ if .form.IgnoreHTTPCache }}checked{{ end }}> {{ t "form.feed.label.ignore_http_cache" }}</label>
-        <label><input type="checkbox" name="allow_self_signed_certificates" value="1" {{ if .form.AllowSelfSignedCertificates }}checked{{ end }}> {{ t "form.feed.label.allow_self_signed_certificates" }}</label>
-        {{ if .hasProxyConfigured }}
-        <label><input type="checkbox" name="fetch_via_proxy" value="1" {{ if .form.FetchViaProxy }}checked{{ end }}> {{ t "form.feed.label.fetch_via_proxy" }}</label>
-        {{ end }}
-        <label><input type="checkbox" name="disabled" value="1" {{ if .form.Disabled }}checked{{ end }}> {{ t "form.feed.label.disabled" }}</label>
-
-        <label><input type="checkbox" name="no_media_player" {{ if .form.NoMediaPlayer }}checked{{ end }} value="1" >  {{ t "form.feed.label.no_media_player" }} </label>
-
-        {{ if not .form.CategoryHidden }}
-        <label><input type="checkbox" name="hide_globally" value="1"{{ if .form.HideGlobally }} checked{{ end }}> {{ t "form.feed.label.hide_globally" }}</label>
-        {{ end }}
-
-        <div class="buttons">
-            <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button> {{ t "action.or" }} <a href="{{ route "feeds" }}">{{ t "action.cancel" }}</a>
-        </div>
+        <fieldset>
+            <legend>{{ t "form.feed.fieldset.general" }}</legend>
+
+            <label for="form-category">{{ t "form.feed.label.category" }}</label>
+            <select id="form-category" name="category_id" autofocus>
+            {{ range .categories }}
+                <option value="{{ .ID }}" {{ if eq .ID $.form.CategoryID }}selected="selected"{{ end }}>{{ .Title }}</option>
+            {{ end }}
+            </select>
+
+            <label for="form-title">{{ t "form.feed.label.title" }}</label>
+            <input type="text" name="title" id="form-title" value="{{ .form.Title }}" spellcheck="false" required>
+
+            <label for="form-site-url">{{ t "form.feed.label.site_url" }}</label>
+            <input type="url" name="site_url" id="form-site-url" placeholder="https://domain.tld/" value="{{ .form.SiteURL }}" spellcheck="false" required>
+
+            <label for="form-feed-url">{{ t "form.feed.label.feed_url" }}</label>
+            <input type="url" name="feed_url" id="form-feed-url" placeholder="https://domain.tld/" value="{{ .form.FeedURL }}" spellcheck="false" required>
+
+            {{ if not .form.CategoryHidden }}
+            <label><input type="checkbox" name="hide_globally" value="1"{{ if .form.HideGlobally }} checked{{ end }}> {{ t "form.feed.label.hide_globally" }}</label>
+            {{ end }}
+
+            <label><input type="checkbox" name="no_media_player" {{ if .form.NoMediaPlayer }}checked{{ end }} value="1" >  {{ t "form.feed.label.no_media_player" }} </label>
+            <label><input type="checkbox" name="disabled" value="1" {{ if .form.Disabled }}checked{{ end }}> {{ t "form.feed.label.disabled" }}</label>
+
+            <div class="buttons">
+                <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+            </div>
+        </fieldset>
+
+        <fieldset>
+            <legend>{{ t "form.feed.fieldset.network_settings" }}</legend>
+
+            <label for="form-feed-username">{{ t "form.feed.label.feed_username" }}</label>
+            <input type="text" name="feed_username" id="form-feed-username" value="{{ .form.Username }}" spellcheck="false">
+
+            <label for="form-feed-password">{{ t "form.feed.label.feed_password" }}</label>
+            <!--
+                We are using the type "text" otherwise Firefox always autocomplete this password:
+
+                - autocomplete="off" or autocomplete="new-password" doesn't change anything
+                - Changing the input ID doesn't change anything
+                - Using a different input name doesn't change anything
+            -->
+            <input type="text" name="feed_password" id="form-feed-password" value="{{ .form.Password }}" spellcheck="false">
+
+            <label for="form-user-agent">{{ t "form.feed.label.user_agent" }}</label>
+            <input type="text" name="user_agent" id="form-user-agent" placeholder="{{ .defaultUserAgent }}" value="{{ .form.UserAgent }}" spellcheck="false">
+
+            <label for="form-cookie">{{ t "form.feed.label.cookie" }}</label>
+            <input type="text" name="cookie" id="form-cookie" value="{{ .form.Cookie }}" spellcheck="false">
+
+            <label><input type="checkbox" name="crawler" value="1" {{ if .form.Crawler }}checked{{ end }}> {{ t "form.feed.label.crawler" }}</label>
+            <label><input type="checkbox" name="ignore_http_cache" value="1" {{ if .form.IgnoreHTTPCache }}checked{{ end }}> {{ t "form.feed.label.ignore_http_cache" }}</label>
+            <label><input type="checkbox" name="allow_self_signed_certificates" value="1" {{ if .form.AllowSelfSignedCertificates }}checked{{ end }}> {{ t "form.feed.label.allow_self_signed_certificates" }}</label>
+            {{ if .hasProxyConfigured }}
+            <label><input type="checkbox" name="fetch_via_proxy" value="1" {{ if .form.FetchViaProxy }}checked{{ end }}> {{ t "form.feed.label.fetch_via_proxy" }}</label>
+            {{ end }}
+
+            <div class="buttons">
+                <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+            </div>
+        </fieldset>
+
+        <fieldset>
+            <legend>{{ t "form.feed.fieldset.rules" }}</legend>
+
+            <div class="form-label-row">
+                <label for="form-scraper-rules">
+                    {{ t "form.feed.label.scraper_rules" }}
+                </label>
+                &nbsp;
+                <a href="https://miniflux.app/docs/rules.html#scraper-rules" target="_blank">
+                    {{ icon "external-link" }}
+                </a>
+            </div>
+            <input type="text" name="scraper_rules" id="form-scraper-rules" value="{{ .form.ScraperRules }}" spellcheck="false">
+
+            <div class="form-label-row">
+                <label for="form-rewrite-rules">
+                    {{ t "form.feed.label.rewrite_rules" }}
+                </label>
+                &nbsp;
+                <a href="https://miniflux.app/docs/rules.html#rewrite-rules" target="_blank">
+                    {{ icon "external-link" }}
+                </a>
+            </div>
+            <input type="text" name="rewrite_rules" id="form-rewrite-rules" value="{{ .form.RewriteRules }}" spellcheck="false">
+            <div class="form-label-row">
+                <label for="form-blocklist-rules">
+                    {{ t "form.feed.label.blocklist_rules" }}
+                </label>
+                &nbsp;
+                <a href=" https://miniflux.app/docs/rules.html#filtering-rules" target="_blank">
+                    {{ icon "external-link" }}
+                </a>
+            </div>
+            <input type="text" name="blocklist_rules" id="form-blocklist-rules" value="{{ .form.BlocklistRules }}" spellcheck="false">
+
+            <div class="form-label-row">
+                <label for="form-keeplist-rules">
+                    {{ t "form.feed.label.keeplist_rules" }}
+                </label>
+                &nbsp;
+                <a href=" https://miniflux.app/docs/rules.html#filtering-rules" target="_blank">
+                    {{ icon "external-link" }}
+                </a>
+            </div>
+            <input type="text" name="keeplist_rules" id="form-keeplist-rules" value="{{ .form.KeeplistRules }}" spellcheck="false">
+
+            <div class="form-label-row">
+                <label for="form-urlrewrite-rules">
+                    {{ t "form.feed.label.urlrewrite_rules" }}
+                </label>
+                &nbsp;
+                <a href=" https://miniflux.app/docs/rules.html#rewriteurl-rules" target="_blank">
+                    {{ icon "external-link" }}
+                </a>
+            </div>
+            <input type="text" name="urlrewrite_rules" id="form-urlrewrite-rules" value="{{ .form.UrlRewriteRules }}" spellcheck="false">
+
+            <div class="buttons">
+                <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+            </div>
+        </fieldset>
+
+        <fieldset>
+            <legend>{{ t "form.feed.fieldset.integration" }}</legend>
+
+            <div class="form-label-row">
+                <label for="form-apprise-service-urls">
+                    {{ t "form.feed.label.apprise_service_urls" }}
+                </label>
+                &nbsp;
+            </div>
+            <input type="text" name="apprise_service_urls" id="form-apprise-service-urls" value="{{ .form.AppriseServiceURLs }}" spellcheck="false">
+
+            <div class="buttons">
+                <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+            </div>
+        </fieldset>
     </form>
 
     <div class="panel">

+ 136 - 116
internal/template/templates/views/settings.html

@@ -13,122 +13,142 @@
         <div class="alert alert-error">{{ t .errorMessage }}</div>
     {{ end }}
 
-    <label for="form-username">{{ t "form.user.label.username" }}</label>
-    <input type="text" name="username" id="form-username" value="{{ .form.Username }}" autocomplete="username" required>
-
-    <label for="form-password">{{ t "form.user.label.password" }}</label>
-    <input type="password" name="password" id="form-password" value="{{ .form.Password }}" autocomplete="new-password">
-
-    <label for="form-confirmation">{{ t "form.user.label.confirmation" }}</label>
-    <input type="password" name="confirmation" id="form-confirmation" value="{{ .form.Confirmation }}" autocomplete="new-password">
-
-    <label for="form-language">{{ t "form.prefs.label.language" }}</label>
-    <select id="form-language" name="language">
-    {{ range $key, $value := .languages }}
-        <option value="{{ $key }}" {{ if eq $key $.form.Language }}selected="selected"{{ end }}>{{ $value }}</option>
-    {{ end }}
-    </select>
-
-    <label for="form-timezone">{{ t "form.prefs.label.timezone" }}</label>
-    <select id="form-timezone" name="timezone">
-    {{ range $key, $value := .timezones }}
-        <option value="{{ $key }}" {{ if eq $key $.form.Timezone }}selected="selected"{{ end }}>{{ $value }}</option>
-    {{ end }}
-    </select>
-
-    <label for="form-theme">{{ t "form.prefs.label.theme" }}</label>
-    <select id="form-theme" name="theme">
-    {{ range $key, $value := .themes }}
-        <option value="{{ $key }}" {{ if eq $key $.form.Theme }}selected="selected"{{ end }}>{{ $value }}</option>
-    {{ end }}
-    </select>
-
-    <div class="form-label-row">
-        <label for="form-display-mode">{{ t "form.prefs.label.display_mode" }}</label>
-        &nbsp;
-        <a href="https://developer.mozilla.org/en-US/docs/Web/Manifest/display" target="_blank">
-            {{ icon "external-link" }}
-        </a>
-    </div>
-    <select id="form-display-mode" name="display_mode">
-        <option value="fullscreen" {{ if eq "fullscreen" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.fullscreen" }}</option>
-        <option value="standalone" {{ if eq "standalone" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.standalone" }}</option>
-        <option value="minimal-ui" {{ if eq "minimal-ui" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.minimal_ui" }}</option>
-        <option value="browser" {{ if eq "browser" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.browser" }}</option>
-    </select>
-
-    <label for="form-entry-direction">{{ t "form.prefs.label.entry_sorting" }}</label>
-    <select id="form-entry-direction" name="entry_direction">
-        <option value="asc" {{ if eq "asc" $.form.EntryDirection }}selected="selected"{{ end }}>{{ t "form.prefs.select.older_first" }}</option>
-        <option value="desc" {{ if eq "desc" $.form.EntryDirection }}selected="selected"{{ end }}>{{ t "form.prefs.select.recent_first" }}</option>
-    </select>
-
-    <label for="form-entry-order">{{ t "form.prefs.label.entry_order" }}</label>
-    <select id="form-entry-order" name="entry_order">
-        <option value="published_at" {{ if eq "published_at" $.form.EntryOrder }}selected="selected"{{ end }}>{{ t "form.prefs.select.publish_time" }}</option>
-        <option value="created_at" {{ if eq "created_at" $.form.EntryOrder }}selected="selected"{{ end }}>{{ t "form.prefs.select.created_time" }}</option>
-    </select>
-
-    <label for="form-default-home-page">{{ t "form.prefs.label.default_home_page" }}</label>
-    <select id="form-default-home-page" name="default_home_page">
-    {{ range $key, $value := .default_home_pages }}
-        <option value="{{ $key }}" {{ if eq $key $.form.DefaultHomePage }}selected="selected"{{ end }}>{{ t $value }}</option>
-    {{ end }}
-    </select>
-
-    <label for="form-categories-sorting-order">{{ t "form.prefs.label.categories_sorting_order" }}</label>
-    <select id="form-categories-sorting-order" name="categories_sorting_order">
-    {{ range $key, $value := .categories_sorting_options }}
-        <option value="{{ $key }}" {{ if eq $key $.form.CategoriesSortingOrder }}selected="selected"{{ end }}>{{ t $value }}</option>
-    {{ end }}
-    </select>
-
-    <label for="form-entries-per-page">{{ t "form.prefs.label.entries_per_page" }}</label>
-    <input type="number" name="entries_per_page" id="form-entries-per-page" value="{{ .form.EntriesPerPage }}" min="1">
-
-    <label><input type="checkbox" name="keyboard_shortcuts" value="1" {{ if .form.KeyboardShortcuts }}checked{{ end }}> {{ t "form.prefs.label.keyboard_shortcuts" }}</label>
-
-    <label><input type="checkbox" name="entry_swipe" value="1" {{ if .form.EntrySwipe }}checked{{ end }}> {{ t "form.prefs.label.entry_swipe" }}</label>
-
-    <label for="form-gesture-nav">{{ t "form.prefs.label.gesture_nav" }}</label>
-    <select id="form-gesture-nav" name="gesture_nav">
-        <option value="none" {{ if eq "none" $.form.GestureNav }}selected="selected"{{ end }}>{{ t "form.prefs.select.none" }}</option>
-        <option value="tap" {{ if eq "tap" $.form.GestureNav }}selected="selected"{{ end }}>{{ t "form.prefs.select.tap" }}</option>
-        <option value="swipe" {{ if eq "swipe" $.form.GestureNav }}selected="selected"{{ end }}>{{ t "form.prefs.select.swipe" }}</option>
-    </select>
-
-    <label><input type="checkbox" name="show_reading_time" value="1" {{ if .form.ShowReadingTime }}checked{{ end }}> {{ t "form.prefs.label.show_reading_time" }}</label>
-
-    <label><input type="checkbox" name="mark_read_on_view" value="1" {{ if .form.MarkReadOnView }}checked{{ end }}> {{ t "form.prefs.label.mark_read_on_view" }}</label>
-
-    <label for="form-cjk-reading-speed">{{ t "form.prefs.label.cjk_reading_speed" }}</label>
-    <input type="number" name="cjk_reading_speed" id="form-cjk-reading-speed" value="{{ .form.CJKReadingSpeed }}" min="1">
-
-    <label for="form-default-reading-speed">{{ t "form.prefs.label.default_reading_speed" }}</label>
-    <input type="number" name="default_reading_speed" id="form-default-reading-speed" value="{{ .form.DefaultReadingSpeed }}" min="1">
-
-    <label>{{t "form.prefs.label.custom_css" }}</label><textarea name="custom_css" cols="40" rows="8" spellcheck="false">{{ .form.CustomCSS }}</textarea>
-    <div class="buttons">
-        <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
-    </div>
+    <fieldset>
+        <legend>{{ t "form.prefs.fieldset.authentication_settings" }}</legend>
+
+        <label for="form-username">{{ t "form.user.label.username" }}</label>
+        <input type="text" name="username" id="form-username" value="{{ .form.Username }}" autocomplete="username" required>
+    
+        <label for="form-password">{{ t "form.user.label.password" }}</label>
+        <input type="password" name="password" id="form-password" value="{{ .form.Password }}" autocomplete="new-password">
+    
+        <label for="form-confirmation">{{ t "form.user.label.confirmation" }}</label>
+        <input type="password" name="confirmation" id="form-confirmation" value="{{ .form.Confirmation }}" autocomplete="new-password">
+
+        {{ if hasOAuth2Provider "google" }}
+        <div class="panel">
+            {{ if .user.GoogleID }}
+                <a href="{{ route "oauth2Unlink" "provider" "google" }}">{{ t "page.settings.unlink_google_account" }}</a>
+            {{ else }}
+                <a href="{{ route "oauth2Redirect" "provider" "google" }}">{{ t "page.settings.link_google_account" }}</a>
+            {{ end }}
+        </div>
+        {{ else if hasOAuth2Provider "oidc" }}
+        <div class="panel">
+            {{ if .user.OpenIDConnectID }}
+                <a href="{{ route "oauth2Unlink" "provider" "oidc" }}">{{ t "page.settings.unlink_oidc_account" }}</a>
+            {{ else }}
+                <a href="{{ route "oauth2Redirect" "provider" "oidc" }}">{{ t "page.settings.link_oidc_account" }}</a>
+            {{ end }}
+        </div>
+        {{ end }}
+
+        <div class="buttons">
+            <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+        </div>
+    </fieldset>
+
+    <fieldset>
+        <legend>{{ t "form.prefs.fieldset.reader_settings" }}</legend>
+
+        <label for="form-cjk-reading-speed">{{ t "form.prefs.label.cjk_reading_speed" }}</label>
+        <input type="number" name="cjk_reading_speed" id="form-cjk-reading-speed" value="{{ .form.CJKReadingSpeed }}" min="1">
+
+        <label for="form-default-reading-speed">{{ t "form.prefs.label.default_reading_speed" }}</label>
+        <input type="number" name="default_reading_speed" id="form-default-reading-speed" value="{{ .form.DefaultReadingSpeed }}" min="1">
+    
+        <label><input type="checkbox" name="show_reading_time" value="1" {{ if .form.ShowReadingTime }}checked{{ end }}> {{ t "form.prefs.label.show_reading_time" }}</label>
+
+        <label><input type="checkbox" name="mark_read_on_view" value="1" {{ if .form.MarkReadOnView }}checked{{ end }}> {{ t "form.prefs.label.mark_read_on_view" }}</label>    
+
+        <div class="buttons">
+            <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+        </div>
+    </fieldset>
+
+    <fieldset>
+        <legend>{{ t "form.prefs.fieldset.application_settings" }}</legend>
+
+        <label for="form-language">{{ t "form.prefs.label.language" }}</label>
+        <select id="form-language" name="language">
+        {{ range $key, $value := .languages }}
+            <option value="{{ $key }}" {{ if eq $key $.form.Language }}selected="selected"{{ end }}>{{ $value }}</option>
+        {{ end }}
+        </select>
+
+        <label for="form-timezone">{{ t "form.prefs.label.timezone" }}</label>
+        <select id="form-timezone" name="timezone">
+        {{ range $key, $value := .timezones }}
+            <option value="{{ $key }}" {{ if eq $key $.form.Timezone }}selected="selected"{{ end }}>{{ $value }}</option>
+        {{ end }}
+        </select>
+
+        <label for="form-theme">{{ t "form.prefs.label.theme" }}</label>
+        <select id="form-theme" name="theme">
+        {{ range $key, $value := .themes }}
+            <option value="{{ $key }}" {{ if eq $key $.form.Theme }}selected="selected"{{ end }}>{{ $value }}</option>
+        {{ end }}
+        </select>
+
+        <div class="form-label-row">
+            <label for="form-display-mode">{{ t "form.prefs.label.display_mode" }}</label>
+            &nbsp;
+            <a href="https://developer.mozilla.org/en-US/docs/Web/Manifest/display" target="_blank">
+                {{ icon "external-link" }}
+            </a>
+        </div>
+        <select id="form-display-mode" name="display_mode">
+            <option value="fullscreen" {{ if eq "fullscreen" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.fullscreen" }}</option>
+            <option value="standalone" {{ if eq "standalone" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.standalone" }}</option>
+            <option value="minimal-ui" {{ if eq "minimal-ui" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.minimal_ui" }}</option>
+            <option value="browser" {{ if eq "browser" $.form.DisplayMode }}selected="selected"{{ end }}>{{ t "form.prefs.select.browser" }}</option>
+        </select>
+
+        <label for="form-default-home-page">{{ t "form.prefs.label.default_home_page" }}</label>
+        <select id="form-default-home-page" name="default_home_page">
+        {{ range $key, $value := .default_home_pages }}
+            <option value="{{ $key }}" {{ if eq $key $.form.DefaultHomePage }}selected="selected"{{ end }}>{{ t $value }}</option>
+        {{ end }}
+        </select>
+
+        <label for="form-entry-direction">{{ t "form.prefs.label.entry_sorting" }}</label>
+        <select id="form-entry-direction" name="entry_direction">
+            <option value="asc" {{ if eq "asc" $.form.EntryDirection }}selected="selected"{{ end }}>{{ t "form.prefs.select.older_first" }}</option>
+            <option value="desc" {{ if eq "desc" $.form.EntryDirection }}selected="selected"{{ end }}>{{ t "form.prefs.select.recent_first" }}</option>
+        </select>
+    
+        <label for="form-entry-order">{{ t "form.prefs.label.entry_order" }}</label>
+        <select id="form-entry-order" name="entry_order">
+            <option value="published_at" {{ if eq "published_at" $.form.EntryOrder }}selected="selected"{{ end }}>{{ t "form.prefs.select.publish_time" }}</option>
+            <option value="created_at" {{ if eq "created_at" $.form.EntryOrder }}selected="selected"{{ end }}>{{ t "form.prefs.select.created_time" }}</option>
+        </select>
+    
+        <label for="form-categories-sorting-order">{{ t "form.prefs.label.categories_sorting_order" }}</label>
+        <select id="form-categories-sorting-order" name="categories_sorting_order">
+        {{ range $key, $value := .categories_sorting_options }}
+            <option value="{{ $key }}" {{ if eq $key $.form.CategoriesSortingOrder }}selected="selected"{{ end }}>{{ t $value }}</option>
+        {{ end }}
+        </select>
+
+        <label for="form-gesture-nav">{{ t "form.prefs.label.gesture_nav" }}</label>
+        <select id="form-gesture-nav" name="gesture_nav">
+            <option value="none" {{ if eq "none" $.form.GestureNav }}selected="selected"{{ end }}>{{ t "form.prefs.select.none" }}</option>
+            <option value="tap" {{ if eq "tap" $.form.GestureNav }}selected="selected"{{ end }}>{{ t "form.prefs.select.tap" }}</option>
+            <option value="swipe" {{ if eq "swipe" $.form.GestureNav }}selected="selected"{{ end }}>{{ t "form.prefs.select.swipe" }}</option>
+        </select>
+
+        <label for="form-entries-per-page">{{ t "form.prefs.label.entries_per_page" }}</label>
+        <input type="number" name="entries_per_page" id="form-entries-per-page" value="{{ .form.EntriesPerPage }}" min="1">
+    
+        <label><input type="checkbox" name="keyboard_shortcuts" value="1" {{ if .form.KeyboardShortcuts }}checked{{ end }}> {{ t "form.prefs.label.keyboard_shortcuts" }}</label>
+    
+        <label><input type="checkbox" name="entry_swipe" value="1" {{ if .form.EntrySwipe }}checked{{ end }}> {{ t "form.prefs.label.entry_swipe" }}</label>
+
+        <label>{{t "form.prefs.label.custom_css" }}</label><textarea name="custom_css" cols="40" rows="8" spellcheck="false">{{ .form.CustomCSS }}</textarea>
+        <div class="buttons">
+            <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
+        </div>
+    </fieldset>
 </form>
 
-{{ if hasOAuth2Provider "google" }}
-<div class="panel">
-    {{ if .user.GoogleID }}
-        <a href="{{ route "oauth2Unlink" "provider" "google" }}">{{ t "page.settings.unlink_google_account" }}</a>
-    {{ else }}
-        <a href="{{ route "oauth2Redirect" "provider" "google" }}">{{ t "page.settings.link_google_account" }}</a>
-    {{ end }}
-</div>
-{{ else if hasOAuth2Provider "oidc" }}
-<div class="panel">
-    {{ if .user.OpenIDConnectID }}
-        <a href="{{ route "oauth2Unlink" "provider" "oidc" }}">{{ t "page.settings.unlink_oidc_account" }}</a>
-    {{ else }}
-        <a href="{{ route "oauth2Redirect" "provider" "oidc" }}">{{ t "page.settings.link_oidc_account" }}</a>
-    {{ end }}
-</div>
-{{ end }}
-
 {{ end }}

+ 6 - 1
internal/ui/static/css/common.css

@@ -321,8 +321,9 @@ tr:hover {
 
 /* Forms */
 fieldset {
-    border: 1px solid #ddd;
+    border: 1px dotted #ddd;
     padding: 8px;
+    margin-bottom: 20px;
 }
 
 legend {
@@ -486,6 +487,10 @@ a.button-primary:focus,
     margin-bottom: 20px;
 }
 
+fieldset .buttons {
+    margin-bottom: 0;
+}
+
 /* Alerts */
 .alert {
     padding: 8px 35px 8px 14px;