Notify me when users follow me
. لا ينطبق تغيير هذا الإعداد إلا على المستخدمين الذين لم يغيِّروا أبدًا تفضيلات الإشعارات الخاصة بالمكوِّن الإضافي للمتابعة'
19 | default_notify_followed_user_when_followed: 'القيمة الافتراضية لتفضيل المستخدم Notify me when users follow me
. لا ينطبق تغيير هذا الإعداد إلا على المستخدمين الذين لم يغيِّروا أبدًا تفضيلات الإشعارات الخاصة بالمكوِّن الإضافي للمتابعة'
20 | default_notify_me_when_followed_replies: 'القيمة الافتراضية لتفضيل المستخدم Notify me when someone I follow replies
. لا ينطبق تغيير هذا الإعداد إلا على المستخدمين الذين لم يغيِّروا أبدًا تفضيلات الإشعارات الخاصة بالمكوِّن الإضافي للمتابعة'
21 | default_notify_me_when_followed_creates_topic: 'القيمة الافتراضية لتفضيل المستخدم Notify me when someone I follow creates a topic
. لا ينطبق تغيير هذا الإعداد إلا على المستخدمين الذين لم يغيِّروا أبدًا تفضيلات الإشعارات الخاصة بالمكوِّن الإضافي للمتابعة'
22 | default_allow_people_to_follow_me: 'القيمة الافتراضية لتفضيل المستخدم Allow people to follow me
. لا ينطبق تغيير هذا الإعداد إلا على المستخدمين الذين لم يغيِّروا أبدًا تفضيلات الإشعارات الخاصة بالمكوِّن الإضافي للمتابعة'
23 | follow:
24 | user_not_found: "تعذَّر العثور على مستخدم باسم المستخدم %{username}"
25 | user_cannot_follow_themself: "غير مسموح للمستخدم بمتابعة نفسه"
26 | invalid_notification_level: "مستوى الإشعار %{level} غير صالح"
27 | cannot_follow_bot: "لا يمكن متابعة مستخدم من برامج الروبوت"
28 | cannot_follow_suspended: "لا يمكن متابعة مستخدم تم تعليقه"
29 | cannot_follow_staged: "لا يمكن متابعة مستخدم مؤقت"
30 | invalid_created_before_date: "تم تلقي تاريخ غير صالح للمعلمة `created_before`: %{value}"
31 | user_does_not_allow_follow: "لا يسمح %{username} للأشخاص بمتابعته."
32 |
--------------------------------------------------------------------------------
/config/locales/server.be.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | be:
8 |
--------------------------------------------------------------------------------
/config/locales/server.bg.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | bg:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} публикува в "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.bs_BA.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | bs_BA:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} je objavio/la "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.ca.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ca:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} ha creat "%{topic}" - %{site_title}'
11 | following_replied: '%{username} ha publicat en "%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Activar el plugin de follow."
14 | follow_show_statistics_on_profile: "Mostrar les estadístiques de seguiment en els perfils dels usuaris."
15 | follow_notifications_enabled: "Activar totes les notificacions de seguiment."
16 | follow_followers_visible: "Visibilitat de seguidors."
17 | follow_following_visible: "Visibilitat de següents."
18 | default_notify_me_when_followed: 'Valor predeterminat per al Notifica''m quan els usuaris em segueixen
preferència d''usuari. Canviar aquest ajustament només s''aplica als usuaris que mai han canviat les seves preferències de notificacions del plugin de seguiment'
19 | default_notify_followed_user_when_followed: 'Valor predeterminat per al Notificar als usuaris quan els segueixo
preferència d''usuari. Canviar aquest ajustament només s''aplica als usuaris que mai han canviat les seves preferències de notificacions del plugin de seguiment'
20 | default_notify_me_when_followed_replies: 'Valor predeterminat per al Notifica''m quan algú que segueixo respon a un tema
preferència d''usuari. Canviar aquest ajustament només s''aplica als usuaris que mai han canviat les seves preferències de notificacions del plugin de seguiment'
21 | default_notify_me_when_followed_creates_topic: 'Valor predeterminat per al Notifica''m quan algú que segueixo crea un tema
preferència d''usuari. Canviar aquest ajustament només s''aplica als usuaris que mai han canviat les seves preferències de notificacions del plugin de seguiment'
22 | default_allow_people_to_follow_me: 'Valor predeterminat per al Permetre que la gent em segueixi
preferència d''usuari. Canviar aquest ajustament només s''aplica als usuaris que mai han canviat les seves preferències de notificacions del plugin de seguiment'
23 | follow:
24 | user_not_found: "No s'ha pogut trobar l'usuari amb el nom d'usuari %{username}"
25 | user_cannot_follow_themself: "L'usuari no està permès seguir a si mateix"
26 | invalid_notification_level: "Nivell de notificació no vàlid %{level}"
27 | cannot_follow_bot: "No es pot seguir a un usuari bot"
28 | cannot_follow_suspended: "No es pot seguir un usuari suspès"
29 | cannot_follow_staged: "No es pot seguir un usuari provisional"
30 | invalid_created_before_date: "S'ha rebut una data no vàlida per al paràmetre `created_before`: %{value}"
31 | user_does_not_allow_follow: "%{username} no permet que la gent els segueixi."
32 |
--------------------------------------------------------------------------------
/config/locales/server.cs.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | cs:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} přispěl do "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.da.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | da:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} skrev i "%{topic}" - %{site_title}'
11 | site_settings:
12 | discourse_follow_enabled: "Aktiver følg plugin."
13 |
--------------------------------------------------------------------------------
/config/locales/server.de.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | de:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} hat „%{topic}“ erstellt – %{site_title}'
11 | following_replied: '%{username} hat geschrieben in „%{topic}“ – %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Follow-Plug-in aktivieren."
14 | follow_show_statistics_on_profile: "Follow-Statistiken auf Benutzerprofilen anzeigen."
15 | follow_notifications_enabled: "Alle Follow-Benachrichtigungen aktivieren."
16 | follow_followers_visible: "Sichtbarkeit der Follower."
17 | follow_following_visible: "Sichtbarkeit von „Folge ich“."
18 | default_notify_me_when_followed: 'Standardwert für die Benutzereinstellung Mich benachrichtigen, wenn mir Benutzer folgen
. Das Ändern dieser Einstellung betrifft nur Benutzer, die ihre Benachrichtigungseinstellungen des Follow-Plug-ins noch nie geändert haben'
19 | default_notify_followed_user_when_followed: 'Standardwert für die Benutzereinstellung Benutzer benachrichtigen, wenn ich ihnen folge
. Das Ändern dieser Einstellung betrifft nur Benutzer, die ihre Benachrichtigungseinstellungen des Follow-Plug-ins noch nie geändert haben'
20 | default_notify_me_when_followed_replies: 'Standardwert für die Benutzereinstellung Mich benachrichtigen, wenn jemand, dem ich folge, antwortet
. Das Ändern dieser Einstellung betrifft nur Benutzer, die ihre Benachrichtigungseinstellungen des Follow-Plug-ins noch nie geändert haben'
21 | default_notify_me_when_followed_creates_topic: 'Standardwert für die Benutzereinstellung Mich benachrichtigen, wenn jemand, dem ich folge, ein Thema erstellt
. Das Ändern dieser Einstellung betrifft nur Benutzer, die ihre Benachrichtigungseinstellungen des Follow-Plug-ins noch nie geändert haben'
22 | default_allow_people_to_follow_me: 'Standardwert für die Benutzereinstellung Erlaube anderen, mir zu folgen
. Das Ändern dieser Einstellung betrifft nur Benutzer, die ihre Benachrichtigungseinstellungen des Follow-Plug-ins noch nie geändert haben'
23 | follow:
24 | user_not_found: "Benutzer mit Benutzername %{username} konnte nicht gefunden werden"
25 | user_cannot_follow_themself: "Benutzer darf sich nicht selbst folgen"
26 | invalid_notification_level: "Ungültige Benachrichtigungsstufe %{level}"
27 | cannot_follow_bot: "Kann einem Bot-Benutzer nicht folgen"
28 | cannot_follow_suspended: "Kann einem gesperrten Benutzer nicht folgen"
29 | cannot_follow_staged: "Kann einem vorbereiteten Benutzer nicht folgen"
30 | invalid_created_before_date: "Ungültiges Datum für Parameter „created_before“ erhalten: %{value}"
31 | user_does_not_allow_follow: "%{username} erlaubt es anderen nicht, ihm/ihr zu folgen."
32 |
--------------------------------------------------------------------------------
/config/locales/server.el.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | el:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} ανάρτησε στο "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.en.yml:
--------------------------------------------------------------------------------
1 | en:
2 | discourse_push_notifications:
3 | popup:
4 | following_created_topic: '%{username} created "%{topic}" - %{site_title}'
5 | following_replied: '%{username} posted in "%{topic}" - %{site_title}'
6 | site_settings:
7 | discourse_follow_enabled: "Enable follow plugin."
8 | follow_show_statistics_on_profile: "Show follow statistics on user profiles."
9 | follow_notifications_enabled: "Enable all follow notifications."
10 | follow_followers_visible: "Followers visibility."
11 | follow_following_visible: "Following visibility."
12 | default_notify_me_when_followed: 'Default value for the Notify me when users follow me
user preference. Changing this setting only applies to users who have never changed their notification preferences of the follow plugin'
13 | default_notify_followed_user_when_followed: 'Default value for the Notify users when I follow them
user preference. Changing this setting only applies to users who have never changed their notification preferences of the follow plugin'
14 | default_notify_me_when_followed_replies: 'Default value for the Notify me when someone I follow replies
user preference. Changing this setting only applies to users who have never changed their notification preferences of the follow plugin'
15 | default_notify_me_when_followed_creates_topic: 'Default value for the Notify me when someone I follow creates a topic
user preference. Changing this setting only applies to users who have never changed their notification preferences of the follow plugin'
16 | default_allow_people_to_follow_me: 'Default value for the Allow people to follow me
user preference. Changing this setting only applies to users who have never changed their notification preferences of the follow plugin'
17 |
18 | follow:
19 | user_not_found: "Couldn't find user with username %{username}"
20 | user_cannot_follow_themself: "User is not allowed to follow themself"
21 | invalid_notification_level: "Invalid notification level %{level}"
22 | cannot_follow_bot: "Cannot follow a bot user"
23 | cannot_follow_suspended: "Cannot follow a suspend user"
24 | cannot_follow_staged: "Cannot follow a staged user"
25 | invalid_created_before_date: "Received an invalid date for the `created_before` param: %{value}"
26 | user_does_not_allow_follow: "%{username} does not allow people to follow them."
27 |
--------------------------------------------------------------------------------
/config/locales/server.en_GB.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | en_GB:
8 |
--------------------------------------------------------------------------------
/config/locales/server.es.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | es:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} creó «%{topic}» - %{site_title}'
11 | following_replied: '%{username} publicó en «%{topic}» - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Habilitar el plugin de seguimiento."
14 | follow_show_statistics_on_profile: "Mostrar las estadísticas de seguimiento en los perfiles de los usuarios."
15 | follow_notifications_enabled: "Habilitar todas las notificaciones de seguimiento."
16 | follow_followers_visible: "Visibilidad de seguidores."
17 | follow_following_visible: "Visibilidad de personas a las que sigues."
18 | default_notify_me_when_followed: 'Valor predeterminado para la preferencia de usuario Notificarme cuando los usuarios me siguen
. Cambiar este ajuste solo se aplica a los usuarios que nunca han cambiado sus preferencias de notificaciones del plugin de seguimiento'
19 | default_notify_followed_user_when_followed: 'Valor predeterminado para la preferencia de usuario Notificar a los usuarios al seguirlos
. El cambio de este ajuste solo se aplica a los usuarios que nunca han cambiado sus preferencias de notificaciones del plugin de seguimiento'
20 | default_notify_me_when_followed_replies: 'Valor predeterminado para la preferencia de usuario Notificarme cuando alguien a quien sigo responde a un tema
. Cambiar este ajuste solo se aplica a los usuarios que nunca han cambiado sus preferencias de notificaciones del plugin de seguimiento'
21 | default_notify_me_when_followed_creates_topic: 'Valor predeterminado para la preferencia de usuario Notificarme cuando alguien a quien sigo crea un tema
. Cambiar este ajuste solo se aplica a los usuarios que nunca han cambiado sus preferencias de notificaciones del plugin de seguimiento'
22 | default_allow_people_to_follow_me: 'Valor predeterminado para la preferencia de usuario Permitir que la gente me siga
. Cambiar este ajuste solo se aplica a los usuarios que nunca han cambiado sus preferencias de notificaciones del plugin de seguimiento'
23 | follow:
24 | user_not_found: "No se pudo encontrar el usuario con el nombre de usuario %{username}"
25 | user_cannot_follow_themself: "El usuario no tiene permitido seguirse a sí mismo"
26 | invalid_notification_level: "Nivel de notificación no válido %{level}"
27 | cannot_follow_bot: "No se puede seguir a un usuario bot"
28 | cannot_follow_suspended: "No se puede seguir a un usuario suspendido"
29 | cannot_follow_staged: "No se puede seguir a un usuario provisional"
30 | invalid_created_before_date: "Se recibió una fecha no válida para el parámetro `created_before`: %{value}"
31 | user_does_not_allow_follow: "%{username} no permite que la gente le siga."
32 |
--------------------------------------------------------------------------------
/config/locales/server.et.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | et:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} lõi "%{topic}" - %{site_title}'
11 | following_replied: '%{username} postitas teemasse "%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Luba jälgimise plugin"
14 | follow_show_statistics_on_profile: "Näita jälgimisstatistikat kasutajaprofiililidel"
15 | follow_notifications_enabled: "Luba kõik jälgimismärguanded."
16 | follow_followers_visible: "Jälgijate nähtavus."
17 | follow:
18 | user_cannot_follow_themself: "Kasutajal ei ole lubatud ennast jälgida"
19 | invalid_notification_level: "Kehtetu teavituse tase %{level}"
20 | cannot_follow_bot: "Ei saa jälgida bot-kasutajat"
21 | cannot_follow_suspended: "Peatatud kasutajat ei saa jälgida"
22 | user_does_not_allow_follow: "%{username} ei luba inimestel ennast jälgida."
23 |
--------------------------------------------------------------------------------
/config/locales/server.fa_IR.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | fa_IR:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} در "%{topic}" - %{site_title} مطلبی نوشت'
11 |
--------------------------------------------------------------------------------
/config/locales/server.fi.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | fi:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} loi ketjun "%{topic}" – %{site_title}'
11 | following_replied: '%{username} lähetti viestin ketjuun "%{topic}" – %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Ota seuraamislisäosa käyttöön."
14 | follow_show_statistics_on_profile: "Näytä seuraamistilastot käyttäjäprofiileissa."
15 | follow_notifications_enabled: "Ota kaikki seurantailmoitukset käyttöön."
16 | follow_followers_visible: "Seuraajien näkyvyys."
17 | follow_following_visible: "Seuraamisen näkyvyys."
18 | default_notify_me_when_followed: 'Ilmoita minulle, kun käyttäjät seuraavat minua
-käyttäjäasetuksen oletusarvo. Tämän asetuksen muuttaminen koskee vain käyttäjiä, jotka eivät ole koskaan muuttaneet follow-lisäosan ilmoitusasetuksiaan.'
19 | default_notify_followed_user_when_followed: 'Ilmoita käyttäjille, kun seuraan heitä
-käyttäjäasetuksen oletusarvo. Tämän asetuksen muuttaminen koskee vain käyttäjiä, jotka eivät ole koskaan muuttaneet follow-lisäosan ilmoitusasetuksiaan.'
20 | default_notify_me_when_followed_replies: 'Ilmoita minulle, kun joku seuraamani vastaa
-käyttäjäasetuksen oletusarvo. Tämän asetuksen muuttaminen koskee vain käyttäjiä, jotka eivät ole koskaan muuttaneet follow-lisäosan ilmoitusasetuksiaan.'
21 | default_notify_me_when_followed_creates_topic: 'Ilmoita minulle, kun joku seuraamani luo ketjun
-käyttäjäasetuksen oletusarvo. Tämän asetuksen muuttaminen koskee vain käyttäjiä, jotka eivät ole koskaan muuttaneet follow-lisäosan ilmoitusasetuksiaan.'
22 | default_allow_people_to_follow_me: 'Salli ihmisten seurata minua
-käyttäjäasetuksen oletusarvo. Tämän asetuksen muuttaminen koskee vain käyttäjiä, jotka eivät ole koskaan muuttaneet follow-lisäosan ilmoitusasetuksiaan.'
23 | follow:
24 | user_not_found: "Käyttäjätunnuksella %{username} ei löydy käyttäjää"
25 | user_cannot_follow_themself: "Käyttäjä ei saa seurata itseään"
26 | invalid_notification_level: "Virheellinen ilmoitustaso %{level}"
27 | cannot_follow_bot: "Bottikäyttäjää ei voi seurata"
28 | cannot_follow_suspended: "Estettyä käyttäjää ei voi seurata"
29 | cannot_follow_staged: "Vaiheistettua käyttäjää ei voi seurata"
30 | invalid_created_before_date: "Virheellinen päivämäärä vastaanotettu \"created_before\"-parametrille: %{value}"
31 | user_does_not_allow_follow: "%{username} ei salli ihmisten seuraavan häntä."
32 |
--------------------------------------------------------------------------------
/config/locales/server.fr.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | fr:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} a créé « %{topic} » - %{site_title}'
11 | following_replied: '%{username} a publié un message dans « %{topic} » - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Activer l'extension de suivi."
14 | follow_show_statistics_on_profile: "Afficher les statistiques de suivi sur les profils des utilisateurs."
15 | follow_notifications_enabled: "Activer toutes les notifications de suivi."
16 | follow_followers_visible: "Visibilité des abonnés."
17 | follow_following_visible: "Visibilité du suivi."
18 | default_notify_me_when_followed: 'Valeur par défaut pour la préférence utilisateur M''avertir lorsque des utilisateurs me suivent
. La modification de ce paramètre ne s''applique qu''aux utilisateurs qui n''ont jamais modifié leurs préférences de notification de l''extension de suivi'
19 | default_notify_followed_user_when_followed: 'Valeur par défaut pour la préférence utilisateur Avertir les utilisateurs lorsque je les suis
. La modification de ce paramètre ne s''applique qu''aux utilisateurs qui n''ont jamais modifié leurs préférences de notification de l''extension de suivi'
20 | default_notify_me_when_followed_replies: 'Valeur par défaut pour la préférence utilisateur M''avertir lorsque quelqu''un que je suis répond
. La modification de ce paramètre ne s''applique qu''aux utilisateurs qui n''ont jamais modifié leurs préférences de notification de l''extension de suivi'
21 | default_notify_me_when_followed_creates_topic: 'Valeur par défaut pour la préférence utilisateur M''avertir lorsqu''une personne que je suis crée un sujet
. La modification de ce paramètre ne s''applique qu''aux utilisateurs qui n''ont jamais modifié leurs préférences de notification de l''extension de suivi'
22 | default_allow_people_to_follow_me: 'Valeur par défaut pour la préférence utilisateur Autoriser les autres utilisateurs à me suivre
. La modification de ce paramètre ne s''applique qu''aux utilisateurs qui n''ont jamais modifié leurs préférences de notification de l''extension de suivi'
23 | follow:
24 | user_not_found: "Impossible de trouver l'utilisateur avec le nom d'utilisateur %{username}"
25 | user_cannot_follow_themself: "L'utilisateur n'est pas autorisé à se suivre lui-même"
26 | invalid_notification_level: "Niveau de notification invalide %{level}"
27 | cannot_follow_bot: "Impossible de suivre un utilisateur robot"
28 | cannot_follow_suspended: "Impossible de suivre un utilisateur suspendu"
29 | cannot_follow_staged: "Impossible de suivre un utilisateur distant"
30 | invalid_created_before_date: "Réception d'une date invalide pour le paramètre « created_before » : %{value}"
31 | user_does_not_allow_follow: "%{username} n'autorise pas les autres utilisateurs à le ou la suivre."
32 |
--------------------------------------------------------------------------------
/config/locales/server.gl.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | gl:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} publicou en "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.he.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | he:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '„%{topic}” נוצר על ידי %{username} - %{site_title}'
11 | following_replied: '%{username} הגיב ב"%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "הפעל את תוסף המעקב."
14 | follow_show_statistics_on_profile: "הצג סטטיסטיקות מעקב בפרופילים של משתמשים."
15 | follow_notifications_enabled: "הפעל את כל התראות המעקב."
16 | follow_followers_visible: "נראות העוקבים."
17 | follow_following_visible: "נראות הנעקבים."
18 | default_notify_me_when_followed: 'ערך ברירת מחדל להעדפת המשתמש להודיע לי כשמשתמשים עוקבים אחרי
. שינוי ההגדרה הזאת משפיע רק על משתמשים שמעולם לא שינוי את העדפות ההתראה שלהם בתוסף המעקב.'
19 | default_notify_followed_user_when_followed: 'ערך ברירת מחדל להעדפת המשתמש להודיע לשמשתמשים עם הוספתם לרשימת המעקב שלי
. שינוי ההגדרה הזאת משפיע רק על משתמשים שמעולם לא שינוי את העדפות ההתראה שלהם בתוסף המעקב.'
20 | default_notify_me_when_followed_replies: 'ערך ברירת מחדל להעדפת המשתמש להודיע לי כשמשתמשים מרשימת המעקב שלי מגיבים
. שינוי ההגדרה הזאת משפיע רק על משתמשים שמעולם לא שינוי את העדפות ההתראה שלהם בתוסף המעקב.'
21 | default_notify_me_when_followed_creates_topic: 'ערך ברירת מחדל להעדפת המשתמש להודיע לי כשמשתמשים מרשימת המעקב שלי יוצרים נושא
. שינוי ההגדרה הזאת משפיע רק על משתמשים שמעולם לא שינוי את העדפות ההתראה שלהם בתוסף המעקב.'
22 | default_allow_people_to_follow_me: 'ערך ברירת מחדל להעדפת המשתמש לאפשר לאנשים לעקוב אחריי
. שינוי ההגדרה הזאת משפיע רק על משתמשים שמעולם לא שינוי את העדפות ההתראה שלהם בתוסף המעקב.'
23 | follow:
24 | user_not_found: "לא ניתן למצוא משתמש בשם %{username}"
25 | user_cannot_follow_themself: "משתמש לא רשאי לעקוב אחרי עצמו"
26 | invalid_notification_level: "דרגת ההתראה %{level} שגויה"
27 | cannot_follow_bot: "לא ניתן לעקוב אחר משתמש בוט"
28 | cannot_follow_suspended: "לא ניתן לעקוב אחר משתמש בהשעיה"
29 | cannot_follow_staged: "לא ניתן לעקוב אחר משתמש מבוים"
30 | invalid_created_before_date: "התקבל תאריך שגוי עבור המשתנה ‚created_before’ (נוצר לפני): %{value}"
31 | user_does_not_allow_follow: "אין הרשאה מצד %{username} להוספה שלהם לרשימת מעקב."
32 |
--------------------------------------------------------------------------------
/config/locales/server.hr.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | hr:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} objavio u "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.hu.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | hu:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} bejegyzést tett itt: „%{topic}” – %{site_title}'
11 | site_settings:
12 | discourse_follow_enabled: "Követő plugin engedélyezése"
13 | follow_show_statistics_on_profile: "Követési statisztika megjelenítése a felhasználói profilban"
14 | follow_notifications_enabled: "Az összes követési értesítés engedélyezése."
15 | follow_followers_visible: "Követők láthatósága."
16 | follow_following_visible: "Követettek láthatósága."
17 |
--------------------------------------------------------------------------------
/config/locales/server.hy.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | hy:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} -ը գրառում է կատարել այստեղ՝ "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.id.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | id:
8 |
--------------------------------------------------------------------------------
/config/locales/server.it.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | it:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} ha creato "%{topic}" - %{site_title}'
11 | following_replied: '%{username} ha pubblicato qualcosa in "%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Abilita il plug-in follow."
14 | follow_show_statistics_on_profile: "Mostra le statistiche di utenti che seguono sui profili utente."
15 | follow_notifications_enabled: "Abilita tutte le notifiche di utenti che seguono."
16 | follow_followers_visible: "Visibilità dei follower."
17 | follow_following_visible: "Visibilità di chi segui"
18 | default_notify_me_when_followed: 'Valore predefinito per la preferenza utente Avvisami quando gli utenti mi seguono
. La modifica di questa impostazione si applica solo agli utenti che non hanno mai modificato le proprie preferenze di notifica del plugin follow'
19 | default_notify_followed_user_when_followed: 'Valore predefinito per la preferenza utente Avvisa gli utenti che seguo
. La modifica di questa impostazione si applica solo agli utenti che non hanno mai modificato le proprie preferenze di notifica del plugin follow'
20 | default_notify_me_when_followed_replies: 'Valore predefinito per la preferenza utente Avvisami quando qualcuno che seguo risponde
. La modifica di questa impostazione si applica solo agli utenti che non hanno mai modificato le proprie preferenze di notifica del plugin follow'
21 | default_notify_me_when_followed_creates_topic: 'Valore predefinito per la preferenza utente Avvisami quando qualcuno che seguo crea un argomento
. La modifica di questa impostazione si applica solo agli utenti che non hanno mai modificato le proprie preferenze di notifica del plugin follow'
22 | default_allow_people_to_follow_me: 'Valore predefinito per la preferenza utente Consenti agli utenti di seguirmi
. La modifica di questa impostazione si applica solo agli utenti che non hanno mai modificato le proprie preferenze di notifica del plug-in follow'
23 | follow:
24 | user_not_found: "Impossibile trovare l'utente con nome utente %{username}"
25 | user_cannot_follow_themself: "L'utente non è autorizzato a seguire se stesso"
26 | invalid_notification_level: "Livello di notifica %{level} non valido"
27 | cannot_follow_bot: "Impossibile seguire un utente bot"
28 | cannot_follow_suspended: "Impossibile seguire un utente sospeso"
29 | cannot_follow_staged: "Impossibile seguire un utente temporaneo"
30 | invalid_created_before_date: "Ricevuta una data non valida per il parametro `created_before`: %{value}"
31 | user_does_not_allow_follow: "%{username} non consente alle persone di seguirlo."
32 |
--------------------------------------------------------------------------------
/config/locales/server.ja.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ja:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} が「%{topic}」を作成しました - %{site_title}'
11 | following_replied: '%{username} が「%{topic}」に投稿しました - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "フォロープラグインを有効にします。"
14 | follow_show_statistics_on_profile: "ユーザープロファイルにフォロー統計を表示します。"
15 | follow_notifications_enabled: "すべてのフォロー通知を有効にします。"
16 | follow_followers_visible: "フォロワーの表示状態。"
17 | follow_following_visible: "フォロー中の表示状態。"
18 | default_notify_me_when_followed: '「ユーザーが自分をフォローしたら通知する
」ユーザー設定のデフォルト値。この設定の変更は、フォロープラグインの通知設定を変更したことのないユーザーのみに適用されます。'
19 | default_notify_followed_user_when_followed: '「フォローしたらそのユーザーに通知する
」ユーザー設定のデフォルト値。この設定の変更は、フォロープラグインの通知設定を変更したことのないユーザーのみに適用されます。'
20 | default_notify_me_when_followed_replies: '「フォローしている人が返信したら通知する
」ユーザー設定のデフォルト値。この設定の変更は、フォロープラグインの通知設定を変更したことのないユーザーのみに適用されます。'
21 | default_notify_me_when_followed_creates_topic: '「フォローしている人がトピックを作成したら通知する
」ユーザー設定のデフォルト値。この設定の変更は、フォロープラグインの通知設定を変更したことのないユーザーのみに適用されます。'
22 | default_allow_people_to_follow_me: '「他のユーザーにフォローを許可する
」ユーザー設定のデフォルト値。この設定の変更は、フォロープラグインの通知設定を変更したことのないユーザーのみに適用されます。'
23 | follow:
24 | user_not_found: "ユーザー名 %{username} のユーザーが見つかりませんでした"
25 | user_cannot_follow_themself: "ユーザーは自身をフォローすることはできません"
26 | invalid_notification_level: "無効な通知レベル %{level}"
27 | cannot_follow_bot: "ボットユーザーをフォローできません"
28 | cannot_follow_suspended: "凍結中のユーザーをフォローできません"
29 | cannot_follow_staged: "ステージングユーザーをフォローできません"
30 | invalid_created_before_date: "`created_before` パラメーターに無効な日付を受け取りました: %{value}"
31 | user_does_not_allow_follow: "%{username} はユーザーのフォローを許可していません。"
32 |
--------------------------------------------------------------------------------
/config/locales/server.ko.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ko:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '"%{topic}"에서 %{username}님이 글을 게시하였습니다 - %{site_title}'
11 | site_settings:
12 | discourse_follow_enabled: "팔로우 플러그인을 활성화합니다."
13 |
--------------------------------------------------------------------------------
/config/locales/server.lt.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | lt:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} paskelbė "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.lv.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | lv:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} ierakstīja "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.nb_NO.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | nb_NO:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} skrev noe i "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.nl.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | nl:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} heeft ''%{topic}'' gemaakt - %{site_title}'
11 | following_replied: '%{username} heeft een bericht geplaatst in ''%{topic}'' - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Schakel de volgplug-in in."
14 | follow_show_statistics_on_profile: "Toon volgstatistieken in gebruikersprofielen."
15 | follow_notifications_enabled: "Schakel alle volgmeldingen in."
16 | follow_followers_visible: "Zichtbaarheid van volgers."
17 | follow_following_visible: "Zichtbaarheid van volgend."
18 | default_notify_me_when_followed: 'Standaardwaarde voor de gebruikersvoorkeur Laat me weten wanneer gebruikers mij volgen
. Het wijzigen van deze instelling is alleen van toepassing op gebruikers die hun meldingsvoorkeuren van de volgplug-in nooit hebben gewijzigd'
19 | default_notify_followed_user_when_followed: 'Standaardwaarde voor de gebruikersvoorkeur Laat gebruikers weten wanneer ik ze volg
. Het wijzigen van deze instelling is alleen van toepassing op gebruikers die hun meldingsvoorkeuren van de volgplug-in nooit hebben gewijzigd'
20 | default_notify_me_when_followed_replies: 'Standaardwaarde voor de gebruikersvoorkeur Laat me weten wanneer iemand die ik volg antwoordt
. Het wijzigen van deze instelling is alleen van toepassing op gebruikers die hun meldingsvoorkeuren van de volgplug-in nooit hebben gewijzigd'
21 | default_notify_me_when_followed_creates_topic: 'Standaardwaarde voor de gebruikersvoorkeur Laat me weten wanneer die ik volg een topic maakt
. Het wijzigen van deze instelling is alleen van toepassing op gebruikers die hun meldingsvoorkeuren van de volgplug-in nooit hebben gewijzigd'
22 | default_allow_people_to_follow_me: 'Standaardwaarde voor de gebruikersvoorkeur Sta mensen toe mij te volgen
. Het wijzigen van deze instelling is alleen van toepassing op gebruikers die hun meldingsvoorkeuren van de volgplug-in nooit hebben gewijzigd'
23 | follow:
24 | user_not_found: "Kon gebruiker met gebruikersnaam %{username} niet vinden."
25 | user_cannot_follow_themself: "Gebruiker mag zichzelf niet volgen"
26 | invalid_notification_level: "Ongeldig meldingsniveau %{level}"
27 | cannot_follow_bot: "Kan een botgebruiker niet volgen"
28 | cannot_follow_suspended: "Kan een geschorste gebruiker niet volgen"
29 | cannot_follow_staged: "Kan een gefaseerde gebruiker niet volgen"
30 | invalid_created_before_date: "Ongeldige datum ontvangen voor de parameter `created_before`: %{value}"
31 | user_does_not_allow_follow: "%{username} staat niet toe dat mensen hem/haar volgen."
32 |
--------------------------------------------------------------------------------
/config/locales/server.pl_PL.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | pl_PL:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} utworzył(a) "%{topic}" - %{site_title}'
11 | following_replied: '%{username} napisał(a) w "%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Włącz wtyczkę obserwacji."
14 | follow_show_statistics_on_profile: "Pokaż statystyki obserwowania w profilach użytkowników."
15 | follow_notifications_enabled: "Włącz wszystkie powiadomienia o obserwacjach."
16 | follow_followers_visible: "Widoczność obserwujących."
17 | follow_following_visible: "Widoczność obserwowanych."
18 | default_notify_me_when_followed: 'Wartość domyślna dla preferencji Powiadom mnie, gdy użytkownicy mnie obserwują
użytkownika. Zmiana tego ustawienia dotyczy tylko użytkowników, którzy nigdy nie zmienili swoich preferencji powiadamiania we wtyczce obserwacji.'
19 | default_notify_followed_user_when_followed: 'Wartość domyślna dla preferencji Powiadamiaj użytkowników, gdy ich zaobserwuję
użytkownika. Zmiana tego ustawienia dotyczy tylko użytkowników, którzy nigdy nie zmienili swoich preferencji powiadamiania we wtyczce obserwacji.'
20 | default_notify_me_when_followed_replies: 'Wartość domyślna dla preferencji Powiadom mnie, gdy ktoś, kogo śledzę, odpowiada
użytkownika. Zmiana tego ustawienia dotyczy tylko użytkowników, którzy nigdy nie zmienili swoich preferencji powiadamiania we wtyczce obserwacji.'
21 | default_notify_me_when_followed_creates_topic: 'Wartość domyślna dla preferencji Powiadom mnie, gdy ktoś, kogo obserwuję, utworzy temat
użytkownika. Zmiana tego ustawienia dotyczy tylko użytkowników, którzy nigdy nie zmienili swoich preferencji powiadamiania we wtyczce obserwacji.'
22 | default_allow_people_to_follow_me: 'Wartość domyślna dla preferencji Pozwól ludziom mnie obserwować
użytkownika. Zmiana tego ustawienia dotyczy tylko użytkowników, którzy nigdy nie zmienili swoich preferencji powiadamiania we wtyczce obserwacji.'
23 | follow:
24 | user_not_found: "Nie można znaleźć użytkownika o nazwie %{username}"
25 | user_cannot_follow_themself: "Użytkownik nie może obserwować samego siebie"
26 | invalid_notification_level: "Nieprawidłowy poziom powiadomień %{level}"
27 | cannot_follow_bot: "Nie można obserwować bota"
28 | cannot_follow_suspended: "Nie można obserwować zawieszonego użytkownika"
29 | cannot_follow_staged: "Nie można obserwować użytkownika etapowego"
30 | invalid_created_before_date: "Otrzymano nieprawidłową datę dla parametru `created_before`: %{value}"
31 | user_does_not_allow_follow: "%{username} nie pozwala na obserwowanie."
32 |
--------------------------------------------------------------------------------
/config/locales/server.pt.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | pt:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} publicou em "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.pt_BR.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | pt_BR:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} criou "%{topic}" - %{site_title}'
11 | following_replied: '%{username} postou em "%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Ativar o plugin de acompanhamento."
14 | follow_show_statistics_on_profile: "Exibir estatísticas de acompanhamento nos perfis dos(as) usuários(as)."
15 | follow_notifications_enabled: "Ativar todas as notificações de acompanhamento."
16 | follow_followers_visible: "Visibilidade dos(as) seguidores(as)."
17 | follow_following_visible: "Visibilidade dos(as) seguidos(as)."
18 | default_notify_me_when_followed: 'Valor padrão para a preferência de usuário(a) Notificar-me quando usuários(as) me seguirem
. A alteração dessa configuração se aplica apenas a usuários(as) que nunca alteraram suas preferências de notificação ou o plugin de acompanhamento'
19 | default_notify_followed_user_when_followed: 'Valor padrão para a preferência de usuário(a) Notificar usuários(as) quando eu seguir
. A alteração dessa configuração se aplica apenas a usuários(as) que nunca alteraram suas preferências de notificação ou o plugin de acompanhamento'
20 | default_notify_me_when_followed_replies: 'Valor padrão para a preferência de usuário(a) Notificar-me quando eu acompanhar respostas
. A alteração dessa configuração se aplica apenas a usuários(as) que nunca alteraram suas preferências de notificação ou o plugin de acompanhamento'
21 | default_notify_me_when_followed_creates_topic: 'Valor padrão para a preferência de usuário(a) Notificar-me quando eu criar um tópico
. A alteração dessa configuração se aplica apenas a usuários(as) que nunca alteraram suas preferências de notificação ou o plugin de acompanhamento'
22 | default_allow_people_to_follow_me: 'Valor padrão para a preferência de usuário(a) Permitir que me sigam
. A alteração dessa configuração se aplica apenas a usuários(as) que nunca alteraram suas preferências de notificação ou o plugin de acompanhamento'
23 | follow:
24 | user_not_found: "Não foi possível encontrar usuário(a) com o nome de usuário(a) %{username}"
25 | user_cannot_follow_themself: "O(a) usuário(a) não pode seguir a si"
26 | invalid_notification_level: "Nível de notificação inválido %{level}"
27 | cannot_follow_bot: "Não é possível seguir um(a) usuário(a) robô"
28 | cannot_follow_suspended: "Não é possível seguir um(a) usuário(a) suspenso(a)"
29 | cannot_follow_staged: "Não é possível seguir um(a) usuário(a) encenado(a)"
30 | invalid_created_before_date: "Data inválida recebida para o parâmetro \"created_before\": %{value}"
31 | user_does_not_allow_follow: "%{username} não permite ser seguido(a)"
32 |
--------------------------------------------------------------------------------
/config/locales/server.ro.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ro:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} a postat în discuția "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.ru.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ru:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} создал(а) тему «%{topic}» — %{site_title}'
11 | following_replied: '%{username} написал(а) в теме «%{topic}» — %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Включить плагин подписок."
14 | follow_show_statistics_on_profile: "Показывать статистику подписок в профилях пользователей."
15 | follow_notifications_enabled: "Включите все уведомления о подписках."
16 | follow_followers_visible: "Кто видит подписчиков."
17 | follow_following_visible: "Кто видит подписки."
18 | default_notify_me_when_followed: 'Значение по умолчанию для параметра пользователя Уведомлять, когда подписываются на меня
. Изменение этого параметра действует только на пользователей, которые не меняли настройки уведомлений для плагина подписок.'
19 | default_notify_followed_user_when_followed: 'Значение по умолчанию для параметра пользователя Уведомлять пользователей, когда я на них подписываюсь
. Изменение этого параметра действует только на пользователей, которые не меняли настройки уведомлений для плагина подписок.'
20 | default_notify_me_when_followed_replies: 'Значение по умолчанию для параметра пользователя Уведомлять, когда кто-то из моих подписок отвечает
. Изменение этого параметра действует только на пользователей, которые не меняли настройки уведомлений для плагина подписок.'
21 | default_notify_me_when_followed_creates_topic: 'Значение по умолчанию для параметра пользователя Уведомлять, когда кто-то из моих подписок создает тему
. Изменение этого параметра действует только на пользователей, которые не меняли настройки уведомлений для плагина подписок.'
22 | default_allow_people_to_follow_me: 'Значение по умолчанию для параметра пользователя Разрешить подписываться на меня
. Изменение этого параметра действует только на пользователей, которые не меняли настройки уведомлений для плагина подписок.'
23 | follow:
24 | user_not_found: "Не удалось найти имя пользователя %{username}"
25 | user_cannot_follow_themself: "Подписываться на себя нельзя"
26 | invalid_notification_level: "Неверный уровень уведомлений %{level}"
27 | cannot_follow_bot: "Подписаться на бота нельзя"
28 | cannot_follow_suspended: "Подписаться на замороженного пользователя нельзя"
29 | cannot_follow_staged: "Подписаться на сымитированного пользователя нельзя"
30 | invalid_created_before_date: "Получена неверная дата для параметра `created_before`: %{value}"
31 | user_does_not_allow_follow: "%{username} запрещает подписываться на себя."
32 |
--------------------------------------------------------------------------------
/config/locales/server.sk.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sk:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} prispel v "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.sl.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sl:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} je objavil v "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.sq.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sq:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} postoi në "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.sr.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sr:
8 |
--------------------------------------------------------------------------------
/config/locales/server.sv.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sv:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} skapade "%{topic}" - %{site_title}'
11 | following_replied: '%{username} skrev inlägg i "%{topic}" - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Aktivera insticksprogram Följare"
14 | follow_show_statistics_on_profile: "Visa följestatistik på användarprofiler."
15 | follow_notifications_enabled: "Aktivera alla följaviseringar."
16 | follow_followers_visible: "Följares synlighet."
17 | follow_following_visible: "Synlighet för följer."
18 | default_notify_me_when_followed: 'Standardvärde för användarinställning Meddela mig när användare följer mig
. Att ändra den här inställningen gäller bara användare som aldrig har ändrat sina aviseringsinställningar för följande plugin'
19 | default_notify_followed_user_when_followed: 'Standardvärde för användarinställning Meddela användare när jag följer dem
. Att ändra den här inställningen gäller bara användare som aldrig har ändrat sina aviseringsinställningar för följande plugin'
20 | default_notify_me_when_followed_replies: 'Standardvärde för användarinställning Meddela mig när någon jag följer svarar
. Att ändra den här inställningen gäller bara användare som aldrig har ändrat sina aviseringsinställningar för följande plugin'
21 | default_notify_me_when_followed_creates_topic: 'Standardvärde för användarinställningMeddela mig när någon jag följer skapar ett ämne
. Att ändra den här inställningen gäller bara användare som aldrig har ändrat sina aviseringsinställningar för följande plugin'
22 | default_allow_people_to_follow_me: 'Standardvärdet för användarinställning Tillåt folk att följa mig
. Att ändra den här inställningen gäller bara användare som aldrig har ändrat sina aviseringsinställningar för följande plugin'
23 | follow:
24 | user_not_found: "Kunde inte hitta användare med användarnamn %{username}"
25 | user_cannot_follow_themself: "Användaren kan inte följa sig själv"
26 | invalid_notification_level: "Ogiltig aviseringsnivå %{level}"
27 | cannot_follow_bot: "Kan inte följa en botanvändare"
28 | cannot_follow_suspended: "Det går inte att följa en avstängd användare"
29 | cannot_follow_staged: "Det går inte att följa en iscensatt användare"
30 | invalid_created_before_date: "Fick ett ogiltigt datum för parametern 'created_before': %{value}"
31 | user_does_not_allow_follow: "%{username} tillåter inte att personer följer dem."
32 |
--------------------------------------------------------------------------------
/config/locales/server.sw.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sw:
8 |
--------------------------------------------------------------------------------
/config/locales/server.te.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | te:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} "%{topic}"- %{site_title}లో పోస్ట్ చేసారు'
11 |
--------------------------------------------------------------------------------
/config/locales/server.th.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | th:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} โพสท์ใน "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.tr_TR.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | tr_TR:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} "%{topic}" başlıklı bir konu oluşturdu - %{site_title}'
11 | following_replied: '%{username}, "%{topic}" başlıklı konuya gönderi yaptı - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "Takip eklentisini etkinleştirin."
14 | follow_show_statistics_on_profile: "Kullanıcı profillerinde takip istatistiklerini gösterin."
15 | follow_notifications_enabled: "Tüm takip bildirimlerini etkinleştirin."
16 | follow_followers_visible: "Takipçi görünürlüğü."
17 | follow_following_visible: "Takip ediliyor görünürlüğü."
18 | default_notify_me_when_followed: 'Kullanıcılar beni takip ettiğinde bana bildir
kullanıcı tercihi için varsayılan değer. Bu ayarın değiştirilmesi yalnızca takip eklentisinin bildirim tercihlerini hiç değiştirmemiş kullanıcılar için geçerlidir'
19 | default_notify_followed_user_when_followed: 'Kullanıcıları takip ettiğimde onlara bildir
kullanıcı tercihi için varsayılan değer. Bu ayarın değiştirilmesi yalnızca takip eklentisinin bildirim tercihlerini hiç değiştirmemiş kullanıcılar için geçerlidir'
20 | default_notify_me_when_followed_replies: 'Takip ettiğim biri yanıt verdiğinde bana bildir
kullanıcı tercihi için varsayılan değer. Bu ayarın değiştirilmesi yalnızca takip eklentisinin bildirim tercihlerini hiç değiştirmemiş kullanıcılar için geçerlidir'
21 | default_notify_me_when_followed_creates_topic: 'Takip ettiğim biri konu oluşturduğunda bana bildir
kullanıcı tercihi için varsayılan değer. Bu ayarın değiştirilmesi yalnızca takip eklentisinin bildirim tercihlerini hiç değiştirmemiş kullanıcılar için geçerlidir'
22 | default_allow_people_to_follow_me: 'Kişilerin beni takip etmesine izin ver
kullanıcı tercihi için varsayılan değer. Bu ayarın değiştirilmesi yalnızca takip eklentisinin bildirim tercihlerini hiç değiştirmemiş kullanıcılar için geçerlidir'
23 | follow:
24 | user_not_found: "Kullanıcı adı %{username} olan kullanıcı bulunamadı"
25 | user_cannot_follow_themself: "Kullanıcının kendisini takip etmesine izin verilmez"
26 | invalid_notification_level: "Geçersiz bildirim seviyesi %{level}"
27 | cannot_follow_bot: "Bir bot kullanıcısı takip edilemez"
28 | cannot_follow_suspended: "Askıya alınmış bir kullanıcı takip edilemez"
29 | cannot_follow_staged: "Aşamalı bir kullanıcı takip edilemez"
30 | invalid_created_before_date: "\"created_before\" parametresi için geçersiz bir tarih alındı: %{value}"
31 | user_does_not_allow_follow: "%{username} kişilerin kendisini takip etmelerine izin vermiyor."
32 |
--------------------------------------------------------------------------------
/config/locales/server.ug.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ug:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} «%{topic}» - %{site_title} غا يوللىدى'
11 |
--------------------------------------------------------------------------------
/config/locales/server.uk.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | uk:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} опублікував в "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.ur.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ur:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} نے "%{topic}" میں پوسٹ کیا - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.vi.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | vi:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} gửi bài trong "%{topic}" - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/locales/server.zh_CN.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | zh_CN:
8 | discourse_push_notifications:
9 | popup:
10 | following_created_topic: '%{username} 创建了 "%{topic}" - %{site_title}'
11 | following_replied: '%{username} 在 "%{topic}" 中发布了帖子 - %{site_title}'
12 | site_settings:
13 | discourse_follow_enabled: "启用关注插件。"
14 | follow_show_statistics_on_profile: "在用户个人资料上显示关注统计信息"
15 | follow_notifications_enabled: "启用所有关注通知。"
16 | follow_followers_visible: "关注者可见性。"
17 | follow_following_visible: "正在关注可见性。"
18 | default_notify_me_when_followed: '用户偏好设置当用户关注我时通知我
的默认值。更改此设置仅适用于从未更改过关注插件的通知偏好设置的用户'
19 | default_notify_followed_user_when_followed: '用户偏好设置当我关注用户时通知他们
的默认值。更改此设置仅适用于从未更改过关注插件的通知偏好设置的用户'
20 | default_notify_me_when_followed_replies: '用户偏好设置当我关注的用户回复时通知我
的默认值。更改此设置仅适用于从未更改过关注插件的通知偏好设置的用户'
21 | default_notify_me_when_followed_creates_topic: '用户偏好设置当我关注的用户创建话题时通知我
的默认值。更改此设置仅适用于从未更改过关注插件的通知偏好设置的用户'
22 | default_allow_people_to_follow_me: '用户偏好设置允许其他人关注我
的默认值。更改此设置仅适用于从未更改过关注插件的通知偏好设置的用户'
23 | follow:
24 | user_not_found: "找不到用户名为 %{username} 的用户"
25 | user_cannot_follow_themself: "用户不能关注自己"
26 | invalid_notification_level: "无效的通知级别 %{level}"
27 | cannot_follow_bot: "无法关注机器人用户"
28 | cannot_follow_suspended: "无法关注已被封禁的用户"
29 | cannot_follow_staged: "无法关注暂存用户"
30 | invalid_created_before_date: "`created_before` 参数收到无效日期:%{value}"
31 | user_does_not_allow_follow: "%{username} 不允许其他人关注他。"
32 |
--------------------------------------------------------------------------------
/config/locales/server.zh_TW.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | zh_TW:
8 | discourse_push_notifications:
9 | popup:
10 | following_replied: '%{username} 在"%{topic}" 中發文 - %{site_title}'
11 |
--------------------------------------------------------------------------------
/config/routes.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | Follow::Engine.routes.draw do
4 | put ":username" => "follow#follow",
5 | :constraints => {
6 | username: RouteFormat.username,
7 | format: /(json|html)/,
8 | },
9 | :defaults => {
10 | format: :json,
11 | }
12 |
13 | delete ":username" => "follow#unfollow",
14 | :constraints => {
15 | username: RouteFormat.username,
16 | format: /(json|html)/,
17 | },
18 | :defaults => {
19 | format: :json,
20 | }
21 |
22 | get "posts/:username" => "follow#posts",
23 | :constraints => {
24 | username: RouteFormat.username,
25 | format: /(json|html)/,
26 | },
27 | :defaults => {
28 | format: :json,
29 | }
30 | end
31 |
32 | Discourse::Application.routes.draw do
33 | mount ::Follow::Engine, at: "follow"
34 |
35 | %w[users u].each_with_index do |root_path, index|
36 | get "#{root_path}/:username/follow" => "follow/follow#index",
37 | :constraints => {
38 | username: RouteFormat.username,
39 | }
40 |
41 | get "#{root_path}/:username/follow/feed" => "follow/follow#index",
42 | :constraints => {
43 | username: RouteFormat.username,
44 | }
45 |
46 | get "#{root_path}/:username/follow/following" => "follow/follow#list_following",
47 | :constraints => {
48 | username: RouteFormat.username,
49 | }
50 |
51 | get "#{root_path}/:username/follow/followers" => "follow/follow#list_followers",
52 | :constraints => {
53 | username: RouteFormat.username,
54 | }
55 | end
56 | end
57 |
--------------------------------------------------------------------------------
/config/settings.yml:
--------------------------------------------------------------------------------
1 | discourse_follow:
2 | discourse_follow_enabled:
3 | default: false
4 | client: true
5 | follow_show_statistics_on_profile:
6 | default: true
7 | client: true
8 | follow_notifications_enabled:
9 | default: true
10 | client: true
11 | follow_followers_visible:
12 | enum: "FollowPagesVisibility"
13 | default: everyone
14 | follow_following_visible:
15 | enum: "FollowPagesVisibility"
16 | default: everyone
17 | default_notify_me_when_followed:
18 | default: true
19 | default_notify_followed_user_when_followed:
20 | default: true
21 | default_notify_me_when_followed_replies:
22 | default: false
23 | default_notify_me_when_followed_creates_topic:
24 | default: false
25 | default_allow_people_to_follow_me:
26 | default: true
27 |
--------------------------------------------------------------------------------
/db/migrate/20210901115010_create_user_follower.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class CreateUserFollower < ActiveRecord::Migration[6.1]
4 | def change
5 | create_table :user_followers do |t|
6 | t.bigint :user_id, null: false
7 | t.bigint :follower_id, null: false
8 | t.integer :level, null: false
9 |
10 | t.timestamps null: false
11 | end
12 |
13 | add_index :user_followers, %i[user_id follower_id], unique: true
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/db/migrate/20210901135131_migrate_follower_data_from_custom_fields_to_tables.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class MigrateFollowerDataFromCustomFieldsToTables < ActiveRecord::Migration[6.1]
4 | def up
5 | DB.exec <<~SQL
6 | INSERT INTO user_followers (follower_id, user_id, level, updated_at, created_at) (
7 | SELECT
8 | user_id::bigint AS follower_id,
9 | split_part(value, ',', 1)::bigint AS user_id,
10 | (
11 | CASE
12 | WHEN split_part(value, ',', 2)::integer = 0 THEN 3
13 | WHEN split_part(value, ',', 2)::integer = 1 THEN 4
14 | ELSE split_part(value, ',', 2)::integer
15 | END
16 | ) AS level,
17 | updated_at,
18 | created_at
19 | FROM user_custom_fields
20 | WHERE name = 'following' AND TRIM(value) != '' AND user_id >= 1
21 | )
22 | ON CONFLICT DO NOTHING
23 | SQL
24 |
25 | DB.exec <<~SQL
26 | DELETE FROM user_custom_fields WHERE name = 'following' OR name = 'followers'
27 | SQL
28 | end
29 |
30 | def down
31 | DB.exec <<~SQL
32 | INSERT INTO user_custom_fields (user_id, name, value, created_at, updated_at) (
33 | SELECT
34 | follower_id::integer AS user_id,
35 | 'following' AS name,
36 | user_id::text || ',' || level::text AS value,
37 | created_at,
38 | updated_at
39 | FROM user_followers
40 | )
41 | SQL
42 |
43 | DB.exec <<~SQL
44 | INSERT INTO user_custom_fields (user_id, name, value, created_at, updated_at) (
45 | SELECT
46 | user_id::integer AS user_id,
47 | 'followers' AS name,
48 | ARRAY_TO_STRING(ARRAY_AGG(follower_id), ',') AS value,
49 | CURRENT_TIMESTAMP AS created_at,
50 | CURRENT_TIMESTAMP AS updated_at
51 | FROM user_followers
52 | GROUP BY user_id
53 | )
54 | SQL
55 |
56 | DB.exec("DELETE FROM user_followers")
57 | end
58 | end
59 |
--------------------------------------------------------------------------------
/db/migrate/20210920045747_rename_follow_plugin_preference.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class RenameFollowPluginPreference < ActiveRecord::Migration[6.1]
4 | def up
5 | DB.exec <<~SQL
6 | UPDATE user_custom_fields ucf
7 | SET name = 'notify_me_when_followed_creates_topic'
8 | WHERE ucf.name = 'notify_me_when_followed_posts'
9 | SQL
10 | end
11 |
12 | def down
13 | DB.exec <<~SQL
14 | UPDATE user_custom_fields ucf
15 | SET name = 'notify_me_when_followed_posts'
16 | WHERE ucf.name = 'notify_me_when_followed_creates_topic'
17 | SQL
18 | end
19 | end
20 |
--------------------------------------------------------------------------------
/db/migrate/20211004125251_create_follow_user_custom_fields_indices.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class CreateFollowUserCustomFieldsIndices < ActiveRecord::Migration[6.1]
4 | def up
5 | %w[
6 | notify_me_when_followed
7 | notify_followed_user_when_followed
8 | notify_me_when_followed_replies
9 | notify_me_when_followed_creates_topic
10 | allow_people_to_follow_me
11 | ].each do |field|
12 | DB.exec(<<~SQL, field: field)
13 | DELETE FROM user_custom_fields ucf1
14 | USING user_custom_fields ucf2
15 | WHERE ucf1.id != ucf2.id
16 | AND ucf1.name = :field
17 | AND ucf2.name = :field
18 | AND ucf1.user_id = ucf2.user_id
19 | AND ucf1.updated_at < ucf2.updated_at
20 | SQL
21 | add_index(
22 | :user_custom_fields,
23 | %i[name user_id],
24 | name: index_name_for(field),
25 | unique: true,
26 | where: "name = '#{field}'",
27 | )
28 | end
29 | end
30 |
31 | def down
32 | %w[
33 | notify_me_when_followed
34 | notify_followed_user_when_followed
35 | notify_me_when_followed_replies
36 | notify_me_when_followed_creates_topic
37 | allow_people_to_follow_me
38 | ].each do |field|
39 | remove_index(:user_custom_fields, name: index_name_for(field), if_exists: true)
40 | end
41 | end
42 |
43 | private
44 |
45 | def index_name_for(name)
46 | :"idx_user_custom_fields_#{name}"
47 | end
48 | end
49 |
--------------------------------------------------------------------------------
/db/migrate/20211011123651_correct_follow_plugin_site_setting_values.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class CorrectFollowPluginSiteSettingValues < ActiveRecord::Migration[6.1]
4 | def up
5 | DB.exec(<<~SQL)
6 | UPDATE site_settings
7 | SET value = 'no-one'
8 | WHERE name IN ('follow_followers_visible', 'follow_following_visible') AND value = 'none'
9 | SQL
10 | end
11 |
12 | def down
13 | raise ActiveRecord::IrreversibleMigration
14 | end
15 | end
16 |
--------------------------------------------------------------------------------
/db/migrate/20220617173420_enable_follow_if_already_installed.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class EnableFollowIfAlreadyInstalled < ActiveRecord::Migration[6.1]
4 | def up
5 | follow_installed_at = DB.query_single(<<~SQL)&.first
6 | SELECT created_at FROM schema_migration_details WHERE version='20210901115010'
7 | SQL
8 |
9 | if follow_installed_at && follow_installed_at < 1.hour.ago
10 | # The plugin was installed before we changed it to be disabled-by-default
11 | # Therefore, if there is no existing database value, enable the plugin
12 | execute <<~SQL
13 | INSERT INTO site_settings(name, data_type, value, created_at, updated_at)
14 | VALUES('discourse_follow_enabled', 5, 't', NOW(), NOW())
15 | ON CONFLICT (name) DO NOTHING
16 | SQL
17 | end
18 | end
19 |
20 | def down
21 | # do nothing
22 | end
23 | end
24 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import DiscourseRecommended from "@discourse/lint-configs/eslint";
2 |
3 | export default [...DiscourseRecommended];
4 |
--------------------------------------------------------------------------------
/lib/follow/engine.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | module ::Follow
4 | class Engine < ::Rails::Engine
5 | engine_name "follow"
6 | isolate_namespace Follow
7 | config.autoload_paths << File.join(config.root, "lib")
8 | end
9 | end
10 |
--------------------------------------------------------------------------------
/lib/follow/notification.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class Follow::Notification
4 | def self.levels
5 | @levels ||= Enum.new(regular: 1, watching: 3, watching_first_post: 4)
6 | end
7 | end
8 |
--------------------------------------------------------------------------------
/lib/follow/notification_handler.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class Follow::NotificationHandler
4 | attr_reader :post
5 |
6 | def initialize(post, notified_users)
7 | @post = post
8 | @notified_users = notified_users
9 | end
10 |
11 | def handle
12 | return if post.post_type == Post.types[:whisper] && post.action_code.present?
13 | return if [Post.types[:regular], Post.types[:whisper]].exclude?(post.post_type)
14 | return if !SiteSetting.follow_notifications_enabled
15 | return if !post.user.allow_people_to_follow_me
16 | return if post.user.user_option&.hide_profile
17 |
18 | topic = post.topic
19 | return if !topic || topic.private_message?
20 |
21 | poster_followers.each do |follower|
22 | next if follower.bot? || follower.staged?
23 | next if topic_muted_by?(follower)
24 |
25 | if post.post_number == 1
26 | next if !follower.notify_me_when_followed_creates_topic
27 | else
28 | next if !follower.notify_me_when_followed_replies
29 | end
30 |
31 | guardian = Guardian.new(follower)
32 | next if !guardian.can_see?(post)
33 |
34 | if post.post_number == 1
35 | notification_type = Notification.types[:following_created_topic]
36 | else
37 | notification_type = Notification.types[:following_replied]
38 | end
39 |
40 | # sometimes the `post_alerter_after_save_post` event can be fired twice
41 | # for the same post resulting (incorrectly) in merged or double
42 | # notifications. skip if we've already created a notification for this
43 | # post
44 | next if already_notified?(follower, notification_type)
45 |
46 | # if the user has received a notification for the post because they're
47 | # watching the topic, category or a tag, then delete the notification so
48 | # they don't end up with double notifications.
49 | #
50 | # the `notified` array provided by the event includes users who are
51 | # notified due to a mention (directly or via a group), quote, link to a
52 | # post of theirs, or reply to them directly. It does not include users
53 | # who are notified because they're watching the topic, category or a tag.
54 | follower
55 | .notifications
56 | .where(
57 | topic_id: topic.id,
58 | notification_type: [Notification.types[:posted], Notification.types[:replied]],
59 | post_number: post.post_number,
60 | )
61 | .destroy_all
62 |
63 | # delete all existing follow notifications for the topic because we'll
64 | # collapse them
65 | follower
66 | .notifications
67 | .where(
68 | topic_id: topic.id,
69 | notification_type: [
70 | Notification.types[:following_replied],
71 | Notification.types[:following_created_topic],
72 | ],
73 | )
74 | .destroy_all
75 |
76 | posts_by_following =
77 | topic
78 | .posts
79 | .secured(guardian)
80 | .where(user_id: follower.following.pluck(:id))
81 | .where(<<~SQL, follower_id: follower.id, topic_id: topic.id)
82 | post_number > COALESCE((
83 | SELECT last_read_post_number FROM topic_users tu
84 | WHERE tu.user_id = :follower_id AND tu.topic_id = :topic_id
85 | ), 0)
86 | SQL
87 |
88 | count = posts_by_following.count
89 | first_unread_post = posts_by_following.order("post_number").first || post
90 |
91 | display_username = first_unread_post.user.username
92 | if count > 1
93 | I18n.with_locale(follower.effective_locale) do
94 | display_username = I18n.t("embed.replies", count: count)
95 | end
96 | end
97 |
98 | notification_data = {
99 | topic_title: topic.title,
100 | original_post_id: post.id,
101 | original_post_type: post.post_type,
102 | display_username: display_username,
103 | }
104 |
105 | notification =
106 | follower.notifications.create!(
107 | notification_type: notification_type,
108 | topic_id: topic.id,
109 | post_number: first_unread_post.post_number,
110 | data: notification_data.to_json,
111 | )
112 | @notified_users << follower
113 |
114 | if notification&.id && !follower.suspended?
115 | PostAlerter.create_notification_alert(
116 | user: follower,
117 | post: post,
118 | notification_type: notification_type,
119 | )
120 | end
121 | end
122 | end
123 |
124 | private
125 |
126 | def topic_muted_by?(user)
127 | TopicUser.exists?(
128 | topic_id: post.topic.id,
129 | user_id: user.id,
130 | notification_level: TopicUser.notification_levels[:muted],
131 | )
132 | end
133 |
134 | def already_notified?(user, notification_type)
135 | Notification.exists?(
136 | topic_id: post.topic.id,
137 | user_id: user.id,
138 | notification_type: notification_type,
139 | post_number: post.post_number,
140 | )
141 | end
142 |
143 | def poster_followers
144 | followers = post.user.followers
145 | if @notified_users.present?
146 | followers = followers.where("users.id NOT IN (?)", @notified_users.map(&:id))
147 | end
148 | followers
149 | end
150 | end
151 |
--------------------------------------------------------------------------------
/lib/follow/updater.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | class Follow::Updater
4 | def initialize(follower, target)
5 | @follower = follower
6 | @target = target
7 | end
8 |
9 | def watch_follow
10 | follow(Follow::Notification.levels[:watching])
11 | end
12 |
13 | def unfollow
14 | UserFollower.where(follower_id: @follower.id, user_id: @target.id).destroy_all
15 | end
16 |
17 | private
18 |
19 | def follow(notification_level)
20 | if @target.id == @follower.id
21 | raise Discourse::InvalidAccess.new(
22 | nil,
23 | nil,
24 | custom_message: "follow.user_cannot_follow_themself",
25 | )
26 | end
27 |
28 | %i[bot staged suspended].each do |status|
29 | if @target.public_send(:"#{status}?")
30 | raise Discourse::InvalidAccess.new(
31 | nil,
32 | nil,
33 | custom_message: "follow.user_cannot_follow_#{status}",
34 | )
35 | end
36 | end
37 |
38 | if !Follow::Notification.levels.invert.key?(notification_level)
39 | raise Discourse::InvalidParameters.new(
40 | I18n.t("follow.invalid_notification_level", level: notification_level.inspect),
41 | )
42 | end
43 |
44 | if !@target.allow_people_to_follow_me
45 | raise Discourse::InvalidAccess.new(
46 | nil,
47 | nil,
48 | custom_message: "follow.user_does_not_allow_follow",
49 | custom_message_params: {
50 | username: @target.username,
51 | },
52 | )
53 | end
54 |
55 | if @target.user_option&.hide_profile
56 | raise Discourse::InvalidAccess.new(
57 | nil,
58 | nil,
59 | custom_message: "follow.user_does_not_allow_follow",
60 | custom_message_params: {
61 | username: @target.username,
62 | },
63 | )
64 | end
65 |
66 | relation = UserFollower.find_or_initialize_by(user_id: @target.id, follower_id: @follower.id)
67 | relation.level = notification_level
68 | relation.save!
69 |
70 | payload = {
71 | notification_type: Notification.types[:following],
72 | data: { display_username: @follower.username }.to_json,
73 | }
74 | send_notification(payload) if should_notify?(payload)
75 |
76 | relation
77 | end
78 |
79 | def should_notify?(payload)
80 | SiteSetting.follow_notifications_enabled && @follower.notify_followed_user_when_followed &&
81 | @target.notify_me_when_followed && !notification_sent_recently(payload)
82 | end
83 |
84 | def send_notification(payload)
85 | @target.notifications.create!(payload)
86 | end
87 |
88 | def notification_sent_recently(payload)
89 | @target.notifications.where(payload).where("created_at >= ?", 1.day.ago).exists?
90 | end
91 | end
92 |
--------------------------------------------------------------------------------
/lib/follow/user_extension.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | module Follow::UserExtension
4 | def self.prepended(base)
5 | base.has_many :follower_relations, class_name: "UserFollower", dependent: :delete_all
6 | base.has_many :followers,
7 | ->(user) do
8 | if !user.allow_people_to_follow_me || user.user_option&.hide_profile
9 | where("1=0")
10 | end
11 | end,
12 | through: :follower_relations,
13 | source: :follower_user
14 |
15 | base.has_many :following_relations,
16 | class_name: "UserFollower",
17 | foreign_key: :follower_id,
18 | dependent: :delete_all
19 | base.has_many :following,
20 | -> { UserFollower.filter_opted_out_users(self) },
21 | through: :following_relations,
22 | source: :followed_user
23 | end
24 | end
25 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "devDependencies": {
4 | "@discourse/lint-configs": "2.23.0",
5 | "ember-template-lint": "7.7.0",
6 | "eslint": "9.28.0",
7 | "prettier": "3.5.3",
8 | "stylelint": "16.20.0"
9 | },
10 | "engines": {
11 | "node": ">= 22",
12 | "npm": "please-use-pnpm",
13 | "yarn": "please-use-pnpm",
14 | "pnpm": "9.x"
15 | },
16 | "packageManager": "pnpm@9.15.5"
17 | }
18 |
--------------------------------------------------------------------------------
/plugin.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | # name: discourse-follow
4 | # about: Allows users to follow other users, list the latest topics involving them, and receive notifications when they post.
5 | # meta_topic_id: 110579
6 | # version: 1.0
7 | # authors: Angus McLeod, Robert Barrow, CDCK Inc
8 | # url: https://github.com/discourse/discourse-follow
9 |
10 | enabled_site_setting :discourse_follow_enabled
11 |
12 | register_asset "stylesheets/common/follow.scss"
13 |
14 | register_svg_icon "discourse-follow-new-reply"
15 | register_svg_icon "discourse-follow-new-follower"
16 | register_svg_icon "discourse-follow-new-topic"
17 |
18 | module ::Follow
19 | PLUGIN_NAME = "discourse-follow"
20 | end
21 |
22 | require_relative "lib/follow/engine"
23 |
24 | after_initialize do
25 | Notification.types[:following] = 800
26 | Notification.types[:following_created_topic] = 801
27 | Notification.types[:following_replied] = 802
28 |
29 | reloadable_patch { |plugin| User.prepend(Follow::UserExtension) }
30 |
31 | add_to_serializer(:user, :can_see_following) do
32 | FollowPagesVisibility.can_see_following_page?(user: scope.current_user, target_user: user)
33 | end
34 | add_to_serializer(:user, :can_see_followers) do
35 | FollowPagesVisibility.can_see_followers_page?(user: scope.current_user, target_user: user)
36 | end
37 | add_to_serializer(:user, :can_see_network_tab) do
38 | user_is_current_user || can_see_following || can_see_followers
39 | end
40 |
41 | # UserSerializer in core inherits from UserCardSerializer.
42 | # we don't need to duplicate these attrs for UserSerializer.
43 | #
44 | # the `!options.key?(:each_serializer)` check is a temporary hack to exclude
45 | # the attributes we add here from the user card serializer when multiple user
46 | # objects are being serialized (e.g. the /user-cards.json route in core). If
47 | # we don't do this, we end up introducing a horrible 3N+1 on the
48 | # /user-cards.json route and it's not easily fixable.
49 | # when serializing a single user object, the options of the serializer
50 | # doesn't have a `each_serializer` key.
51 | add_to_serializer(:user_card, :can_follow) do
52 | !options.key?(:each_serializer) && scope.current_user.present? && user.allow_people_to_follow_me
53 | end
54 |
55 | add_to_serializer(:user_card, :is_followed) do
56 | !options.key?(:each_serializer) && scope.current_user.present? &&
57 | scope.current_user.following.where(id: user.id).exists?
58 | end
59 |
60 | add_to_serializer(
61 | :user_card,
62 | :total_followers,
63 | include_condition: -> do
64 | !options.key?(:each_serializer) && SiteSetting.discourse_follow_enabled &&
65 | SiteSetting.follow_show_statistics_on_profile &&
66 | FollowPagesVisibility.can_see_followers_page?(user: scope.current_user, target_user: object)
67 | end,
68 | ) { object.followers.count }
69 |
70 | add_to_serializer(
71 | :user_card,
72 | :total_following,
73 | include_condition: -> do
74 | !options.key?(:each_serializer) && SiteSetting.discourse_follow_enabled &&
75 | SiteSetting.follow_show_statistics_on_profile &&
76 | FollowPagesVisibility.can_see_following_page?(user: scope.current_user, target_user: object)
77 | end,
78 | ) { object.following.count }
79 |
80 | %i[
81 | notify_me_when_followed
82 | notify_followed_user_when_followed
83 | notify_me_when_followed_replies
84 | notify_me_when_followed_creates_topic
85 | allow_people_to_follow_me
86 | ].each do |field|
87 | add_to_class(:user, field) do
88 | v = custom_fields[field]
89 | if !v.nil?
90 | HasCustomFields::Helpers::CUSTOM_FIELD_TRUE.include?(v.to_s.downcase)
91 | else
92 | SiteSetting.public_send(:"default_#{field}")
93 | end
94 | end
95 |
96 | User.register_custom_field_type(field, :boolean)
97 | DiscoursePluginRegistry.serialized_current_user_fields << field
98 | add_to_serializer(:user, field) { object.public_send(field) }
99 | register_editable_user_custom_field(field)
100 | end
101 |
102 | on(:post_alerter_before_post) do |post, new_record, notified|
103 | Follow::NotificationHandler.new(post, notified).handle if new_record
104 | end
105 |
106 | # TODO(2022-08-30): Remove when post_alerter_before_post is available
107 | on(:post_alerter_after_save_post) do |post, new_record, notified|
108 | next if !new_record
109 | Follow::NotificationHandler.new(post, notified).handle
110 | end
111 |
112 | filter_following_topics = ->(scope, username, guardian) do
113 | user = User.find_by(username: username)
114 |
115 | next scope if user.nil?
116 | next scope.none if user.id != guardian.user.id && !guardian.user.staff?
117 |
118 | topic_ids = UserFollower.topics_for(user, current_user: guardian.user).pluck(:id)
119 |
120 | scope.where("topics.id IN (?)", topic_ids)
121 | end
122 |
123 | add_filter_custom_filter("following-feed", &filter_following_topics)
124 | end
125 |
--------------------------------------------------------------------------------
/spec/integration/user_cards_route_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "rails_helper"
4 |
5 | describe "Attrs added by the plugin to the UserCardSerializer" do
6 | fab!(:follower) { Fabricate(:user) }
7 | fab!(:followed) { Fabricate(:user) }
8 |
9 | before do
10 | SiteSetting.discourse_follow_enabled = true
11 | Follow::Updater.new(follower, followed).watch_follow
12 | sign_in(follower)
13 | end
14 |
15 | it "do not break the /user-cards.json route" do
16 | get "/user-cards.json", params: { user_ids: [followed.id].join(",") }
17 | expect(response.status).to eq(200)
18 | end
19 | end
20 |
--------------------------------------------------------------------------------
/spec/integration/user_destroyer_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "rails_helper"
4 |
5 | describe "User destroyer with the follow plugin" do
6 | let(:user_a) { Fabricate(:user) }
7 | let(:user_b) { Fabricate(:user) }
8 | let(:user_c) { Fabricate(:user) }
9 |
10 | before do
11 | SiteSetting.discourse_follow_enabled = true
12 | Jobs.run_immediately!
13 | Follow::Updater.new(user_a, user_b).watch_follow
14 | Follow::Updater.new(user_c, user_a).watch_follow
15 | end
16 |
17 | it "deletes all the follower and following relationships of the user being deleted" do
18 | UserDestroyer.new(Discourse.system_user).destroy(user_a)
19 | user_b.reload
20 | user_c.reload
21 | expect(user_b.id).to be_present
22 | expect(user_c.id).to be_present
23 | expect(user_b.follower_relations.count).to eq(0)
24 | expect(user_c.following_relations.count).to eq(0)
25 | end
26 | end
27 |
--------------------------------------------------------------------------------
/spec/models/user_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "rails_helper"
4 |
5 | describe User do
6 | fab!(:followed1) { Fabricate(:user) }
7 | fab!(:followed2) { Fabricate(:user) }
8 | fab!(:follower1) { Fabricate(:user) }
9 | fab!(:follower2) { Fabricate(:user) }
10 |
11 | before do
12 | SiteSetting.discourse_follow_enabled = true
13 | [followed1, followed2].each do |followed|
14 | [follower1, follower2].each do |follower|
15 | Follow::Updater.new(follower, followed).watch_follow
16 | end
17 | end
18 | end
19 |
20 | describe "#followers" do
21 | it "returns followers" do
22 | expect(followed1.followers.pluck(:id)).to contain_exactly(follower1.id, follower2.id)
23 | expect(followed2.followers.pluck(:id)).to contain_exactly(follower1.id, follower2.id)
24 |
25 | expect(follower1.followers.pluck(:id)).to be_empty
26 | expect(follower2.followers.pluck(:id)).to be_empty
27 | end
28 |
29 | it "returns empty relation if the user has disabled follows" do
30 | followed1.custom_fields["allow_people_to_follow_me"] = false
31 | followed1.save!
32 | expect(followed1.followers.pluck(:id)).to be_empty
33 | expect(followed2.followers.pluck(:id)).to contain_exactly(follower1.id, follower2.id)
34 | end
35 |
36 | it "returns empty relation if the user has hidden their profile" do
37 | followed1.user_option.update!(hide_profile: true)
38 | expect(followed1.followers.pluck(:id)).to be_empty
39 | expect(followed2.followers.pluck(:id)).to contain_exactly(follower1.id, follower2.id)
40 | end
41 |
42 | it "returns empty relation if the default_allow_people_to_follow_me setting " \
43 | "is false and the user has no explicit preference" do
44 | SiteSetting.default_allow_people_to_follow_me = false
45 | expect(followed1.followers.pluck(:id)).to be_empty
46 | expect(followed2.followers.pluck(:id)).to be_empty
47 |
48 | followed1.custom_fields["allow_people_to_follow_me"] = true
49 | followed1.save!
50 | expect(followed1.followers.pluck(:id)).to contain_exactly(follower1.id, follower2.id)
51 | expect(followed2.followers.pluck(:id)).to be_empty
52 | end
53 | end
54 |
55 | describe "#following" do
56 | it "returns followed users" do
57 | expect(follower1.following.pluck(:id)).to contain_exactly(followed1.id, followed2.id)
58 | expect(follower2.following.pluck(:id)).to contain_exactly(followed1.id, followed2.id)
59 |
60 | expect(followed1.following.pluck(:id)).to be_empty
61 | expect(followed2.following.pluck(:id)).to be_empty
62 | end
63 |
64 | it "excludes users who have disabled follows" do
65 | followed1.custom_fields["allow_people_to_follow_me"] = false
66 | followed1.save!
67 |
68 | expect(follower1.following.pluck(:id)).to contain_exactly(followed2.id)
69 | expect(follower2.following.pluck(:id)).to contain_exactly(followed2.id)
70 | end
71 |
72 | it "excludes users who have hidden their profile" do
73 | followed1.user_option.update!(hide_profile: true)
74 |
75 | expect(follower1.following.pluck(:id)).to contain_exactly(followed2.id)
76 | expect(follower2.following.pluck(:id)).to contain_exactly(followed2.id)
77 | end
78 |
79 | it "excludes users who do not have an explicit preference and the " \
80 | "default_allow_people_to_follow_me setting is false" do
81 | SiteSetting.default_allow_people_to_follow_me = false
82 | expect(follower1.following.pluck(:id)).to be_empty
83 | expect(follower2.following.pluck(:id)).to be_empty
84 |
85 | followed1.custom_fields["allow_people_to_follow_me"] = true
86 | followed1.save!
87 |
88 | expect(follower1.following.pluck(:id)).to contain_exactly(followed1.id)
89 | expect(follower2.following.pluck(:id)).to contain_exactly(followed1.id)
90 | end
91 | end
92 | end
93 |
--------------------------------------------------------------------------------
/spec/serializers/user_card_serializer_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "rails_helper"
4 |
5 | describe UserCardSerializer do
6 | fab!(:follower) { Fabricate(:user) }
7 | fab!(:followed) { Fabricate(:user) }
8 |
9 | before do
10 | SiteSetting.discourse_follow_enabled = true
11 | ::Follow::Updater.new(follower, followed).watch_follow
12 | end
13 |
14 | def get_serializer(user, current_user:)
15 | UserCardSerializer.new(user, scope: Guardian.new(current_user), root: false).as_json
16 | end
17 |
18 | context "when no settings are restrictive" do
19 | before do
20 | SiteSetting.discourse_follow_enabled = true
21 | SiteSetting.follow_show_statistics_on_profile = true
22 | SiteSetting.follow_followers_visible = FollowPagesVisibility::EVERYONE
23 | SiteSetting.follow_following_visible = FollowPagesVisibility::EVERYONE
24 | end
25 |
26 | it "is_followed field is included" do
27 | expect(get_serializer(followed, current_user: follower)[:is_followed]).to eq(true)
28 | end
29 |
30 | it "total_followers field is included" do
31 | expect(get_serializer(followed, current_user: nil)[:total_followers]).to eq(1)
32 | end
33 |
34 | it "total_following field is included" do
35 | expect(get_serializer(follower, current_user: nil)[:total_following]).to eq(1)
36 | end
37 | end
38 |
39 | context "when discourse_follow_enabled setting is off" do
40 | before { SiteSetting.discourse_follow_enabled = false }
41 |
42 | it "is_followed field is not included" do
43 | expect(get_serializer(followed, current_user: follower)).not_to include(:is_followed)
44 | end
45 |
46 | it "total_followers field is not included" do
47 | expect(get_serializer(followed, current_user: followed)).not_to include(:total_followers)
48 | end
49 |
50 | it "total_following field is not included" do
51 | expect(get_serializer(follower, current_user: follower)).not_to include(:total_following)
52 | end
53 | end
54 |
55 | context "when follow_show_statistics_on_profile setting is off" do
56 | before { SiteSetting.follow_show_statistics_on_profile = false }
57 |
58 | it "is_followed field is included" do
59 | expect(get_serializer(followed, current_user: follower)[:is_followed]).to eq(true)
60 | end
61 |
62 | it "total_followers field is not included" do
63 | expect(get_serializer(followed, current_user: followed)).not_to include(:total_followers)
64 | end
65 |
66 | it "total_following field is not included" do
67 | expect(get_serializer(follower, current_user: follower)).not_to include(:total_following)
68 | end
69 | end
70 |
71 | context "when follow_followers_visible does not allow anyone" do
72 | before { SiteSetting.follow_followers_visible = FollowPagesVisibility::NO_ONE }
73 |
74 | it "total_followers field is not included" do
75 | expect(get_serializer(followed, current_user: followed)).not_to include(:total_followers)
76 | end
77 |
78 | it "total_following field is included" do
79 | expect(get_serializer(follower, current_user: follower)[:total_following]).to eq(1)
80 | end
81 | end
82 |
83 | context "when follow_following_visible does not allow anyone" do
84 | before { SiteSetting.follow_following_visible = FollowPagesVisibility::NO_ONE }
85 |
86 | it "total_followers field is included" do
87 | expect(get_serializer(followed, current_user: followed)[:total_followers]).to eq(1)
88 | end
89 |
90 | it "total_following field is not included" do
91 | expect(get_serializer(follower, current_user: follower)).not_to include(:total_following)
92 | end
93 | end
94 |
95 | context "when there is no current user" do
96 | it "is_followed is false" do
97 | expect(get_serializer(followed, current_user: nil)[:is_followed]).to eq(false)
98 | end
99 |
100 | it "can_follow is false" do
101 | expect(get_serializer(followed, current_user: nil)[:can_follow]).to eq(false)
102 | end
103 | end
104 |
105 | context "when there is current user" do
106 | it "is_followed is true if current user is following the user" do
107 | expect(get_serializer(followed, current_user: follower)[:is_followed]).to eq(true)
108 | end
109 |
110 | it "is_followed is false if current user is not following the user" do
111 | expect(get_serializer(followed, current_user: Fabricate(:user))[:is_followed]).to eq(false)
112 | end
113 |
114 | it "can_follow is true" do
115 | expect(get_serializer(followed, current_user: Fabricate(:user))[:can_follow]).to eq(true)
116 | end
117 |
118 | it "can_follow is false if user disables follows" do
119 | followed.custom_fields["allow_people_to_follow_me"] = false
120 | followed.save!
121 | expect(get_serializer(followed, current_user: follower)[:can_follow]).to eq(false)
122 | expect(get_serializer(followed, current_user: Fabricate(:user))[:can_follow]).to eq(false)
123 | expect(get_serializer(followed, current_user: nil)[:can_follow]).to eq(false)
124 | end
125 | end
126 | end
127 |
--------------------------------------------------------------------------------
/spec/system/core_features_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | RSpec.describe "Core features", type: :system do
4 | before { enable_current_plugin }
5 |
6 | it_behaves_like "having working core features"
7 | end
8 |
--------------------------------------------------------------------------------
/spec/system/follow_user_pages_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | RSpec.describe "Follow user pages", type: :system, js: true do
4 | fab!(:user1) { Fabricate(:user) }
5 | fab!(:user2) { Fabricate(:user) }
6 | fab!(:user3) { Fabricate(:user) }
7 | fab!(:user2_post) { Fabricate(:post, user: user2) }
8 | let(:everyone_group) { Group[:everyone] }
9 |
10 | before do
11 | SiteSetting.discourse_follow_enabled = true
12 | SiteSetting.follow_followers_visible = FollowPagesVisibility::EVERYONE
13 | SiteSetting.follow_following_visible = FollowPagesVisibility::EVERYONE
14 |
15 | Follow::Updater.new(user1, user2).watch_follow
16 | Follow::Updater.new(user3, user1).watch_follow
17 | end
18 |
19 | before { sign_in(user1) }
20 |
21 | it "should allow user to navigate to the follow user profile pages" do
22 | follow_page = PageObjects::Pages::Follow.new(user1)
23 | follow_page.visit
24 |
25 | expect(follow_page).to have_following_topic(user2_post.topic)
26 |
27 | follow_page.click_on_followers
28 |
29 | expect(follow_page).to have_follower(user3)
30 |
31 | follow_page.click_on_following
32 |
33 | expect(follow_page).to have_following(user2)
34 | end
35 | end
36 |
--------------------------------------------------------------------------------
/spec/system/follow_user_preferences_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | RSpec.describe "Follow user preferences", type: :system, js: true do
4 | fab!(:user)
5 |
6 | before do
7 | SiteSetting.discourse_follow_enabled = true
8 | sign_in(user)
9 | end
10 |
11 | it "should allow user to modify preferences" do
12 | visit("/u/#{user.username}/preferences/notifications")
13 |
14 | expect(user.custom_fields["allow_people_to_follow_me"]).to eq(nil)
15 |
16 | checkbox1 = page.find(".pref-allow-people-to-follow-me input")
17 | expect(checkbox1).to be_checked
18 |
19 | checkbox1.click
20 | page.find(".save-changes").click
21 | expect(page).to have_content(I18n.t("js.saved"))
22 |
23 | # Navigate away
24 | visit("/latest")
25 |
26 | # Come back to user preferences and check that the checkbox is now unchecked
27 | visit("/u/#{user.username}/preferences/notifications")
28 |
29 | checkbox1 = page.find(".pref-allow-people-to-follow-me input")
30 | expect(checkbox1).not_to be_checked
31 |
32 | expect(user.reload.custom_fields["allow_people_to_follow_me"]).to eq("false")
33 | end
34 | end
35 |
--------------------------------------------------------------------------------
/spec/system/page_objects/pages/follow.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | module PageObjects
4 | module Pages
5 | class Follow < PageObjects::Pages::Base
6 | CONTENT_CLASS = ".user-follows-tab"
7 |
8 | def initialize(user)
9 | super()
10 | @user = user
11 | end
12 |
13 | def visit
14 | page.visit("/u/#{@user.username}")
15 | click_on I18n.t("js.user.follow_nav")
16 | self
17 | end
18 |
19 | def click_on_followers
20 | click_on I18n.t("js.user.followers.label")
21 | self
22 | end
23 |
24 | def click_on_following
25 | click_on I18n.t("js.user.following.label")
26 | self
27 | end
28 |
29 | def has_follower?(user)
30 | within(CONTENT_CLASS) { page.has_content?(user.username) }
31 | end
32 | alias_method :has_following?, :has_follower?
33 |
34 | def has_following_topic?(topic)
35 | within(CONTENT_CLASS) { page.has_content?(topic.title) }
36 | end
37 | end
38 | end
39 | end
40 |
--------------------------------------------------------------------------------
/stylelint.config.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | extends: ["@discourse/lint-configs/stylelint"],
3 | };
4 |
--------------------------------------------------------------------------------
/svg-icons/plugin-icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/test/javascripts/acceptance/follow-notification-test.js:
--------------------------------------------------------------------------------
1 | import { visit } from "@ember/test-helpers";
2 | import { test } from "qunit";
3 | import { acceptance } from "discourse/tests/helpers/qunit-helpers";
4 | import { i18n } from "discourse-i18n";
5 |
6 | acceptance("Discourse Follow - notification", function (needs) {
7 | needs.user();
8 |
9 | needs.pretender((server, helper) => {
10 | server.get("/notifications", () => {
11 | return helper.response({
12 | notifications: [
13 | {
14 | id: 25201,
15 | user_id: 1,
16 | external_id: "1",
17 | notification_type: 800,
18 | read: false,
19 | high_priority: false,
20 | slug: null,
21 | data: {
22 | display_username: "steaky",
23 | },
24 | created_at: "2023-12-06 21:39:57.412408",
25 | },
26 | ],
27 | total_rows_notifications: 1,
28 | });
29 | });
30 | });
31 |
32 | test("shows follow notification", async (assert) => {
33 | await visit("/u/eviltrout/notifications");
34 |
35 | const notification = document.querySelector(
36 | ".user-notifications-list .notification"
37 | );
38 |
39 | assert.strictEqual(
40 | notification.querySelector(".item-label").textContent.trim(),
41 | "steaky",
42 | "Renders username"
43 | );
44 |
45 | assert.strictEqual(
46 | notification.querySelector(".item-description").textContent.trim(),
47 | "has started following you.",
48 | "Renders description"
49 | );
50 |
51 | assert.ok(
52 | notification.querySelector("a").href.includes("/u/steaky"),
53 | "leads to the user's profile"
54 | );
55 |
56 | assert.strictEqual(
57 | notification.querySelector("a").title,
58 | i18n("notifications.titles.following"),
59 | "displays the right title"
60 | );
61 | });
62 | });
63 |
--------------------------------------------------------------------------------
/translator.yml:
--------------------------------------------------------------------------------
1 | # Configuration file for discourse-translator-bot
2 |
3 | files:
4 | - source_path: config/locales/client.en.yml
5 | destination_path: client.yml
6 | - source_path: config/locales/server.en.yml
7 | destination_path: server.yml
8 |
--------------------------------------------------------------------------------