diff --git a/commafeed-client/src/App.tsx b/commafeed-client/src/App.tsx
index 61b71733..70b73e00 100644
--- a/commafeed-client/src/App.tsx
+++ b/commafeed-client/src/App.tsx
@@ -15,6 +15,7 @@ import { Tree } from "components/sidebar/Tree"
import { useI18n } from "i18n"
import { AdminUsersPage } from "pages/admin/AdminUsersPage"
import { MetricsPage } from "pages/admin/MetricsPage"
+import { AboutPage } from "pages/app/AboutPage"
import { AddPage } from "pages/app/AddPage"
import { CategoryDetailsPage } from "pages/app/CategoryDetailsPage"
import { FeedDetailsPage } from "pages/app/FeedDetailsPage"
@@ -81,6 +82,7 @@ function AppRoutes() {
} />
} />
+ } />
} />
diff --git a/commafeed-client/src/app/slices/redirect.ts b/commafeed-client/src/app/slices/redirect.ts
index c138d470..2e0bc4e4 100644
--- a/commafeed-client/src/app/slices/redirect.ts
+++ b/commafeed-client/src/app/slices/redirect.ts
@@ -40,6 +40,7 @@ export const redirectToAdminUsers = createAsyncThunk("redirect/admin/users", (_,
export const redirectToMetrics = createAsyncThunk("redirect/admin/metrics", (_, thunkApi) =>
thunkApi.dispatch(redirectTo("/app/admin/metrics"))
)
+export const redirectToAbout = createAsyncThunk("redirect/about", (_, thunkApi) => thunkApi.dispatch(redirectTo("/app/about")))
export const redirectSlice = createSlice({
name: "redirect",
diff --git a/commafeed-client/src/components/KeyboardShortcutsHelp.tsx b/commafeed-client/src/components/KeyboardShortcutsHelp.tsx
new file mode 100644
index 00000000..b7aedfb5
--- /dev/null
+++ b/commafeed-client/src/components/KeyboardShortcutsHelp.tsx
@@ -0,0 +1,134 @@
+import { Trans } from "@lingui/macro"
+import { Kbd, Table } from "@mantine/core"
+
+export function KeyboardShortcutsHelp() {
+ return (
+
+
+
+ |
+ Refresh
+ |
+
+ R
+ |
+
+
+ |
+ Open next entry
+ |
+
+ J
+ |
+
+
+ |
+ Open previous entry
+ |
+
+ K
+ |
+
+
+ |
+ Move the page down
+ |
+
+
+ Space
+
+ |
+
+
+ |
+ Move the page up
+ |
+
+
+ Shift
+
+ +
+
+ Space
+
+ |
+
+
+ |
+ Open/close current entry
+ |
+
+ O,
+
+ Enter
+
+ |
+
+
+ |
+ Open current entry in a new tab
+ |
+
+ V
+ |
+
+
+ |
+ Open current entry in a new tab in the background
+ |
+
+ B
+ |
+
+
+ |
+ Toggle read status of current entry
+ |
+
+ M
+ |
+
+
+ |
+ Mark all entries as read
+ |
+
+
+ Shift
+
+ +
+ A
+ |
+
+
+ |
+ Go to the All view
+ |
+
+ G
+
+ A
+ |
+
+
+ |
+ Navigate to a subscription by entering its name
+ |
+
+ G
+
+ U
+ |
+
+
+ |
+ Show keyboard shortcut help
+ |
+
+ ?
+ |
+
+
+
+ )
+}
diff --git a/commafeed-client/src/components/content/FeedEntries.tsx b/commafeed-client/src/components/content/FeedEntries.tsx
index 6ef879ea..f77b7b2e 100644
--- a/commafeed-client/src/components/content/FeedEntries.tsx
+++ b/commafeed-client/src/components/content/FeedEntries.tsx
@@ -1,3 +1,5 @@
+import { t } from "@lingui/macro"
+import { openModal } from "@mantine/modals"
import { Constants } from "app/constants"
import {
loadMoreEntries,
@@ -10,6 +12,7 @@ import {
} from "app/slices/entries"
import { redirectToRootCategory } from "app/slices/redirect"
import { useAppDispatch, useAppSelector } from "app/store"
+import { KeyboardShortcutsHelp } from "components/KeyboardShortcutsHelp"
import { Loader } from "components/Loader"
import { useMousetrap } from "hooks/useMousetrap"
import { useEffect, useRef } from "react"
@@ -129,6 +132,9 @@ export function FeedEntries() {
useMousetrap("g a", () => {
dispatch(redirectToRootCategory())
})
+ useMousetrap("?", () => {
+ openModal({ title: t`Keyboard shortcuts`, size: "xl", children: })
+ })
if (!entries) return
return (
diff --git a/commafeed-client/src/components/content/add/CategorySelect.tsx b/commafeed-client/src/components/content/add/CategorySelect.tsx
index 3a53972b..562d58a3 100644
--- a/commafeed-client/src/components/content/add/CategorySelect.tsx
+++ b/commafeed-client/src/components/content/add/CategorySelect.tsx
@@ -1,9 +1,12 @@
+import { t } from "@lingui/macro"
import { Select, SelectItem, SelectProps } from "@mantine/core"
import { Constants } from "app/constants"
import { useAppSelector } from "app/store"
import { flattenCategoryTree } from "app/utils"
-export function CategorySelect(props: Partial) {
+type CategorySelectProps = Partial & { withAll?: boolean }
+
+export function CategorySelect(props: CategorySelectProps) {
const rootCategory = useAppSelector(state => state.tree.rootCategory)
const categories = rootCategory && flattenCategoryTree(rootCategory)
const selectData: SelectItem[] | undefined = categories
@@ -13,6 +16,12 @@ export function CategorySelect(props: Partial) {
label: c.name,
value: c.id,
}))
+ if (props.withAll) {
+ selectData?.unshift({
+ label: t`All`,
+ value: Constants.categoryIds.all,
+ })
+ }
return
}
diff --git a/commafeed-client/src/components/header/ProfileMenu.tsx b/commafeed-client/src/components/header/ProfileMenu.tsx
index 4c8f088a..a5f9f259 100644
--- a/commafeed-client/src/components/header/ProfileMenu.tsx
+++ b/commafeed-client/src/components/header/ProfileMenu.tsx
@@ -1,9 +1,9 @@
import { Trans } from "@lingui/macro"
import { Divider, Menu, useMantineColorScheme } from "@mantine/core"
-import { redirectToAdminUsers, redirectToMetrics, redirectToSettings } from "app/slices/redirect"
+import { redirectToAbout, redirectToAdminUsers, redirectToMetrics, redirectToSettings } from "app/slices/redirect"
import { useAppDispatch, useAppSelector } from "app/store"
import { useState } from "react"
-import { TbChartLine, TbMoon, TbPower, TbSettings, TbSun, TbUsers } from "react-icons/tb"
+import { TbChartLine, TbHelp, TbMoon, TbPower, TbSettings, TbSun, TbUsers } from "react-icons/tb"
interface ProfileMenuProps {
control: React.ReactElement
@@ -65,6 +65,15 @@ export function ProfileMenu(props: ProfileMenuProps) {
)}
+ }
+ onClick={() => {
+ dispatch(redirectToAbout())
+ setOpened(false)
+ }}
+ >
+ About
+
} onClick={logout}>
Logout
diff --git a/commafeed-client/src/locales/en/messages.po b/commafeed-client/src/locales/en/messages.po
index 68904291..0b81cb86 100644
--- a/commafeed-client/src/locales/en/messages.po
+++ b/commafeed-client/src/locales/en/messages.po
@@ -29,6 +29,11 @@ msgstr "<0>Need an account?0><1>Sign up!1>"
msgid "API key"
msgstr "API key"
+#: src/components/header/ProfileMenu.tsx
+#: src/pages/app/AboutPage.tsx
+msgid "About"
+msgstr "About"
+
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Actions"
@@ -51,6 +56,7 @@ msgstr "Add user"
msgid "Admin"
msgstr "Admin"
+#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
msgid "All"
@@ -104,6 +110,10 @@ msgstr "Back"
msgid "Back to log in"
msgstr "Back to log in"
+#: src/pages/app/AboutPage.tsx
+msgid "Browser extentions"
+msgstr "Browser extentions"
+
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
@@ -121,6 +131,7 @@ msgstr "Cancel"
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
+#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Category"
@@ -133,6 +144,18 @@ msgstr "Changing password will generate a new API key"
msgid "Check that the feed is working"
msgstr "Check that the feed is working"
+#: src/pages/app/AboutPage.tsx
+msgid "CommaFeed is an open-source project. Sources are hosted on <0>GitHub0>."
+msgstr "CommaFeed is an open-source project. Sources are hosted on <0>GitHub0>."
+
+#: src/pages/app/AboutPage.tsx
+msgid "CommaFeed next unread item"
+msgstr "CommaFeed next unread item"
+
+#: src/pages/app/AboutPage.tsx
+msgid "CommaFeed version {version} ({revision})"
+msgstr "CommaFeed version {version} ({revision})"
+
#: src/components/header/Header.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
@@ -182,6 +205,10 @@ msgstr "Display"
msgid "Download"
msgstr "Download"
+#: src/pages/app/AboutPage.tsx
+msgid "Drag link to bookmark bar"
+msgstr "Drag link to bookmark bar"
+
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
@@ -204,6 +231,10 @@ msgstr "Edit user"
msgid "Enabled"
msgstr "Enabled"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Enter"
+msgstr "Enter"
+
#: src/components/settings/ProfileSettings.tsx
msgid "Enter your current password to change profile settings"
msgstr "Enter your current password to change profile settings"
@@ -252,6 +283,14 @@ msgstr "Generate new API key"
msgid "Generated feed url"
msgstr "Generated feed url"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Go to the All view"
+msgstr "Go to the All view"
+
+#: src/pages/app/AboutPage.tsx
+msgid "Goodies"
+msgstr "Goodies"
+
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr "Id"
@@ -260,6 +299,14 @@ msgstr "Id"
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
+#: src/pages/app/AboutPage.tsx
+msgid "If you encounter an issue, please report it on the issues page of the GitHub project."
+msgstr "If you encounter an issue, please report it on the issues page of the GitHub project."
+
+#: src/pages/app/AboutPage.tsx
+msgid "If you like this project, please consider a donation to support the developer and help cover the costs of keeping this website online."
+msgstr "If you like this project, please consider a donation to support the developer and help cover the costs of keeping this website online."
+
#: src/components/content/add/ImportOpml.tsx
msgid "Import"
msgstr "Import"
@@ -268,6 +315,11 @@ msgstr "Import"
msgid "Keep unread"
msgstr "Keep unread"
+#: src/components/content/FeedEntries.tsx
+#: src/pages/app/AboutPage.tsx
+msgid "Keyboard shortcuts"
+msgstr "Keyboard shortcuts"
+
#: src/components/settings/DisplaySettings.tsx
msgid "Language"
msgstr "Language"
@@ -289,6 +341,10 @@ msgstr "Last refresh message"
msgid "Link"
msgstr "Link"
+#: src/pages/app/AboutPage.tsx
+msgid "Link to the API documentation."
+msgstr "Link to the API documentation."
+
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
msgstr "Loading profile..."
@@ -320,6 +376,7 @@ msgid "Mark all as read"
msgstr "Mark all as read"
#: src/components/header/Header.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
msgid "Mark all entries as read"
msgstr "Mark all entries as read"
@@ -327,6 +384,14 @@ msgstr "Mark all entries as read"
msgid "Metrics"
msgstr "Metrics"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Move the page down"
+msgstr "Move the page down"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Move the page up"
+msgstr "Move the page up"
+
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
@@ -339,10 +404,18 @@ msgstr "N/A"
msgid "Name"
msgstr "Name"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Navigate to a subscription by entering its name"
+msgstr "Navigate to a subscription by entering its name"
+
#: src/components/settings/ProfileSettings.tsx
msgid "New password"
msgstr "New password"
+#: src/pages/app/AboutPage.tsx
+msgid "Newest first"
+msgstr "Newest first"
+
#: src/components/content/add/Subscribe.tsx
msgid "Next"
msgstr "Next"
@@ -351,6 +424,10 @@ msgstr "Next"
msgid "Next refresh"
msgstr "Next refresh"
+#: src/pages/app/AboutPage.tsx
+msgid "Next unread item bookmarklet"
+msgstr "Next unread item bookmarklet"
+
#: src/pages/app/FeedEntriesPage.tsx
msgid "No more entries"
msgstr "No more entries"
@@ -372,14 +449,42 @@ msgstr "OPML export"
msgid "OPML file"
msgstr "OPML file"
+#: src/pages/app/AboutPage.tsx
+msgid "Oldest first"
+msgstr "Oldest first"
+
#: src/pages/ErrorPage.tsx
msgid "Oops!"
msgstr "Oops!"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open current entry in a new tab"
+msgstr "Open current entry in a new tab"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open current entry in a new tab in the background"
+msgstr "Open current entry in a new tab in the background"
+
#: src/components/content/FeedEntryFooter.tsx
msgid "Open link"
msgstr "Open link"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open next entry"
+msgstr "Open next entry"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open previous entry"
+msgstr "Open previous entry"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open/close current entry"
+msgstr "Open/close current entry"
+
+#: src/pages/app/AboutPage.tsx
+msgid "Order"
+msgstr "Order"
+
#: src/components/content/add/AddCategory.tsx
msgid "Parent"
msgstr "Parent"
@@ -413,11 +518,16 @@ msgstr "Position"
msgid "Profile"
msgstr "Profile"
+#: src/pages/app/AboutPage.tsx
+msgid "REST API"
+msgstr "REST API"
+
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Recover password"
#: src/components/header/Header.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Refresh"
@@ -449,6 +559,15 @@ msgstr "Settings"
msgid "Settings saved."
msgstr "Settings saved."
+#: src/components/KeyboardShortcutsHelp.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Shift"
+msgstr "Shift"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Show keyboard shortcut help"
+msgstr "Show keyboard shortcut help"
+
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
@@ -458,12 +577,21 @@ msgstr "Sign up"
msgid "Something bad just happened..."
msgstr "Something bad just happened..."
+#: src/components/KeyboardShortcutsHelp.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Space"
+msgstr "Space"
+
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
msgid "Subscribe"
msgstr "Subscribe"
+#: src/pages/app/AboutPage.tsx
+msgid "Subscribe URL"
+msgstr "Subscribe URL"
+
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe to the feed"
msgstr "Subscribe to the feed"
@@ -480,6 +608,10 @@ msgstr "The URL for the feed you want to subscribe to. You can also use the webs
msgid "Theme"
msgstr "Theme"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Toggle read status of current entry"
+msgstr "Toggle read status of current entry"
+
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Try out CommaFeed with the demo account: demo/demo"
diff --git a/commafeed-client/src/locales/fr/messages.po b/commafeed-client/src/locales/fr/messages.po
index 5782deca..3c859243 100644
--- a/commafeed-client/src/locales/fr/messages.po
+++ b/commafeed-client/src/locales/fr/messages.po
@@ -29,6 +29,11 @@ msgstr "<0>Besoin d'un compte ?0><1>Enregistrez-vous !1>"
msgid "API key"
msgstr "Clé API"
+#: src/components/header/ProfileMenu.tsx
+#: src/pages/app/AboutPage.tsx
+msgid "About"
+msgstr "A propos"
+
#: src/pages/admin/AdminUsersPage.tsx
msgid "Actions"
msgstr "Actions"
@@ -51,6 +56,7 @@ msgstr "Ajouter un utilisateur"
msgid "Admin"
msgstr "Administrateur"
+#: src/components/content/add/CategorySelect.tsx
#: src/components/header/Header.tsx
#: src/components/sidebar/Tree.tsx
msgid "All"
@@ -104,6 +110,10 @@ msgstr "Retour"
msgid "Back to log in"
msgstr "Retour à la connexion"
+#: src/pages/app/AboutPage.tsx
+msgid "Browser extentions"
+msgstr "Extensions pour navigateurs"
+
#: src/components/admin/UserEdit.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/ImportOpml.tsx
@@ -121,6 +131,7 @@ msgstr "Annuler"
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/AddCategory.tsx
#: src/components/content/add/Subscribe.tsx
+#: src/pages/app/AboutPage.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "Category"
msgstr "Catégorie"
@@ -133,6 +144,18 @@ msgstr "Changer de mot de passe générera une nouvelle clé API"
msgid "Check that the feed is working"
msgstr "Vérifie que le flux fonctionne"
+#: src/pages/app/AboutPage.tsx
+msgid "CommaFeed is an open-source project. Sources are hosted on <0>GitHub0>."
+msgstr "CommaFeed est un projet open-source. Les sources sont hébergées sur <0>GitHub0>."
+
+#: src/pages/app/AboutPage.tsx
+msgid "CommaFeed next unread item"
+msgstr "CommaFeed prochain article non lu"
+
+#: src/pages/app/AboutPage.tsx
+msgid "CommaFeed version {version} ({revision})"
+msgstr "CommaFeed version {version} ({revision})"
+
#: src/components/header/Header.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
@@ -182,6 +205,10 @@ msgstr "Affichage"
msgid "Download"
msgstr "Télécharger"
+#: src/pages/app/AboutPage.tsx
+msgid "Drag link to bookmark bar"
+msgstr "Déplacez le lien vers la barre de favoris"
+
#: src/components/admin/UserEdit.tsx
#: src/components/settings/ProfileSettings.tsx
#: src/pages/admin/AdminUsersPage.tsx
@@ -204,6 +231,10 @@ msgstr "Modifier un utilisateur"
msgid "Enabled"
msgstr "Actif"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Enter"
+msgstr "Entrer"
+
#: src/components/settings/ProfileSettings.tsx
msgid "Enter your current password to change profile settings"
msgstr "Entrez votre mot de passe actuel pour changer les paramètres du profil"
@@ -252,6 +283,14 @@ msgstr "Générer une nouvelle clé API"
msgid "Generated feed url"
msgstr "URL du flux généré"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Go to the All view"
+msgstr "Aller à la catégorie Tout"
+
+#: src/pages/app/AboutPage.tsx
+msgid "Goodies"
+msgstr "Extensions"
+
#: src/pages/admin/AdminUsersPage.tsx
msgid "Id"
msgstr "Identifiant"
@@ -260,6 +299,14 @@ msgstr "Identifiant"
msgid "If not empty, an expression evaluating to 'true' or 'false'. If false, new entries for this feed will be marked as read automatically."
msgstr "Si non vide, une expression évaluant à 'vrai' ou 'faux'. Si faux, les nouvelles entrées de ce flux seront marquées comme lues automatiquement."
+#: src/pages/app/AboutPage.tsx
+msgid "If you encounter an issue, please report it on the issues page of the GitHub project."
+msgstr "Si vous rencontrez un problème, merci de le signaler sur la page du projet GitHub."
+
+#: src/pages/app/AboutPage.tsx
+msgid "If you like this project, please consider a donation to support the developer and help cover the costs of keeping this website online."
+msgstr "Si vous aimez ce projet, n'hésitez pas à faire un don pour encourager le développeur et aider à couvrir les coûts d'hébergement de la plate-forme."
+
#: src/components/content/add/ImportOpml.tsx
msgid "Import"
msgstr "Importer"
@@ -268,6 +315,11 @@ msgstr "Importer"
msgid "Keep unread"
msgstr "Garder non lu"
+#: src/components/content/FeedEntries.tsx
+#: src/pages/app/AboutPage.tsx
+msgid "Keyboard shortcuts"
+msgstr "Raccourcis clavier"
+
#: src/components/settings/DisplaySettings.tsx
msgid "Language"
msgstr "Langue"
@@ -289,6 +341,10 @@ msgstr "Dernier message de mise à jour"
msgid "Link"
msgstr "Lien"
+#: src/pages/app/AboutPage.tsx
+msgid "Link to the API documentation."
+msgstr "Lien vers la documentation de l'API."
+
#: src/hooks/useAppLoading.ts
msgid "Loading profile..."
msgstr "Chargement du profil ..."
@@ -320,6 +376,7 @@ msgid "Mark all as read"
msgstr "Tout marquer comme lu"
#: src/components/header/Header.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
msgid "Mark all entries as read"
msgstr "Marquer toutes les entrées comme lues"
@@ -327,6 +384,14 @@ msgstr "Marquer toutes les entrées comme lues"
msgid "Metrics"
msgstr "Métriques"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Move the page down"
+msgstr "Faites défiler la page vers le bas"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Move the page up"
+msgstr "Faites défiler la page vers le haut"
+
#: src/components/RelativeDate.tsx
#: src/pages/app/FeedDetailsPage.tsx
msgid "N/A"
@@ -339,10 +404,18 @@ msgstr "N/A"
msgid "Name"
msgstr "Nom"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Navigate to a subscription by entering its name"
+msgstr "Naviguer vers un abonnement en entrant son nom"
+
#: src/components/settings/ProfileSettings.tsx
msgid "New password"
msgstr "Nouveau mot de passe"
+#: src/pages/app/AboutPage.tsx
+msgid "Newest first"
+msgstr "Plus récent en premier"
+
#: src/components/content/add/Subscribe.tsx
msgid "Next"
msgstr "Suivant"
@@ -351,6 +424,10 @@ msgstr "Suivant"
msgid "Next refresh"
msgstr "Prochaine mise à jour"
+#: src/pages/app/AboutPage.tsx
+msgid "Next unread item bookmarklet"
+msgstr "Bookmarklet vers le prochain article non lu"
+
#: src/pages/app/FeedEntriesPage.tsx
msgid "No more entries"
msgstr "Plus d'entrées"
@@ -372,14 +449,42 @@ msgstr "Export du fichier OPML"
msgid "OPML file"
msgstr "Fichier OPML"
+#: src/pages/app/AboutPage.tsx
+msgid "Oldest first"
+msgstr "Du plus ancien au plus récent"
+
#: src/pages/ErrorPage.tsx
msgid "Oops!"
msgstr "Oups !"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open current entry in a new tab"
+msgstr "Ouvrir l'entrée actuelle dans un nouvel onglet"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open current entry in a new tab in the background"
+msgstr "Ouvrir l'entrée actuelle dans un nouvel onglet en arrière-plan"
+
#: src/components/content/FeedEntryFooter.tsx
msgid "Open link"
msgstr "Ouvrir le lien"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open next entry"
+msgstr "Ouvrir l'entrée suivante"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open previous entry"
+msgstr "Ouvrir l'entrée précédente"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Open/close current entry"
+msgstr "Ouvrir/fermer l'entrée actuelle"
+
+#: src/pages/app/AboutPage.tsx
+msgid "Order"
+msgstr "Ordre"
+
#: src/components/content/add/AddCategory.tsx
msgid "Parent"
msgstr "Parent"
@@ -413,11 +518,16 @@ msgstr "Position"
msgid "Profile"
msgstr "Profil"
+#: src/pages/app/AboutPage.tsx
+msgid "REST API"
+msgstr "API REST"
+
#: src/pages/auth/PasswordRecoveryPage.tsx
msgid "Recover password"
msgstr "Récupérer le mot de passe"
#: src/components/header/Header.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
msgid "Refresh"
msgstr "Rafraîchir"
@@ -449,6 +559,15 @@ msgstr "Réglages"
msgid "Settings saved."
msgstr "Réglages enregistrés."
+#: src/components/KeyboardShortcutsHelp.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Shift"
+msgstr "Maj"
+
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Show keyboard shortcut help"
+msgstr "Montrer les raccourcis clavier"
+
#: src/pages/auth/RegistrationPage.tsx
#: src/pages/auth/RegistrationPage.tsx
msgid "Sign up"
@@ -458,12 +577,21 @@ msgstr "Créer un compte"
msgid "Something bad just happened..."
msgstr "Quelque chose s'est mal passé..."
+#: src/components/KeyboardShortcutsHelp.tsx
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Space"
+msgstr "Espace"
+
#: src/components/content/add/Subscribe.tsx
#: src/components/content/add/Subscribe.tsx
#: src/pages/app/AddPage.tsx
msgid "Subscribe"
msgstr "S'abonner"
+#: src/pages/app/AboutPage.tsx
+msgid "Subscribe URL"
+msgstr "URL pour s'abonner"
+
#: src/components/content/add/Subscribe.tsx
msgid "Subscribe to the feed"
msgstr "S'abonner au flux"
@@ -480,6 +608,10 @@ msgstr "L'URL du flux auquel vous souhaitez vous abonner. Vous pouvez aussi util
msgid "Theme"
msgstr "Thème"
+#: src/components/KeyboardShortcutsHelp.tsx
+msgid "Toggle read status of current entry"
+msgstr "Marquer l'entrée actuelle comme lue/non lue"
+
#: src/pages/auth/LoginPage.tsx
msgid "Try out CommaFeed with the demo account: demo/demo"
msgstr "Essayez CommaFeed avec le compte de démonstration : demo/demo"
diff --git a/commafeed-client/src/pages/app/AboutPage.tsx b/commafeed-client/src/pages/app/AboutPage.tsx
new file mode 100644
index 00000000..e230ae45
--- /dev/null
+++ b/commafeed-client/src/pages/app/AboutPage.tsx
@@ -0,0 +1,159 @@
+import { t, Trans } from "@lingui/macro"
+import { Anchor, Box, Center, Container, Group, List, NativeSelect, SimpleGrid, Title } from "@mantine/core"
+import { Constants } from "app/constants"
+import { useAppSelector } from "app/store"
+import { CategorySelect } from "components/content/add/CategorySelect"
+import { KeyboardShortcutsHelp } from "components/KeyboardShortcutsHelp"
+import React, { useState } from "react"
+import { TbHelp, TbKeyboard, TbPuzzle, TbRocket } from "react-icons/tb"
+
+function Section(props: { title: string; icon: React.ReactNode; children: React.ReactNode }) {
+ return (
+
+
+ {props.icon}
+ {props.title}
+
+ {props.children}
+
+ )
+}
+
+function NextUnreadBookmarklet() {
+ const [categoryId, setCategoryId] = useState(Constants.categoryIds.all)
+ const [order, setOrder] = useState("desc")
+ const baseUrl = window.location.href.substring(0, window.location.href.lastIndexOf("#"))
+ const href = `javascript:window.location.href='${baseUrl}next?category=${categoryId}&order=${order}&t='+new Date().getTime();`
+
+ return (
+
+ c && setCategoryId(c)} withAll description={t`Category`} />
+ setOrder(e.target.value)}
+ description={t`Order`}
+ />
+ Drag link to bookmark bar
+
+
+ CommaFeed next unread item
+
+
+ )
+}
+
+export function AboutPage() {
+ const version = useAppSelector(state => state.server.serverInfos?.version)
+ const revision = useAppSelector(state => state.server.serverInfos?.gitCommit)
+ return (
+
+
+ }>
+
+
+ CommaFeed version {version} ({revision})
+
+
+
+
+ CommaFeed is an open-source project. Sources are hosted on
+
+ GitHub
+
+ .
+
+
+
+ If you encounter an issue, please report it on the issues page of the GitHub project.
+
+
+
+
+ If you like this project, please consider a donation to support the developer and help cover the costs of
+ keeping this website online.
+
+
+
+
+
+ }>
+
+
+ }>
+
+
+ Browser extentions
+
+
+
+ Firefox
+
+
+
+
+ Chrome
+
+
+
+
+ Opera
+
+
+
+
+
+ Subscribe URL
+
+
+ rest/feed/subscribe?url=FEED_URL_HERE
+
+
+
+ Next unread item bookmarklet
+
+
+
+
+
+
+
+ }>
+
+ Link to the API documentation.
+
+
+
+
+ )
+}