Browse Source

More WebSub doc (#5862)

* More WebSub doc

* UI for WebSub + more documentation
And spellcheck Frech

* Links to WebSub doc from readme

* Add link to WebSub doc in admin interface

* Fix checkbox

* Plural
Alexandre Alapetite 2 năm trước cách đây
mục cha
commit
618ce380e7

+ 2 - 2
README.fr.md

@@ -12,7 +12,7 @@ Il se veut léger et facile à prendre en main tout en étant un outil puissant
 Il permet de gérer plusieurs utilisateurs, dispose d’un mode de lecture anonyme, et supporte les étiquettes personnalisées.
 Il permet de gérer plusieurs utilisateurs, dispose d’un mode de lecture anonyme, et supporte les étiquettes personnalisées.
 Il y a une API pour les clients (mobiles), ainsi qu’une [interface en ligne de commande](cli/README.md).
 Il y a une API pour les clients (mobiles), ainsi qu’une [interface en ligne de commande](cli/README.md).
 
 
-Grâce au standard [WebSub](https://www.w3.org/TR/websub/) (anciennement [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)),
+Grâce au standard [WebSub](https://freshrss.github.io/FreshRSS/fr/users/08_PubSubHubbub.html),
 FreshRSS est capable de recevoir des notifications push instantanées depuis les sources compatibles, [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, Medium, etc.
 FreshRSS est capable de recevoir des notifications push instantanées depuis les sources compatibles, [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, Medium, etc.
 
 
 FreshRSS supporte nativement le moissonnage du Web (Web Scraping) basique, basé sur [XPath](https://www.w3.org/TR/xpath-10/), pour les sites Web sans flux RSS / Atom.
 FreshRSS supporte nativement le moissonnage du Web (Web Scraping) basique, basé sur [XPath](https://www.w3.org/TR/xpath-10/), pour les sites Web sans flux RSS / Atom.
@@ -22,7 +22,7 @@ Plusieurs [méthodes de connexion](https://freshrss.github.io/FreshRSS/en/admins
 Enfin, FreshRSS permet l’ajout d’[extensions](#extensions) pour encore plus de personnalisation.
 Enfin, FreshRSS permet l’ajout d’[extensions](#extensions) pour encore plus de personnalisation.
 
 
 * Site officiel : <https://freshrss.org>
 * Site officiel : <https://freshrss.org>
-* Démo : <http://demo.freshrss.org/>
+* Démo : <https://demo.freshrss.org>
 * Licence : [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.fr.html)
 * Licence : [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.fr.html)
 
 
 ![Logo de FreshRSS](docs/img/FreshRSS-logo.png)
 ![Logo de FreshRSS](docs/img/FreshRSS-logo.png)

+ 2 - 2
README.md

@@ -12,7 +12,7 @@ It is lightweight, easy to work with, powerful, and customizable.
 It is a multi-user application with an anonymous reading mode. It supports custom tags.
 It is a multi-user application with an anonymous reading mode. It supports custom tags.
 There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md).
 There is an API for (mobile) clients, and a [Command-Line Interface](cli/README.md).
 
 
-Thanks to the [WebSub](https://www.w3.org/TR/websub/) standard (formerly [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)),
+Thanks to the [WebSub](https://freshrss.github.io/FreshRSS/en/users/WebSub.html) standard,
 FreshRSS is able to receive instant push notifications from compatible sources, such as [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, Medium, etc.
 FreshRSS is able to receive instant push notifications from compatible sources, such as [Friendica](https://friendi.ca), [WordPress](https://wordpress.org/plugins/pubsubhubbub/), Blogger, Medium, etc.
 
 
 FreshRSS natively supports basic Web scraping, based on [XPath](https://www.w3.org/TR/xpath-10/), for Web sites not providing any RSS / Atom feed.
 FreshRSS natively supports basic Web scraping, based on [XPath](https://www.w3.org/TR/xpath-10/), for Web sites not providing any RSS / Atom feed.
@@ -22,7 +22,7 @@ Different [login methods](https://freshrss.github.io/FreshRSS/en/admins/09_Acces
 Finally, FreshRSS supports [extensions](#extensions) for further tuning.
 Finally, FreshRSS supports [extensions](#extensions) for further tuning.
 
 
 * Official website: <https://freshrss.org>
 * Official website: <https://freshrss.org>
-* Demo: <https://demo.freshrss.org/>
+* Demo: <https://demo.freshrss.org>
 * License: [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.html)
 * License: [GNU AGPL 3](https://www.gnu.org/licenses/agpl-3.0.html)
 
 
 ![FreshRSS logo](docs/img/FreshRSS-logo.png)
 ![FreshRSS logo](docs/img/FreshRSS-logo.png)

+ 3 - 0
app/i18n/cz/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Aktualizace systému',
 		'_' => 'Aktualizace systému',

+ 3 - 0
app/i18n/de/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">sind aktiv</a>',
 			'enabled' => '<a href="./?a=tos">sind aktiv</a>',
 			'help' => 'So werden die <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">Nutzungsbedingungen aktiviert</a>',
 			'help' => 'So werden die <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">Nutzungsbedingungen aktiviert</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'System aktualisieren',
 		'_' => 'System aktualisieren',

+ 3 - 0
app/i18n/el/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Ενημέρωση συστήματος',
 		'_' => 'Ενημέρωση συστήματος',

+ 1 - 1
app/i18n/el/sub.php

@@ -169,7 +169,7 @@ return array(
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// TODO
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// TODO
 		'validator' => 'Check the validity of the feed',	// TODO
 		'validator' => 'Check the validity of the feed',	// TODO
 		'website' => 'Website URL',	// TODO
 		'website' => 'Website URL',	// TODO
-		'websub' => 'Instant notification with WebSub',	// TODO
+		'websub' => 'Instant notifications with WebSub',	// TODO
 	),
 	),
 	'import_export' => array(
 	'import_export' => array(
 		'export' => 'Export',	// TODO
 		'export' => 'Export',	// TODO

+ 3 - 0
app/i18n/en-us/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// IGNORE
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// IGNORE
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// IGNORE
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// IGNORE
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// IGNORE
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Update system',	// IGNORE
 		'_' => 'Update system',	// IGNORE

+ 1 - 1
app/i18n/en-us/sub.php

@@ -169,7 +169,7 @@ return array(
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// IGNORE
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// IGNORE
 		'validator' => 'Check the validity of the feed',	// IGNORE
 		'validator' => 'Check the validity of the feed',	// IGNORE
 		'website' => 'Website URL',	// IGNORE
 		'website' => 'Website URL',	// IGNORE
-		'websub' => 'Instant notification with WebSub',	// IGNORE
+		'websub' => 'Instant notifications with WebSub',	// IGNORE
 	),
 	),
 	'import_export' => array(
 	'import_export' => array(
 		'export' => 'Export',	// IGNORE
 		'export' => 'Export',	// IGNORE

+ 3 - 0
app/i18n/en/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',
 			'enabled' => '<a href="./?a=tos">is enabled</a>',
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Update FreshRSS',
 		'_' => 'Update FreshRSS',

+ 1 - 1
app/i18n/en/sub.php

@@ -169,7 +169,7 @@ return array(
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
 		'validator' => 'Check the validity of the feed',
 		'validator' => 'Check the validity of the feed',
 		'website' => 'Website URL',
 		'website' => 'Website URL',
-		'websub' => 'Instant notification with WebSub',
+		'websub' => 'Instant notifications with WebSub',
 	),
 	),
 	'import_export' => array(
 	'import_export' => array(
 		'export' => 'Export',
 		'export' => 'Export',

+ 3 - 0
app/i18n/es/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">está activado</a>',
 			'enabled' => '<a href="./?a=tos">está activado</a>',
 			'help' => 'Cómo <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">activar las Condiciones de servicio</a>',
 			'help' => 'Cómo <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">activar las Condiciones de servicio</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Actualizar sistema',
 		'_' => 'Actualizar sistema',

+ 3 - 0
app/i18n/fa/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => ' <a href="./?a=tos">فعال است</a>',
 			'enabled' => ' <a href="./?a=tos">فعال است</a>',
 			'help' => ' نحوه <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">فعال کردن شرایط خدمات </a>',
 			'help' => ' نحوه <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">فعال کردن شرایط خدمات </a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => ' FreshRSS را به روز کنید',
 		'_' => ' FreshRSS را به روز کنید',

+ 5 - 2
app/i18n/fr/admin.php

@@ -161,7 +161,7 @@ return array(
 		'auto-update-url' => 'URL du service de mise à jour',
 		'auto-update-url' => 'URL du service de mise à jour',
 		'base-url' => array(
 		'base-url' => array(
 			'_' => 'URL de la racine',
 			'_' => 'URL de la racine',
-			'recommendation' => 'Recommandation automatique: <kbd>%s</kbd>',
+			'recommendation' => 'Recommandation automatique : <kbd>%s</kbd>',
 		),
 		),
 		'cookie-duration' => array(
 		'cookie-duration' => array(
 			'help' => 'en secondes',
 			'help' => 'en secondes',
@@ -187,12 +187,15 @@ return array(
 			),
 			),
 			'title' => 'Formulaire d’inscription utilisateur',
 			'title' => 'Formulaire d’inscription utilisateur',
 		),
 		),
-		'sensitive-parameter' => 'Paramètre sensible. Éditez manuallement <kbd>./data/config.php</kbd>',
+		'sensitive-parameter' => 'Paramètre sensible. Éditez manuellement <kbd>./data/config.php</kbd>',
 		'tos' => array(
 		'tos' => array(
 			'disabled' => 'non renseigné',
 			'disabled' => 'non renseigné',
 			'enabled' => '<a href="./?a=tos">activées</a>',
 			'enabled' => '<a href="./?a=tos">activées</a>',
 			'help' => 'Comment <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">activer les conditions d’utilisation</a>',
 			'help' => 'Comment <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">activer les conditions d’utilisation</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'À propos de <a href="https://freshrss.github.io/FreshRSS/fr/users/08_PubSubHubbub.html" target="_blank">WebSub</a>',
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Système de mise à jour',
 		'_' => 'Système de mise à jour',

+ 1 - 1
app/i18n/fr/conf.php

@@ -204,7 +204,7 @@ return array(
 		'read' => array(
 		'read' => array(
 			'article_open_on_website' => 'lorsque l’article est ouvert sur le site d’origine',
 			'article_open_on_website' => 'lorsque l’article est ouvert sur le site d’origine',
 			'article_viewed' => 'lorsque l’article est affiché',
 			'article_viewed' => 'lorsque l’article est affiché',
-			'focus' => 'lorsque l’article est selectionné (sauf pour les flux importants)',
+			'focus' => 'lorsque l’article est sélectionné (sauf pour les flux importants)',
 			'keep_max_n_unread' => 'Nombre maximum d’articles conservés non lus',
 			'keep_max_n_unread' => 'Nombre maximum d’articles conservés non lus',
 			'scroll' => 'au défilement de la page (sauf pour les flux importants)',
 			'scroll' => 'au défilement de la page (sauf pour les flux importants)',
 			'upon_gone' => 'lorsqu’il n’est plus dans le flux d’actualités en amont',
 			'upon_gone' => 'lorsqu’il n’est plus dans le flux d’actualités en amont',

+ 1 - 1
app/i18n/fr/feedback.php

@@ -61,7 +61,7 @@ return array(
 		'feeds_imported_with_errors' => 'Vos flux ont été importés mais des erreurs sont survenues.	Si vous avez fini vos importations, vous pouvez cliquer le bouton <i>Actualiser flux</i>.',
 		'feeds_imported_with_errors' => 'Vos flux ont été importés mais des erreurs sont survenues.	Si vous avez fini vos importations, vous pouvez cliquer le bouton <i>Actualiser flux</i>.',
 		'file_cannot_be_uploaded' => 'Le fichier ne peut pas être téléchargé !',
 		'file_cannot_be_uploaded' => 'Le fichier ne peut pas être téléchargé !',
 		'no_zip_extension' => 'L’extension ZIP n’est pas présente sur votre serveur.',
 		'no_zip_extension' => 'L’extension ZIP n’est pas présente sur votre serveur.',
-		'zip_error' => 'Une erreur est survenue durant le traintement du fichier ZIP.',
+		'zip_error' => 'Une erreur est survenue durant le traitement du fichier ZIP.',
 	),
 	),
 	'profile' => array(
 	'profile' => array(
 		'error' => 'Votre profil n’a pas pu être mis à jour',
 		'error' => 'Votre profil n’a pas pu être mis à jour',

+ 2 - 2
app/i18n/fr/sub.php

@@ -78,7 +78,7 @@ return array(
 				'_' => 'HTML + XPath (Moissonnage du Web)',
 				'_' => 'HTML + XPath (Moissonnage du Web)',
 				'feed_title' => array(
 				'feed_title' => array(
 					'_' => 'titre de flux',
 					'_' => 'titre de flux',
-					'help' => 'Exemple : <code>//title</code> ou un text statique : <code>"Mon flux personnalisé"</code>',
+					'help' => 'Exemple : <code>//title</code> ou un texte statique : <code>"Mon flux personnalisé"</code>',
 				),
 				),
 				'help' => '<dfn><a href="https://www.w3.org/TR/xpath-10/" target="_blank">XPath 1.0</a></dfn> est un langage de requête pour les utilisateurs avancés, supporté par FreshRSS pour le moissonnage du Web (Web scraping).',
 				'help' => '<dfn><a href="https://www.w3.org/TR/xpath-10/" target="_blank">XPath 1.0</a></dfn> est un langage de requête pour les utilisateurs avancés, supporté par FreshRSS pour le moissonnage du Web (Web scraping).',
 				'item' => array(
 				'item' => array(
@@ -169,7 +169,7 @@ return array(
 		'useragent_help' => 'Exemple : <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
 		'useragent_help' => 'Exemple : <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',
 		'validator' => 'Vérifier la validité du flux',
 		'validator' => 'Vérifier la validité du flux',
 		'website' => 'URL du site',
 		'website' => 'URL du site',
-		'websub' => 'Notification instantanée par WebSub',
+		'websub' => 'Notifications instantanée par WebSub',
 	),
 	),
 	'import_export' => array(
 	'import_export' => array(
 		'export' => 'Exporter',
 		'export' => 'Exporter',

+ 3 - 0
app/i18n/he/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'מערכת העדכון',
 		'_' => 'מערכת העדכון',

+ 1 - 1
app/i18n/he/sub.php

@@ -169,7 +169,7 @@ return array(
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// TODO
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// TODO
 		'validator' => 'בדיקות תקינות ההזנה',
 		'validator' => 'בדיקות תקינות ההזנה',
 		'website' => 'אתר URL',
 		'website' => 'אתר URL',
-		'websub' => 'Instant notification with WebSub',	// TODO
+		'websub' => 'Instant notifications with WebSub',	// TODO
 	),
 	),
 	'import_export' => array(
 	'import_export' => array(
 		'export' => 'ייצוא',
 		'export' => 'ייצוא',

+ 3 - 0
app/i18n/hu/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">engedélyezve</a>',
 			'enabled' => '<a href="./?a=tos">engedélyezve</a>',
 			'help' => 'Hogyan kapcsoljuk be a <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">Szolgáltatási feltételeket</a>',
 			'help' => 'Hogyan kapcsoljuk be a <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">Szolgáltatási feltételeket</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'FreshRSS Frissítése',
 		'_' => 'FreshRSS Frissítése',

+ 3 - 0
app/i18n/id/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Update system',	// DIRTY
 		'_' => 'Update system',	// DIRTY

+ 1 - 1
app/i18n/id/sub.php

@@ -169,7 +169,7 @@ return array(
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// TODO
 		'useragent_help' => 'Example: <kbd>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0)</kbd>',	// TODO
 		'validator' => 'Check the validity of the feed',	// TODO
 		'validator' => 'Check the validity of the feed',	// TODO
 		'website' => 'Website URL',	// TODO
 		'website' => 'Website URL',	// TODO
-		'websub' => 'Instant notification with WebSub',	// TODO
+		'websub' => 'Instant notifications with WebSub',	// TODO
 	),
 	),
 	'import_export' => array(
 	'import_export' => array(
 		'export' => 'Export',	// TODO
 		'export' => 'Export',	// TODO

+ 3 - 0
app/i18n/it/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Aggiornamento sistema',
 		'_' => 'Aggiornamento sistema',

+ 3 - 0
app/i18n/ja/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'システムアップデート',
 		'_' => 'システムアップデート',

+ 3 - 0
app/i18n/ko/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => '업데이트',
 		'_' => '업데이트',

+ 3 - 0
app/i18n/lv/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">ir ieslēgts</a>',
 			'enabled' => '<a href="./?a=tos">ir ieslēgts</a>',
 			'help' => 'Kā iespējot <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">pakalpojumu sniegšanas noteikumus</a>',
 			'help' => 'Kā iespējot <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">pakalpojumu sniegšanas noteikumus</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Atjaunināt sistēmu',
 		'_' => 'Atjaunināt sistēmu',

+ 3 - 0
app/i18n/nl/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is ingeschakeld</a>',
 			'enabled' => '<a href="./?a=tos">is ingeschakeld</a>',
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">algemene voorwaarden inschakelen</a>',
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">algemene voorwaarden inschakelen</a>',
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Versie controle',
 		'_' => 'Versie controle',

+ 3 - 0
app/i18n/oc/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Sistèma de mesa a jorn',
 		'_' => 'Sistèma de mesa a jorn',

+ 3 - 0
app/i18n/pl/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Aktualizacja',
 		'_' => 'Aktualizacja',

+ 3 - 0
app/i18n/pt-br/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Atualização do sistema',
 		'_' => 'Atualização do sistema',

+ 3 - 0
app/i18n/ru/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Обновление системы',
 		'_' => 'Обновление системы',

+ 3 - 0
app/i18n/sk/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Aktualizácia systému',
 		'_' => 'Aktualizácia systému',

+ 3 - 0
app/i18n/tr/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => 'Sistem güncelleme',
 		'_' => 'Sistem güncelleme',

+ 3 - 0
app/i18n/zh-cn/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => '更新系统',
 		'_' => '更新系统',

+ 3 - 0
app/i18n/zh-tw/admin.php

@@ -193,6 +193,9 @@ return array(
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'enabled' => '<a href="./?a=tos">is enabled</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 			'help' => 'How to <a href="https://freshrss.github.io/FreshRSS/en/admins/12_User_management.html#enable-terms-of-service-tos" target="_blank">enable the Terms of Service</a>',	// TODO
 		),
 		),
+		'websub' => array(
+			'help' => 'About <a href="https://freshrss.github.io/FreshRSS/en/users/WebSub.html" target="_blank">WebSub</a>',	// TODO
+		),
 	),
 	),
 	'update' => array(
 	'update' => array(
 		'_' => '更新系統',
 		'_' => '更新系統',

+ 10 - 0
app/views/configure/system.phtml

@@ -31,6 +31,16 @@
 			</div>
 			</div>
 		</div>
 		</div>
 
 
+		<div class="form-group">
+			<label class="group-name" for="websub"><?= _t('sub.feed.websub') ?></label>
+			<div class="group-controls">
+				<input type="checkbox" id="websub" name="websub" disabled="disabled" <?=
+					FreshRSS_Context::$system_conf->pubsubhubbub_enabled && Minz_Request::serverIsPublic(FreshRSS_Context::$system_conf->base_url) ? 'checked="checked"' : '' ?> />
+					<p class="help"><?= _i('help') ?> <?= _t('admin.system.websub.help') ?></p>
+					<p class="help"><?= _i('help') ?> <?= _t('admin.system.sensitive-parameter') ?></p>
+			</div>
+		</div>
+
 		<div class="form-group">
 		<div class="form-group">
 			<label class="group-name" for="auto-update-url"><?= _t('admin.system.auto-update-url') ?></label>
 			<label class="group-name" for="auto-update-url"><?= _t('admin.system.auto-update-url') ?></label>
 			<div class="group-controls">
 			<div class="group-controls">

+ 49 - 5
docs/en/users/WebSub.md

@@ -7,20 +7,64 @@ for instance when a new article is available via RSS / ATOM.
 FreshRSS supports WebSub natively.
 FreshRSS supports WebSub natively.
 Just like for the FreshRSS API to work from a mobile phone, supporting WebSub requires that your FreshRSS instance is routable (that is to say, with a public IP, that can be accessed from third-party servers).
 Just like for the FreshRSS API to work from a mobile phone, supporting WebSub requires that your FreshRSS instance is routable (that is to say, with a public IP, that can be accessed from third-party servers).
 
 
-## Examples of feeds
+## WebSub terminology
 
 
-Many individual feeds and platforms already offer instant notifications through WebSub, such as:
-[Friendica instances](https://friendi.ca), WordPress (from WordPress.com or with [an extension](https://wordpress.org/plugins/pubsubhubbub/)), Blogger sites, Medium sites, etc.
+There are tree main concepts:
+
+* **publisher**: Web site publishing content such as RSS / ATOM feeds;
+* **subscriber**: Feed aggregator such as FreshRSS;
+* **hub**: Intermediate technical component in charge of notifying all subscribers instantly when a publisher has some new content.
+The same hub can serve several publishers and their subscribers.
+Some publishers have a built-in hub.
+
+## Enabling WebSub in FreshRSS
+
+FreshRSS supports WebSub natively, but requires a public address (read from the `base_url` configuration),
+and requires the `./FreshRSS/p/api/` folder to be publicly accessible (just like for other FreshRSS APIs).
+
+During the initial Web-based setup, support for WebSub is enabled if the server hosting FreshRSS appears to have a public address.
+In any case, check your `./data/config.php` for:
 
 
-## Test WebSub
+```php
+'base_url' => 'https://freshrss.example.net/',
+'pubsubhubbub_enabled' => true,
+```
+
+Additional logs about WebSub are available in `./FreshRSS/data/users/_/log_pshb.txt`
+
+## Test WebSub compatibility of your FreshRSS instance
 
 
 You can test that WebSub works properly in your FreshRSS instance with a service such as:
 You can test that WebSub works properly in your FreshRSS instance with a service such as:
 
 
 * <http://push-tester.cweiske.de>
 * <http://push-tester.cweiske.de>
 
 
+When you create a new article, it should instantly be available in your FreshRSS instance.
+
+## Examples of feeds using WebSub
+
+Many individual feeds and platforms already offer instant notifications through WebSub, such as:
+[Friendica instances](https://friendi.ca), WordPress (from WordPress.com or with [an extension](https://wordpress.org/plugins/pubsubhubbub/)), Blogger sites, Medium sites, etc.
+
+## Test WebSub compatibility of an RSS / ATOM feed
+
+* <https://test.livewire.io> (for any feed)
+* <https://websub.rocks/publisher> (for feeds you control)
+
 ## Add WebSub to your RSS / ATOM feeds
 ## Add WebSub to your RSS / ATOM feeds
 
 
-Your CMS (e.g. WordPress) might already offer WebSub as an option. Otherwise, you can make a solution that notifies a hub such as:
+Your CMS (e.g. WordPress) might already offer WebSub as an option, such as:
+
+* <https://wordpress.org/plugins/pushpress/>
+
+Otherwise, you can make a solution that notifies a hub, such as:
 
 
 * <https://websubhub.com>
 * <https://websubhub.com>
 * <https://pubsubhubbub.appspot.com>
 * <https://pubsubhubbub.appspot.com>
+
+Or even deploy your own hub, such as:
+
+* <https://github.com/flusio/Webubbub>
+
+## Test WebSub compatibility of a hub
+
+* <https://websub.rocks/hub/100>

+ 45 - 12
docs/fr/users/08_PubSubHubbub.md

@@ -1,13 +1,13 @@
-# Qu’est-ce que [WebSub](https://www.w3.org/TR/websub/) ?
+# Qu’est-ce que WebSub ?
 
 
-Derrière ce nom (anciennement [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)) se cache un protocole qui vient compléter Atom et RSS.
+Derrière le nom de [WebSub](https://www.w3.org/TR/websub/) (anciennement [PubSubHubbub](https://github.com/pubsubhubbub/PubSubHubbub)) se cache un protocole qui vient compléter Atom et RSS.
 En effet, le fonctionnement de base de ces deux derniers implique de vérifier à intervalles réguliers s’il existe de nouveaux articles sur les sites suivis.
 En effet, le fonctionnement de base de ces deux derniers implique de vérifier à intervalles réguliers s’il existe de nouveaux articles sur les sites suivis.
 Cela même si le site concerné n’a rien publié depuis la dernière synchronisation.
 Cela même si le site concerné n’a rien publié depuis la dernière synchronisation.
 Le [protocole WebSub](https://www.w3.org/TR/websub/) permet d’éviter des synchronisations inutiles en notifiant en temps réel l’agrégateur de la présence de nouveaux articles.
 Le [protocole WebSub](https://www.w3.org/TR/websub/) permet d’éviter des synchronisations inutiles en notifiant en temps réel l’agrégateur de la présence de nouveaux articles.
 
 
 ## Fonctionnement de WebSub
 ## Fonctionnement de WebSub
 
 
-On va retrouver trois notions dans WebSub : les éditeurs (les sites qui publient du contenu), les abonnés (les agrégateurs de flux RSS) et les hubs.
+On va retrouver trois notions dans WebSub : **les éditeurs** (les sites qui publient du contenu comme des flux ATOM / RSS), **les abonnés** (les agrégateurs de flux RSS comme FreshRSS), et **les hubs**.
 
 
 Lorsqu’un agrégateur s’abonne à un site et récupère son flux RSS, il peut y trouver l’adresse d’un hub.
 Lorsqu’un agrégateur s’abonne à un site et récupère son flux RSS, il peut y trouver l’adresse d’un hub.
 Si c’est le cas — car un site peut ne pas en préciser —, l’agrégateur va s’abonner au hub et non pas à l’éditeur directement.
 Si c’est le cas — car un site peut ne pas en préciser —, l’agrégateur va s’abonner au hub et non pas à l’éditeur directement.
@@ -15,21 +15,54 @@ Ainsi, lorsqu’un éditeur va publier du contenu, il va notifier le hub qui va
 
 
 Pour pouvoir être notifié, les abonnés doivent fournir une adresse accessible publiquement sur Internet.
 Pour pouvoir être notifié, les abonnés doivent fournir une adresse accessible publiquement sur Internet.
 
 
-## WebSub et FreshRSS
+## Activer WebSub dans FreshRSS
 
 
-Depuis la version 1.1.2-beta, FreshRSS supporte officiellement WebSub.
-Vous pouvez donc recevoir en temps réel les articles des sites qui affichent dans leur flux RSS un « hub »,
-tels [Friendica](https://friendi.ca), WordPress (WordPress.com ou avec [une extension](https://wordpress.org/plugins/pubsubhubbub/)), Blogger, Medium, etc.
+FreshRSS supporte nativement WebSub, mais requiert une addresse publique (lu depuis la configuration `base_url`),
+et requiert aussi aussi que le répertoire `./FreshRSS/p/api/` soit accessible publiquement (comme pour les autres APIs de FreshRSS).
+
+Durant l’installation Web initiale, le support de WebSub est activé si le serveur semble avoir une adresse publique.
+Dans tous les cas, vérifiez votre `./data/config.php` pour :
+
+```php
+'base_url' => 'https://freshrss.example.net/',
+'pubsubhubbub_enabled' => true,
+```
+
+Des logs supplémentaires relatifs à WebSub sont consultables dans `./FreshRSS/data/users/_/log_pshb.txt`
+
+## Tester la compatibilité WebSub de votre instance FreshRSS
+
+Vous pouvez tester que le support WebSub de votre instance FreshRSS est correct avec un service comme :
+
+* <http://push-tester.cweiske.de>
+
+Quand vous y créez un nouvel article, celui-ci devrait être immédiatement disponible dans votre FreshRSS.
 
 
-## Tester WebSub
+## Tester la compatibilité WebSub d’un flux RSS / ATOM
 
 
-Vous pouver tester que le support WebSub de votre instance FreshRSS est correct avec un service comme :
+* <https://test.livewire.io> (pour n’importe quel flux)
+* <https://websub.rocks/publisher> (pour les flux que vous contrôlez)
 
 
-* <http://push-tester.cweiske.de/>
+## Exemples de flux utilisant WebSub
+
+Vous pouvez recevoir en temps réel les articles des sites qui affichent dans leur flux RSS un « hub »,
+tels [Friendica](https://friendi.ca), WordPress (WordPress.com ou avec [une extension](https://wordpress.org/plugins/pubsubhubbub/)), Blogger, Medium, etc.
 
 
 ## Ajouter WebSub à votre flux RSS / ATOM
 ## Ajouter WebSub à votre flux RSS / ATOM
 
 
-Votre CMS (par exemple WordPress) supporte peut-être déjà WebSub en option. Sinon, vous pouvez faire une solution qui notifie un hub tel :
+Votre CMS (par exemple WordPress) supporte peut-être déjà WebSub en option, comme :
+
+* <https://wordpress.org/plugins/pushpress/>
+
+Sinon, vous pouvez faire une solution qui notifie un hub, comme :
 
 
-* <https://websubhub.com/>
+* <https://websubhub.com>
 * <https://pubsubhubbub.appspot.com>
 * <https://pubsubhubbub.appspot.com>
+
+Ou encore déployer votre propre hub, comme :
+
+* <https://github.com/flusio/Webubbub>
+
+## Tester la compatibilité WebSub d’un hub
+
+* <https://websub.rocks/hub/100>