diff --git a/public/language/ar/error.json b/public/language/ar/error.json index e4ad7c3439..5459769ed7 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/ar/flags.json b/public/language/ar/flags.json index 1611570340..68de95b4e4 100644 --- a/public/language/ar/flags.json +++ b/public/language/ar/flags.json @@ -1,5 +1,6 @@ { "state": "الحالة", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "تحديث", "updated": "تم التحديث", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 9a73a61078..a1e965cc9a 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Тази публикация вече е докладвана от други хора", "user-flagged-too-many-times": "Този потребител вече е докладван от други хора", "cant-flag-privileged": "Не можете да докладвате профилите или съдържанието от потребители с по-високи правомощия (модератори, глобални модератори, администратори)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Не можете да гласувате за собствената си публикация", "too-many-upvotes-today": "Можете да гласувате положително не повече от %1 пъти на ден", "too-many-upvotes-today-user": "Можете да гласувате положително за потребител не повече от %1 пъти на ден", diff --git a/public/language/bg/flags.json b/public/language/bg/flags.json index ad6b4573a1..f5ac7c2112 100644 --- a/public/language/bg/flags.json +++ b/public/language/bg/flags.json @@ -1,5 +1,6 @@ { "state": "Състояние", + "report": "Report", "reports": "Доклади", "first-reported": "Първо докладване", "no-flags": "Ура! Няма намерени доклади.", @@ -8,6 +9,8 @@ "update": "Обновяване", "updated": "Обновено", "resolved": "Разрешен", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Съдържанието, за което се отнася този доклад, е било изтрито и вече не е налично.", "target-aboutme-empty": "Този потребител не е попълнил нищо в секцията за себе си.", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 1ef9673a6c..c2e704fb2d 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/bn/flags.json b/public/language/bn/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/bn/flags.json +++ b/public/language/bn/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index a328f7bbe5..711b99ee13 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "U svého vlastního příspěvku nemůžete hlasovat", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/cs/flags.json b/public/language/cs/flags.json index f518a282d5..04f13634b9 100644 --- a/public/language/cs/flags.json +++ b/public/language/cs/flags.json @@ -1,5 +1,6 @@ { "state": "Stav", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hurá, žádné označení.", @@ -8,6 +9,8 @@ "update": "Aktualizovat", "updated": "Aktualizováno", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Obsah, na který se toto označení vztahuje, byl vymazán a již není k dispozici.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/da/error.json b/public/language/da/error.json index 9ec2f6ea65..a84a6bb169 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/da/flags.json b/public/language/da/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/da/flags.json +++ b/public/language/da/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/de/error.json b/public/language/de/error.json index 61fc0b5c7a..2715bfc1e8 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Dieser Beitrag wurde bereits von anderen Benutzern gemeldet", "user-flagged-too-many-times": "Dieser Benutzer wurde bereits von anderen Benutzern gemeldet", "cant-flag-privileged": "Sie dürfen die Profile oder Inhalte von privilegierten Benutzern (Moderatoren/Globalmoderatoren/Admins) nicht kennzeichnen.", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Du kannst deine eigenen Beiträge nicht bewerten", "too-many-upvotes-today": "Du kannst nur %1 Mal pro Tag upvoten", "too-many-upvotes-today-user": "Du kannst einen Benutzer nur %1 Mal am Tag positiv bewerten", diff --git a/public/language/de/flags.json b/public/language/de/flags.json index 66b6c83d38..1089bc34c3 100644 --- a/public/language/de/flags.json +++ b/public/language/de/flags.json @@ -1,5 +1,6 @@ { "state": "Zustand", + "report": "Report", "reports": "Reports", "first-reported": "Zuerst gemeldet", "no-flags": "Hurra! Keine Meldungen gefunden.", @@ -8,6 +9,8 @@ "update": "Aktualisieren", "updated": "Aktualisiert", "resolved": "Gelöst", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Der Inhalt auf den diese Meldung hingewiesen hat, wurde gelöscht und ist nicht mehr verfügbar.", "target-aboutme-empty": "Dieser Benutzer hat kein \"Über mich\" gesetzt.", diff --git a/public/language/el/error.json b/public/language/el/error.json index cc68d2bc2a..1ada023f90 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/el/flags.json b/public/language/el/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/el/flags.json +++ b/public/language/el/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index af0b72e990..a01bdb473a 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -211,6 +211,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/en-GB/flags.json +++ b/public/language/en-GB/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index f19e8ad0fa..9836084180 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/en-US/flags.json b/public/language/en-US/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/en-US/flags.json +++ b/public/language/en-US/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index f19e8ad0fa..9836084180 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/en-x-pirate/flags.json b/public/language/en-x-pirate/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/en-x-pirate/flags.json +++ b/public/language/en-x-pirate/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/es/error.json b/public/language/es/error.json index 36a5027a7a..b6a00299a1 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "No puedes votar en tu propio mensaje", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/es/flags.json b/public/language/es/flags.json index 513512cf2c..7abed4fbf4 100644 --- a/public/language/es/flags.json +++ b/public/language/es/flags.json @@ -1,5 +1,6 @@ { "state": "Estado", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Yeah! No se encontraron indicadores", @@ -8,6 +9,8 @@ "update": "Actualizar", "updated": "Actualizado", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "El contenido al que se refiere este indicador ha sido purgado y ya no está disponible.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/et/error.json b/public/language/et/error.json index d2197b6a5b..92b414b328 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/et/flags.json b/public/language/et/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/et/flags.json +++ b/public/language/et/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index d22543e701..582befbbd0 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "این پست قبلا توسط دیگر کاربران گزارش شده", "user-flagged-too-many-times": "این کاربر توسط دیگر کاربران گزارش شده", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "شما نمی توانید به پست خود رای بدهید", "too-many-upvotes-today": "شما فقط می توانید %1 بار در روز رأی مثبت بدهید", "too-many-upvotes-today-user": "به هر کاربر فقط %1 بار در روز می‌تولنید رأی مثبت بدهید", diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index 8281f06b07..0ad056c4c8 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -1,5 +1,6 @@ { "state": "وضعیت", + "report": "Report", "reports": "گزارش ها", "first-reported": "اولین گزارش", "no-flags": "هووووورا ! هیچ گزارشی یافت نشد.", @@ -8,6 +9,8 @@ "update": "به روزرسانی", "updated": "به روز رسانی شد", "resolved": "حل‌شده ", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "محتوای این گزارش حذف شده است و در دسترس نیست.", "target-aboutme-empty": "این کاربر هیچ "About Me" ننوشته ", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 77063a8a29..84ff43c2a3 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/fi/flags.json b/public/language/fi/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/fi/flags.json +++ b/public/language/fi/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index a2b1b30199..fb4b334a77 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Ce message a déjà été signalé par d'autres", "user-flagged-too-many-times": "Cet utilisateur a déjà été signalé par d'autres", "cant-flag-privileged": "Vous n'êtes pas autorisé à signaler les profils ou le contenu des utilisateurs privilégiés (modérateurs / modérateurs globaux / administrateurs)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Vous ne pouvez pas voter sur votre propre message", "too-many-upvotes-today": "Vous ne pouvez voter %1 fois par jour", "too-many-upvotes-today-user": "Vous ne pouvez voter pour un utilisateur %1 fois par jour", diff --git a/public/language/fr/flags.json b/public/language/fr/flags.json index f8227cff1d..acd1c2ae14 100644 --- a/public/language/fr/flags.json +++ b/public/language/fr/flags.json @@ -1,5 +1,6 @@ { "state": "Etat", + "report": "Report", "reports": "Rapports", "first-reported": "Premier rapport", "no-flags": "Excellent ! Aucun signalement trouvé.", @@ -8,6 +9,8 @@ "update": "Mettre à jour", "updated": "Mis à jour", "resolved": "Résolu", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Le rapport pour ce signalement a été supprimé et n'est plus accessible", "target-aboutme-empty": "Cet utilisateur n'a pas de \"À propos de moi\".", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index e04cafe4bc..03b15269b2 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/gl/flags.json b/public/language/gl/flags.json index 1277ad5095..295e7a1f1a 100644 --- a/public/language/gl/flags.json +++ b/public/language/gl/flags.json @@ -1,5 +1,6 @@ { "state": "Estado", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Un licorca, que non hai nada marcado para revisión.", @@ -8,6 +9,8 @@ "update": "Actualizar", "updated": "Actualizado", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "O contido marcado foi purgado e xa non está dispoñible", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/he/error.json b/public/language/he/error.json index 74445a55b1..beb845cd4a 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "התקבל כבר דיווח על פוסט זה.", "user-flagged-too-many-times": "התקבל דיווח על משתמש זה.", "cant-flag-privileged": "לא ניתן לדווח על מנהלים או על תוכן שנכתב על ידי מנהלים.", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "אי אפשר להצביע על פוסט שיצרתם", "too-many-upvotes-today": "ביכולתכם להצביע בעד רק %1 פעמים ביום", "too-many-upvotes-today-user": "ביכולתכם להצביע בעד משתמש מסוים רק %1 פעמים ביום", diff --git a/public/language/he/flags.json b/public/language/he/flags.json index 2cf36fcbe5..0d7fa56fdf 100644 --- a/public/language/he/flags.json +++ b/public/language/he/flags.json @@ -1,5 +1,6 @@ { "state": "מצב", + "report": "Report", "reports": "דיווחים", "first-reported": "דיווח ראשון", "no-flags": "הידד! לא נמצאו דיווחים.", @@ -8,6 +9,8 @@ "update": "עדכון", "updated": "עודכן", "resolved": "הושלם", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "התוכן שסומן נוקה ולא קיים יותר.", "target-aboutme-empty": "למשתמש זה אין \"אודות\" מוגדר.", diff --git a/public/language/hr/error.json b/public/language/hr/error.json index cf17cc8a0a..84af5d8b50 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/hr/flags.json b/public/language/hr/flags.json index e2bee66e5c..467feb9f00 100644 --- a/public/language/hr/flags.json +++ b/public/language/hr/flags.json @@ -1,5 +1,6 @@ { "state": "Stanje", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Huura! Nema pronađenih zastavica.", @@ -8,6 +9,8 @@ "update": "Nadogradnja", "updated": "Nadograđeno", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Sadržaj koji je označen zastavom je odbačen i više nije dostupan.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index bb1825f9c4..448a023ea5 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Ez a bejegyzés már meg lett jelölve egy másik felhasználó által", "user-flagged-too-many-times": "Ez a felhasználó már meg lett jelölve egy másik felhasználó által", "cant-flag-privileged": "Nem jelentheted be felhatalmazott felhasználókat vagy a bejegyzéseik tartalmát (moderátor/globális moderátor/adminok)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Nem szavazhatsz a saját hozzászólásodra", "too-many-upvotes-today": "Naponta csak %1 alkalommal szavazhat pozitívan", "too-many-upvotes-today-user": "Egy felhasználóra naponta csak %1 alkalommal szavazhat pozitívan", diff --git a/public/language/hu/flags.json b/public/language/hu/flags.json index b62147ea08..3b46cc7cc4 100644 --- a/public/language/hu/flags.json +++ b/public/language/hu/flags.json @@ -1,5 +1,6 @@ { "state": "Állapot", + "report": "Report", "reports": "Jelentés", "first-reported": "Először jelentve", "no-flags": "Hurrá! Nincs megjelölés.", @@ -8,6 +9,8 @@ "update": "Frissítés", "updated": "Frissítve", "resolved": "Megoldva", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "A tartalom amire a jelölő mutat már meg lett tiszítva vagy nem létezik.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/hy/error.json b/public/language/hy/error.json index 446b03b133..3eb20e4f20 100644 --- a/public/language/hy/error.json +++ b/public/language/hy/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Այս գրառումն արդեն նշվել է ուրիշների կողմից", "user-flagged-too-many-times": "Այս օգտատերն արդեն դրոշակվել է ուրիշների կողմից", "cant-flag-privileged": "Ձեզ չի թույլատրվում նշել արտոնյալ օգտատերերի պրոֆիլները կամ բովանդակությունը (մոդերատորներ/համաշխարհային մոդերատորներ/ադմիններ)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Դուք չեք կարող քվեարկել ձեր սեփական գրառման վրա", "too-many-upvotes-today": "Դուք կարող եք օրական միայն %1 անգամ կողմ քվեարկել", "too-many-upvotes-today-user": "Դուք կարող եք միայն օրական %1 անգամ կողմ քվեարկել օգտատիրոջը", diff --git a/public/language/hy/flags.json b/public/language/hy/flags.json index dc6e5995d9..edca973e17 100644 --- a/public/language/hy/flags.json +++ b/public/language/hy/flags.json @@ -1,5 +1,6 @@ { "state": "Փուլ", + "report": "Report", "reports": "Զեկույցներ", "first-reported": "Առաջին զեկույցը", "no-flags": "Դրոշներ չեն գտնվել:", @@ -8,6 +9,8 @@ "update": "Թարմացում ", "updated": "Updated", "resolved": "Լուծվել է", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Բովանդակությունը, որին անդրադարձել է այս դրոշը, մաքրվել է և այլևս հասանելի չէ:", "target-aboutme-empty": "Այս օգտատերը չունի "About Me" set.", diff --git a/public/language/id/error.json b/public/language/id/error.json index de8533e918..13cd16a448 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/id/flags.json b/public/language/id/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/id/flags.json +++ b/public/language/id/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/it/error.json b/public/language/it/error.json index f74a75adb9..0f25e480de 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Questo post è già stato segnalato da altri", "user-flagged-too-many-times": "Questo utente è già stato segnalato da altri", "cant-flag-privileged": "Non è consentito contrassegnare i profili o il contenuto degli utenti privilegiati (moderatori/moderatori globali/amministratori)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Non puoi votare il tuo post", "too-many-upvotes-today": "Puoi votare positivamente solo %1 volte al giorno", "too-many-upvotes-today-user": "Puoi votare positivamente un utente solo %1 volte al giorno", diff --git a/public/language/it/flags.json b/public/language/it/flags.json index b6af04101a..c944f98253 100644 --- a/public/language/it/flags.json +++ b/public/language/it/flags.json @@ -1,5 +1,6 @@ { "state": "Stato", + "report": "Report", "reports": "Segnalazioni", "first-reported": "Prima segnalazione", "no-flags": "Evviva! Nessuna segnalazione trovata.", @@ -8,6 +9,8 @@ "update": "Aggiorna", "updated": "Aggiornato", "resolved": "Risolto", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Il contenuto di questa segnalazione è stato eliminato definitivamente e non è più disponibile.", "target-aboutme-empty": "Questo utente non ha impostato "Su di me".", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 3a9b62e603..d5779e3813 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "自分のポストに評価することはできません。", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/ja/flags.json b/public/language/ja/flags.json index fdf1724ffe..a9c04bbefc 100644 --- a/public/language/ja/flags.json +++ b/public/language/ja/flags.json @@ -1,5 +1,6 @@ { "state": "状態", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "おめでとう!フラグは見つかりませんでした。", @@ -8,6 +9,8 @@ "update": "更新", "updated": "更新されました", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "このフラグが参照しているコンテンツは切り離されており、利用できません。", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 7ac23508ad..1b29891a9f 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "해당 게시물은 다른 사용자에 의해 신고되었습니다.", "user-flagged-too-many-times": "해당 사용자는 다른 사용자에 의해 신고되었습니다.", "cant-flag-privileged": "관리자를 신고할 수 없습니다. (조정자/통합 조정자/관리자)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "자신의 게시물에는 투표할 수 없습니다.", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/ko/flags.json b/public/language/ko/flags.json index b062ac9c96..fa6ed0e4f1 100644 --- a/public/language/ko/flags.json +++ b/public/language/ko/flags.json @@ -1,5 +1,6 @@ { "state": "처리 상태", + "report": "Report", "reports": "보고", "first-reported": "최초 보고", "no-flags": "만세! 들어온 신고가 없습니다.", @@ -8,6 +9,8 @@ "update": "업데이트", "updated": "업데이트 완료", "resolved": "해결됨", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "해당 신고된 컨텐츠는 완전 삭제 되었으며, 더 이상 존재하지 않습니다.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 2ab97a8d7a..0071349540 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Negalima balsuoti už savo įrašą", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/lt/flags.json b/public/language/lt/flags.json index 1d3f6efc64..2bce567011 100644 --- a/public/language/lt/flags.json +++ b/public/language/lt/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Atnaujinti", "updated": "Atnaujinta", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index 253aec07f7..2d03eb0cba 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Nevar balsot pats par savu rakstu", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/lv/flags.json b/public/language/lv/flags.json index e11024e07b..52abe02493 100644 --- a/public/language/lv/flags.json +++ b/public/language/lv/flags.json @@ -1,5 +1,6 @@ { "state": "Stāvoklis", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Labi! Nav atzīmju.", @@ -8,6 +9,8 @@ "update": "Atjaunot", "updated": "Atjaunots", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Saturs, uz kā attiecas atzīme, ir iztīrīts un vairs nav pieejams.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index c22b9f0b4a..db3908cd7d 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/ms/flags.json b/public/language/ms/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/ms/flags.json +++ b/public/language/ms/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index accbe8b9e6..9b7d99e02c 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Dette innlegget har allerede blitt flagget av andre", "user-flagged-too-many-times": "Denne brukeren har allerede blitt flagget av andre", "cant-flag-privileged": "Du har ikke lov til å flagge profiler eller innhold fra priveligerte burkere (moderatorer/ globale moderatorer/ administratorer)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Du kan ikke stemme på ditt eget innlegg", "too-many-upvotes-today": "Du kan bare gi oppstemme %1 ganger pr. dag", "too-many-upvotes-today-user": "Du kan bare gi oppstemme til en bruker %1 ganger pr. dag", diff --git a/public/language/nb/flags.json b/public/language/nb/flags.json index 1b57cf4c19..c20ce424ef 100644 --- a/public/language/nb/flags.json +++ b/public/language/nb/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Rapporter", "first-reported": "Først rapportert", "no-flags": "Hurra! Ingen flagg funnet", @@ -8,6 +9,8 @@ "update": "Oppdater ", "updated": "Oppdatert", "resolved": "Løst", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Innholdet dette flagget refererte til er renset og er ikke lenger tilgjengelig.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index eb2ac73c5b..611231c616 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Dit bericht is al door anderen gerapporteerd", "user-flagged-too-many-times": "Deze gebruiker is al door anderen gerapporteerd", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Het is niet mogelijk om op je eigen bericht te stemmen", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/nl/flags.json b/public/language/nl/flags.json index c5272b8118..758ad2d54c 100644 --- a/public/language/nl/flags.json +++ b/public/language/nl/flags.json @@ -1,5 +1,6 @@ { "state": "Status", + "report": "Report", "reports": "Rapportages", "first-reported": "Eerste rapportage", "no-flags": "Hoera! Geen markeringen gevonden.", @@ -8,6 +9,8 @@ "update": "Bijwerken", "updated": "Bijgewerkt", "resolved": "Opgelost", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "De inhoud waar deze markering naar verwijst is verwijderd en niet meer beschikbaar.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 581bc4206e..40f9124fdc 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Ten post został już oflagowany przez innych użytkowników", "user-flagged-too-many-times": "Ten użytkownik został już oflagowany przez innych użytkowników", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Nie możesz głosować na swój własny wpis.", "too-many-upvotes-today": "Możesz jedynie oceniać pozytywnie %1 razy dziennie", "too-many-upvotes-today-user": "Możesz jedynie oceniać danego użytkownika pozytywnie %1 razy dziennie", diff --git a/public/language/pl/flags.json b/public/language/pl/flags.json index 2e7a188764..c4e1e66a11 100644 --- a/public/language/pl/flags.json +++ b/public/language/pl/flags.json @@ -1,5 +1,6 @@ { "state": "Stan", + "report": "Report", "reports": "Zgłoszenia", "first-reported": "Pierwszy zgłoszony", "no-flags": "Hura! Nie znaleziono flag.", @@ -8,6 +9,8 @@ "update": "Zaktualizuj", "updated": "Zaaktualizowano", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Treści, do których odnosi się ta flaga, zostały usunięte i nie są już dostępne.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index b389cf24ff..d8c53686a9 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Esta postagem já foi sinalizada por outras pessoas", "user-flagged-too-many-times": "Este usuário já foi sinalizado por outros", "cant-flag-privileged": "Você não tem permissão para sinalizar os perfis ou o conteúdo de usuários privilegiados (moderadores/moderadores globais/administradores)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Você não pode votar no seu próprio post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/pt-BR/flags.json b/public/language/pt-BR/flags.json index 9507b9a131..7a76c15595 100644 --- a/public/language/pt-BR/flags.json +++ b/public/language/pt-BR/flags.json @@ -1,5 +1,6 @@ { "state": "Estado", + "report": "Report", "reports": "Reportagens", "first-reported": "Primeiro Reportado", "no-flags": "Ihuul! Nenhuma sinalização encontrada.", @@ -8,6 +9,8 @@ "update": "Atualizar", "updated": "Atualizado", "resolved": "Resolvido", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "O conteúdo ao qual essa sinalização se referia foi removido e não está mais disponível.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index 57dff678e0..f519ffed3c 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Não podes votar na tua própria publicação", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/pt-PT/flags.json b/public/language/pt-PT/flags.json index ad2071df63..14a80cd665 100644 --- a/public/language/pt-PT/flags.json +++ b/public/language/pt-PT/flags.json @@ -1,5 +1,6 @@ { "state": "Estado", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Fantástico! Não foram encontradas denúncias.", @@ -8,6 +9,8 @@ "update": "Atualizar", "updated": "Atualizado", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 6c03f4fa19..7086854993 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/ro/flags.json b/public/language/ro/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/ro/flags.json +++ b/public/language/ro/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index c8baea4746..f2fb4e1871 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "На это сообщение уже пожаловались другие пользователи", "user-flagged-too-many-times": "На этого пользователя уже пожаловались другие пользователи", "cant-flag-privileged": "Вам не разрешено оставлять жалобы на профили или контент привилегированных пользователей (Модераторов/Глобальных модераторов/Администраторов)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Вы не можете голосовать за свои собственные сообщения", "too-many-upvotes-today": "Вы можете проголосовать за только %1 раз за день", "too-many-upvotes-today-user": "Вы можете проголосовать за участника только %1 раз за день.", diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index 47ac700c18..3be16016df 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -1,5 +1,6 @@ { "state": "Состояние", + "report": "Report", "reports": "Жалобы", "first-reported": "Первая жалоба", "no-flags": "Ура! Жалоб нет.", @@ -8,6 +9,8 @@ "update": "Обновить", "updated": "Обновлено", "resolved": "Решено", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Сообщение, на которое поступила жалоба, было удалено и больше не доступно.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 773296aee0..c5e79f81ed 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/rw/flags.json b/public/language/rw/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/rw/flags.json +++ b/public/language/rw/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index f19e8ad0fa..9836084180 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/sc/flags.json b/public/language/sc/flags.json index f12aaae53d..996e027833 100644 --- a/public/language/sc/flags.json +++ b/public/language/sc/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Updated", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index afb12c5a08..2a963661cf 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Za svoj vlastný príspevok nemôžete hlasovať", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/sk/flags.json b/public/language/sk/flags.json index 11cfb8e3f1..d55b9e5827 100644 --- a/public/language/sk/flags.json +++ b/public/language/sk/flags.json @@ -1,5 +1,6 @@ { "state": "Stav", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hurá! Neboli nájdené žiadne príznaky.", @@ -8,6 +9,8 @@ "update": "Aktualizovať", "updated": "Aktualizované", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Obsah, na ktorý sa vzťahuje toto označenie, bol odstránený a už nie je k dispozícii.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index 070f1b7209..24afe03917 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/sl/flags.json b/public/language/sl/flags.json index 37671b6961..4b9a03f6eb 100644 --- a/public/language/sl/flags.json +++ b/public/language/sl/flags.json @@ -1,5 +1,6 @@ { "state": "State", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Hooray! No flags found.", @@ -8,6 +9,8 @@ "update": "Update", "updated": "Posodobljeno", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "The content this flag referred to has been purged and is no longer available.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/sq-AL/error.json b/public/language/sq-AL/error.json index 92dbf45e49..1a31a1513d 100644 --- a/public/language/sq-AL/error.json +++ b/public/language/sq-AL/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Ky postim është raportuar tashmë nga të tjerë", "user-flagged-too-many-times": "Ky përdorues tashmë është raportuar nga të tjerë", "cant-flag-privileged": "Nuk ju lejohet të raportoni profilet ose përmbajtjen e përdoruesve të privilegjuar (moderatorët/administratorët)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Ju nuk mund të votoni për postimin tuaj", "too-many-upvotes-today": "Ju mund të votoni pro vetëm %1 herë në ditë", "too-many-upvotes-today-user": "Ju mund të votoni një përdorues %1 herë në ditë", diff --git a/public/language/sq-AL/flags.json b/public/language/sq-AL/flags.json index eafc9c3a39..db14cae57d 100644 --- a/public/language/sq-AL/flags.json +++ b/public/language/sq-AL/flags.json @@ -1,5 +1,6 @@ { "state": "Gjendja", + "report": "Report", "reports": "Raportet", "first-reported": "Raportuar për herë të parë", "no-flags": "Juhu! Nuk u gjet asnje gabim.", @@ -8,6 +9,8 @@ "update": "Përditëso", "updated": "I përditësuar", "resolved": "E zgjidhur", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Përmbajtja të cilës i referohet ky raportim është fshire dhe nuk disponohet më.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index c8f6f83774..08cf3fc22e 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Ову поруку су већ означили заставицом други", "user-flagged-too-many-times": "Овог корисника су већ означили заставицом други", "cant-flag-privileged": "Није вам дозвољено да означавате заставицом профиле или садржај привилегованих корисника (модератори/глобални модератори/администратори)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Не можете гласати за своју поруку", "too-many-upvotes-today": "Можете гласати само %1 пута дневно", "too-many-upvotes-today-user": "Можете гласати за корисника само %1 пута дневно", diff --git a/public/language/sr/flags.json b/public/language/sr/flags.json index 1f54a981f2..67168e53f5 100644 --- a/public/language/sr/flags.json +++ b/public/language/sr/flags.json @@ -1,5 +1,6 @@ { "state": "Стање", + "report": "Report", "reports": "Извештаји", "first-reported": "Прво пријављено", "no-flags": "Ура! Нема заставица.", @@ -8,6 +9,8 @@ "update": "Ажурирај", "updated": "Ажурирано", "resolved": "Решено", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Садржај на који се односи ова заставица је очишћен и није више доступан.", "target-aboutme-empty": "Овај корисник није подесио "О мени".", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 92aa820757..263e4cf95c 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Du kan inte rösta på ditt eget inlägg.", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/sv/flags.json b/public/language/sv/flags.json index fa213c2cb1..eb9a6520b0 100644 --- a/public/language/sv/flags.json +++ b/public/language/sv/flags.json @@ -1,5 +1,6 @@ { "state": "Status", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Yippie! Inga flaggor funna.", @@ -8,6 +9,8 @@ "update": "Uppdatera", "updated": "Uppdatering", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Innehållet denna flagga refererar till har rensats bort och är inte längre tillgängligt.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/th/error.json b/public/language/th/error.json index a725b70c14..671c76c6b3 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "You cannot vote on your own post", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/th/flags.json b/public/language/th/flags.json index a56232008a..1fdaf3d15d 100644 --- a/public/language/th/flags.json +++ b/public/language/th/flags.json @@ -1,5 +1,6 @@ { "state": "สถานะ", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "ไชโย ไม่เจอธงใดๆเลย", @@ -8,6 +9,8 @@ "update": "อัพเดท", "updated": "ได้รับการอัพเดท", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "เนื้อหาที่ธงนี้อ้างถึงถูกลบออกและไม่มีอยู่ในระบบอีกต่อไป", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index ef39f6ebec..7c8eb39864 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Bu ileti başkaları tarafından halihazırda şikayet edilmiş.", "user-flagged-too-many-times": "Bu kullanıcı başkaları tarafından halihazırda şikayet edilmiş.", "cant-flag-privileged": "Yöneticilerin profillerini veya içeriklerini bayraklayamazsınız.", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Kendi iletinize oy veremezsiniz", "too-many-upvotes-today": "Bir günde sadece %1 artı oy verebilirsiniz", "too-many-upvotes-today-user": "Bir kullanıcıya bir günde sadece %1 artı oy verebilirsiniz", diff --git a/public/language/tr/flags.json b/public/language/tr/flags.json index edb745dd26..6d7515dc0d 100644 --- a/public/language/tr/flags.json +++ b/public/language/tr/flags.json @@ -1,5 +1,6 @@ { "state": "Durum", + "report": "Report", "reports": "Raporlar", "first-reported": "İlk rapor tarihi", "no-flags": "Yaşasın! Hiçbir şikayet bulunamadı.", @@ -8,6 +9,8 @@ "update": "Güncelle", "updated": "Güncellendi", "resolved": "Çözüldü", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Şikayet edilen içerik temizlendi ve artık mevcut değil.", "target-aboutme-empty": "Bu kullanıcı için "Hakkımda" bölümü yok.", diff --git a/public/language/uk/error.json b/public/language/uk/error.json index 66a0a3cfea..23292eeab1 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Ви не можете проголосувати за власний пост", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/uk/flags.json b/public/language/uk/flags.json index 6b5b30a3e0..985718c01e 100644 --- a/public/language/uk/flags.json +++ b/public/language/uk/flags.json @@ -1,5 +1,6 @@ { "state": "Стан", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "Ура! Скарг немає.", @@ -8,6 +9,8 @@ "update": "Оновлення", "updated": "Оновлено", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Зміст на який подана ця скарга було стерто і він більше недоступний.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 221d7b27f8..a028e95f21 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "Bài đăng này đã bị người khác gắn cờ", "user-flagged-too-many-times": "Người dùng này đã bị người khác gắn cờ", "cant-flag-privileged": "Bạn không có quyền gắn cờ hồ sơ hay nội dung của người dùng đặc biệt (người kiểm duyệt/người quản lý chung/quản trị viên)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "Bạn không thể tự bầu cho bài đăng của mình", "too-many-upvotes-today": "Bạn chỉ có thể ủng hộ %1 lần một ngày", "too-many-upvotes-today-user": "Bạn chỉ có thể ủng hộ người dùng %1 lần một ngày", diff --git a/public/language/vi/flags.json b/public/language/vi/flags.json index 2c57b226a6..edf9facf10 100644 --- a/public/language/vi/flags.json +++ b/public/language/vi/flags.json @@ -1,5 +1,6 @@ { "state": "Trạng thái", + "report": "Report", "reports": "Báo cáo", "first-reported": "Được báo cáo đầu tiên", "no-flags": "Hoan hô! Không tìm thấy cờ.", @@ -8,6 +9,8 @@ "update": "Cập nhật", "updated": "Đã cập nhật", "resolved": "Đã Xử Lý", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "Nội dung mà cờ này đề cập đến đã bị xóa và không còn nữa.", "target-aboutme-empty": "Người dùng này không có "Giới Thiệu Về Tôi" set.", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index 706e55a262..3c48a63ebb 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "此贴已被其他用户举报", "user-flagged-too-many-times": "此用户已被其他用户举报", "cant-flag-privileged": "您不能举报特权用户(版主/全局版主/管理员)的内容或资料", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "您不能对您自己的帖子投票", "too-many-upvotes-today": "您每天仅可进行 %1 次顶贴", "too-many-upvotes-today-user": "您每天只能对一个用户顶 %1 次", diff --git a/public/language/zh-CN/flags.json b/public/language/zh-CN/flags.json index 17e3d32ede..63b43be5ac 100644 --- a/public/language/zh-CN/flags.json +++ b/public/language/zh-CN/flags.json @@ -1,5 +1,6 @@ { "state": "状态", + "report": "Report", "reports": "报告", "first-reported": "首次报告", "no-flags": "啊哈!没发现任何的举报。", @@ -8,6 +9,8 @@ "update": "更新", "updated": "已更新", "resolved": "已解决", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "被举报的内容已经被清除,不再可用。", "target-aboutme-empty": "这个用户没有设置 "关于我" 。", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index 2134f0acdf..1c0bf8bc74 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -184,6 +184,7 @@ "post-flagged-too-many-times": "This post has been flagged by others already", "user-flagged-too-many-times": "This user has been flagged by others already", "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "cant-locate-flag-report": "Cannot locate flag report", "self-vote": "您不能讚您自己的貼文", "too-many-upvotes-today": "You can only upvote %1 times a day", "too-many-upvotes-today-user": "You can only upvote a user %1 times a day", diff --git a/public/language/zh-TW/flags.json b/public/language/zh-TW/flags.json index 213dc72259..b361076616 100644 --- a/public/language/zh-TW/flags.json +++ b/public/language/zh-TW/flags.json @@ -1,5 +1,6 @@ { "state": "狀態", + "report": "Report", "reports": "Reports", "first-reported": "First Reported", "no-flags": "帥!沒發現任何的舉報。", @@ -8,6 +9,8 @@ "update": "更新", "updated": "已更新", "resolved": "Resolved", + "report-added": "Added", + "report-rescinded": "Rescinded", "target-purged": "被舉報的內容已經被清除,不再可用。", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 6207546cee..b1dabb778b 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -192,6 +192,8 @@ paths: $ref: 'write/flags.yaml' /flags/{flagId}: $ref: 'write/flags/flagId.yaml' + /flags/{flagId}/report: + $ref: 'write/flags/flagId/report.yaml' /flags/{flagId}/notes: $ref: 'write/flags/flagId/notes.yaml' /flags/{flagId}/notes/{datetime}: diff --git a/public/openapi/write/flags/flagId/report.yaml b/public/openapi/write/flags/flagId/report.yaml new file mode 100644 index 0000000000..61944a24df --- /dev/null +++ b/public/openapi/write/flags/flagId/report.yaml @@ -0,0 +1,26 @@ +delete: + tags: + - flags + summary: rescind a flag report + description: This operation rescinds the report made for a given flag. + parameters: + - in: path + name: flagId + schema: + type: number + required: true + description: a valid flag id + example: 2 + responses: + '200': + description: Flag report rescinded + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: {} \ No newline at end of file diff --git a/src/api/flags.js b/src/api/flags.js index e4a3ba04e4..ffa56e2782 100644 --- a/src/api/flags.js +++ b/src/api/flags.js @@ -49,6 +49,16 @@ flagsApi.update = async (caller, data) => { flagsApi.delete = async (_, { flagId }) => await flags.purge([flagId]); +flagsApi.rescind = async ({ uid }, { flagId }) => { + const { type, targetId } = await flags.get(flagId); + const exists = await flags.exists(type, targetId, uid); + if (!exists) { + throw new Error('[[error:no-flag]]'); + } + + await flags.rescindReport(type, targetId, uid); +}; + flagsApi.appendNote = async (caller, data) => { const allowed = await user.isPrivileged(caller.uid); if (!allowed) { diff --git a/src/controllers/errors.js b/src/controllers/errors.js index 8071c54371..cd377f5d59 100644 --- a/src/controllers/errors.js +++ b/src/controllers/errors.js @@ -48,6 +48,12 @@ exports.handleErrors = async function handleErrors(err, req, res, next) { // esl res.status(403).type('text/plain').send(err.message); }, }; + + const notFoundHandler = () => { + const controllers = require('.'); + controllers['404'].handle404(req, res); + }; + const defaultHandler = async function () { if (res.headersSent) { return; @@ -87,6 +93,8 @@ exports.handleErrors = async function handleErrors(err, req, res, next) { // esl try { if (data.cases.hasOwnProperty(err.code)) { data.cases[err.code](err, req, res, defaultHandler); + } else if (err.message.startsWith('[[error:no-') && err.message !== '[[error:no-privileges]]') { + notFoundHandler(); } else { await defaultHandler(); } diff --git a/src/controllers/write/flags.js b/src/controllers/write/flags.js index 63135274bf..4e3ac376a7 100644 --- a/src/controllers/write/flags.js +++ b/src/controllers/write/flags.js @@ -13,7 +13,7 @@ Flags.create = async (req, res) => { }; Flags.get = async (req, res) => { - helpers.formatApiResponse(200, res, await api.flags.get(req, req.params.flagId)); + helpers.formatApiResponse(200, res, await api.flags.get(req, req.params)); }; Flags.update = async (req, res) => { @@ -32,6 +32,11 @@ Flags.delete = async (req, res) => { helpers.formatApiResponse(200, res); }; +Flags.rescind = async (req, res) => { + await api.flags.rescind(req, { flagId: req.params.flagId }); + helpers.formatApiResponse(200, res); +}; + Flags.appendNote = async (req, res) => { const { note, datetime } = req.body; const payload = await api.flags.appendNote(req, { diff --git a/src/flags.js b/src/flags.js index 55d97713a8..7ec1c504c1 100644 --- a/src/flags.js +++ b/src/flags.js @@ -109,7 +109,7 @@ Flags.get = async function (flagId) { Flags.getReports(flagId), ]); if (!base) { - return; + throw new Error('[[error:no-flag]]'); } const flagObj = { state: 'open', @@ -417,7 +417,10 @@ Flags.create = async function (type, id, uid, reason, timestamp, forceFlag = fal const flagId = await Flags.getFlagIdByTarget(type, id); await Promise.all([ Flags.addReport(flagId, type, id, uid, reason, timestamp), - Flags.update(flagId, uid, { state: 'open' }), + Flags.update(flagId, uid, { + state: 'open', + report: 'added', + }), ]); return await Flags.get(flagId); @@ -542,6 +545,7 @@ Flags.getReports = async function (flagId) { return reports; }; +// Not meant to be called directly, call Flags.create() instead. Flags.addReport = async function (flagId, type, id, uid, reason, timestamp) { await db.sortedSetAddBulk([ [`flags:byReporter:${uid}`, timestamp, flagId], @@ -553,6 +557,45 @@ Flags.addReport = async function (flagId, type, id, uid, reason, timestamp) { plugins.hooks.fire('action:flags.addReport', { flagId, type, id, uid, reason, timestamp }); }; +Flags.rescindReport = async (type, id, uid) => { + const exists = await Flags.exists(type, id, uid); + if (!exists) { + return true; + } + + const flagId = await db.sortedSetScore('flags:hash', [type, id, uid].join(':')); + const reports = await db.getSortedSetMembers(`flag:${flagId}:reports`); + let reason; + reports.forEach((payload) => { + if (!reason) { + const [payloadUid, payloadReason] = payload.split(';'); + if (parseInt(payloadUid, 10) === parseInt(uid, 10)) { + reason = payloadReason; + } + } + }); + + if (!reason) { + throw new Error('[[error:cant-locate-flag-report]]'); + } + + await db.sortedSetRemoveBulk([ + [`flags:byReporter:${uid}`, flagId], + [`flag:${flagId}:reports`, [uid, reason].join(';')], + + ['flags:hash', [type, id, uid].join(':')], + ]); + + // If there are no more reports, consider the flag resolved + const reportCount = await db.sortedSetCard(`flag:${flagId}:reports`); + if (reportCount < 1) { + await Flags.update(flagId, uid, { + state: 'resolved', + report: 'rescinded', + }); + } +}; + Flags.exists = async function (type, id, uid) { return await db.isSortedSetMember('flags:hash', [type, id, uid].join(':')); }; @@ -766,6 +809,9 @@ Flags.getHistory = async function (flagId) { if (changeset.hasOwnProperty('state')) { changeset.state = changeset.state === undefined ? '' : `[[flags:state-${changeset.state}]]`; } + if (changeset.hasOwnProperty('report')) { + changeset.report = `[[flags:report-${changeset.report}]]`; + } return { uid: entry.value[0], diff --git a/src/routes/write/flags.js b/src/routes/write/flags.js index 6e9c8e6623..f30232c5b6 100644 --- a/src/routes/write/flags.js +++ b/src/routes/write/flags.js @@ -12,10 +12,13 @@ module.exports = function () { setupApiRoute(router, 'post', '/', [...middlewares], controllers.write.flags.create); + // Note: access control provided by middleware.assert.flag setupApiRoute(router, 'get', '/:flagId', [...middlewares, middleware.assert.flag], controllers.write.flags.get); setupApiRoute(router, 'put', '/:flagId', [...middlewares, middleware.assert.flag], controllers.write.flags.update); setupApiRoute(router, 'delete', '/:flagId', [...middlewares, middleware.assert.flag], controllers.write.flags.delete); + setupApiRoute(router, 'delete', '/:flagId/report', middlewares, controllers.write.flags.rescind); + setupApiRoute(router, 'post', '/:flagId/notes', [...middlewares, middleware.assert.flag], controllers.write.flags.appendNote); setupApiRoute(router, 'delete', '/:flagId/notes/:datetime', [...middlewares, middleware.assert.flag], controllers.write.flags.deleteNote); diff --git a/test/flags.js b/test/flags.js index 2912346519..914e9ae72a 100644 --- a/test/flags.js +++ b/test/flags.js @@ -19,6 +19,7 @@ const User = require('../src/user'); const Groups = require('../src/groups'); const Meta = require('../src/meta'); const Privileges = require('../src/privileges'); +const plugins = require('../src/plugins'); const utils = require('../src/utils'); const api = require('../src/api'); @@ -31,6 +32,13 @@ describe('Flags', () => { let csrfToken; let category; before(async () => { + const dummyEmailerHook = async (data) => {}; + // Attach an emailer hook so related requests do not error + plugins.hooks.register('flags-test', { + hook: 'filter:email.send', + method: dummyEmailerHook, + }); + // Create some stuff to flag uid1 = await User.create({ username: 'testUser', password: 'abcdef', email: 'b@c.com' }); @@ -61,6 +69,10 @@ describe('Flags', () => { csrfToken = login.csrf_token; }); + after(() => { + plugins.hooks.unregister('flags-test', 'filter:email.send'); + }); + describe('.create()', () => { it('should create a flag and return its data', (done) => { Flags.create('post', 1, 1, 'Test flag', (err, flagData) => { @@ -99,6 +111,79 @@ describe('Flags', () => { }); }); + describe('.addReport()', () => { + let flagId; + let postData; + + before(async () => { + // Create a topic and flag it + ({ postData } = await Topics.post({ + cid: category.cid, + uid: uid1, + title: utils.generateUUID(), + content: utils.generateUUID(), + })); + ({ flagId } = await Flags.create('post', postData.pid, adminUid, utils.generateUUID())); + }); + + after(async () => { + Flags.purge([flagId]); + }); + + it('should add a report to an existing flag', async () => { + await Flags.addReport(flagId, 'post', postData.pid, uid3, utils.generateUUID(), Date.now()); + + const reports = await db.getSortedSetMembers(`flag:${flagId}:reports`); + assert.strictEqual(reports.length, 2); + }); + + it('should add an additional report even if same user calls it again', async () => { + // This isn't exposed to the end user, but is possible via direct method call + await Flags.addReport(flagId, 'post', postData.pid, uid3, utils.generateUUID(), Date.now()); + + const reports = await db.getSortedSetMembers(`flag:${flagId}:reports`); + assert.strictEqual(reports.length, 3); + }); + }); + + describe('.rescindReport()', () => { + let flagId; + let postData; + + before(async () => { + // Create a topic and flag it + ({ postData } = await Topics.post({ + cid: category.cid, + uid: uid1, + title: utils.generateUUID(), + content: utils.generateUUID(), + })); + ({ flagId } = await Flags.create('post', postData.pid, adminUid, utils.generateUUID())); + }); + + after(async () => { + Flags.purge([flagId]); + }); + + it('should remove a report from an existing flag', async () => { + await Flags.create('post', postData.pid, uid3, utils.generateUUID()); + await Flags.rescindReport('post', postData.pid, uid3); + const reports = await Flags.getReports(flagId); + + assert.strictEqual(reports.length, 1); + assert(reports.every(({ reporter }) => reporter.uid !== uid3)); + }); + + it('should automatically mark the flag resolved if there are no reports remaining after removal', async () => { + await Flags.rescindReport('post', postData.pid, adminUid); + const reports = await Flags.getReports(flagId); + const { state } = await Flags.get(flagId); + + assert.strictEqual(reports.length, 0); + assert.strictEqual(state, 'resolved'); + }); + }); + describe('.exists()', () => { it('should return Boolean True if a flag matching the flag hash already exists', (done) => { Flags.exists('post', 1, 1, (err, exists) => { @@ -909,7 +994,7 @@ describe('Flags', () => { it('should update a flag\'s properties', async () => { const { response } = await request({ method: 'put', - uri: `${nconf.get('url')}/api/v3/flags/2`, + uri: `${nconf.get('url')}/api/v3/flags/4`, jar, headers: { 'x-csrf-token': csrfToken, @@ -927,11 +1012,27 @@ describe('Flags', () => { }); }); + describe('.rescind()', () => { + it('should remove a flag\'s report', async () => { + const response = await request({ + method: 'delete', + uri: `${nconf.get('url')}/api/v3/flags/4/report`, + jar, + headers: { + 'x-csrf-token': csrfToken, + }, + resolveWithFullResponse: true, + }); + + assert.strictEqual(response.statusCode, 200); + }); + }); + describe('.appendNote()', () => { it('should append a note to the flag', async () => { const { response } = await request({ method: 'post', - uri: `${nconf.get('url')}/api/v3/flags/2/notes`, + uri: `${nconf.get('url')}/api/v3/flags/4/notes`, jar, headers: { 'x-csrf-token': csrfToken, @@ -959,7 +1060,7 @@ describe('Flags', () => { it('should delete a note from a flag', async () => { const { response } = await request({ method: 'delete', - uri: `${nconf.get('url')}/api/v3/flags/2/notes/1626446956652`, + uri: `${nconf.get('url')}/api/v3/flags/4/notes/1626446956652`, jar, headers: { 'x-csrf-token': csrfToken,