diff --git a/package.json b/package.json index 72aa261a1c..52665b2e92 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "0.7.2-dev", + "version": "0.7.3-dev", "homepage": "http://www.nodebb.org", "repository": { "type": "git", @@ -49,8 +49,8 @@ "nodebb-plugin-spam-be-gone": "^0.4.0", "nodebb-rewards-essentials": "^0.0.1", "nodebb-theme-lavender": "^1.0.48", - "nodebb-theme-persona": "^1.0.16", - "nodebb-theme-vanilla": "^2.0.14", + "nodebb-theme-persona": "^1.0.24", + "nodebb-theme-vanilla": "^2.0.19", "nodebb-widget-essentials": "^1.0.2", "npm": "^2.1.4", "passport": "^0.2.1", diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index 4fe45b075e..ae753b2d42 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -38,6 +38,7 @@ "details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها", "details.hidden": "مخفي", "details.hidden_help": "في حالة تفعيل الخيار، لن تظهر المجموعة للعموم والإنضمام إليها سيتلزم دعوة يدوية.", + "details.delete_group": "Delete Group", "event.updated": "تم تحديث بيانات المجموعة", "event.deleted": "تم حذف المجموعة %1", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index db9f29610b..1304f49c36 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -38,11 +38,12 @@ "details.private_help": "Ако е включено, присъединяването към група изисква одобрението на собственика ѝ", "details.hidden": "Скрита", "details.hidden_help": "Ако е включено, тази група няма да бъде извеждана в списъка от групи и потребителите ще трябва да бъдат поканени лично", + "details.delete_group": "Delete Group", "event.updated": "Подробностите за групата бяха обновени", "event.deleted": "Групата „%1“ беше изтрита", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject" + "membership.accept-invitation": "Приемане на поканата", + "membership.invitation-pending": "Чакаща покана", + "membership.join-group": "Присъединяване към групата", + "membership.leave-group": "Напускане на групата", + "membership.reject": "Отхвърляне" } \ No newline at end of file diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json index 9dbffb5a8f..dd582c072a 100644 --- a/public/language/bn/groups.json +++ b/public/language/bn/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 15aa76b661..7690fb15a5 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/da/groups.json b/public/language/da/groups.json index 7cce8f8fc5..f7094f1ac1 100644 --- a/public/language/da/groups.json +++ b/public/language/da/groups.json @@ -38,11 +38,12 @@ "details.private_help": "Hvis aktiveret, så vil det kræve godkendelse af gruppe ejeren for at tilslutte sig en gruppe", "details.hidden": "Skjult", "details.hidden_help": "Hvis aktiveret, så vil denne gruppe ikke kunne ses i gruppelisten og bruhere skal inviteres manuelt", + "details.delete_group": "Delete Group", "event.updated": "Gruppe detaljer er blevet opdateret", "event.deleted": "Gruppen \"%1\" er blevet slettet", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject" + "membership.accept-invitation": "Acceptér Invitation", + "membership.invitation-pending": "Afventende Invitationer", + "membership.join-group": "Bliv medlem af gruppe", + "membership.leave-group": "Forlad Gruppe", + "membership.reject": "Afvis" } \ No newline at end of file diff --git a/public/language/de/groups.json b/public/language/de/groups.json index 974f35dc02..0f26786358 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Wenn aktiviert, setzt ein Gruppenbeitritt die Zustimmung eines Gruppenbesitzers voraus", "details.hidden": "Versteckt", "details.hidden_help": "Wenn aktiviert, wird diese Gruppe in der Gruppenliste nicht zu finden sein, und Benutzer werden manuell eingeladen werden müssen.", + "details.delete_group": "Delete Group", "event.updated": "Gruppendetails wurden aktualisiert", "event.deleted": "Die Gruppe \"%1\" wurde gelöscht.", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/el/groups.json b/public/language/el/groups.json index 93f2ba7466..b81d08c2c4 100644 --- a/public/language/el/groups.json +++ b/public/language/el/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/en@pirate/groups.json b/public/language/en@pirate/groups.json index badb766544..1e1623c38f 100644 --- a/public/language/en@pirate/groups.json +++ b/public/language/en@pirate/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/en_US/groups.json b/public/language/en_US/groups.json index badb766544..1e1623c38f 100644 --- a/public/language/en_US/groups.json +++ b/public/language/en_US/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/es/groups.json b/public/language/es/groups.json index df6b609da9..1da9e025e2 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -38,11 +38,12 @@ "details.private_help": "Si está habilitado, entrar en los grupos requiere aprobación de sus propietarios", "details.hidden": "Oculto", "details.hidden_help": "Si está habilitado, este grupo no aparecerá en los listados de grupos, y los usuarios tendrán que ser invitados manualmente", + "details.delete_group": "Delete Group", "event.updated": "Los detalles del grupo han sido actualizados", "event.deleted": "El grupo \"%1\" ha sido eliminado", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject" + "membership.accept-invitation": "Aceptar Invitación", + "membership.invitation-pending": "Invitación Pendiente", + "membership.join-group": "Unirse al grupo", + "membership.leave-group": "Dejar el grupo", + "membership.reject": "Rechazar" } \ No newline at end of file diff --git a/public/language/et/groups.json b/public/language/et/groups.json index 3761420ae1..1ddeb7ce14 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Kui sisse lülitatud, siis grupiga liitumine nõuab grupi omaniku nõusolekut", "details.hidden": "Peidetud", "details.hidden_help": "Kui sisse lülitatud, siis seda gruppi ei kuvata gruppide nimekirjas ning liikmed tuleb lisada manuaalselt", + "details.delete_group": "Delete Group", "event.updated": "Grupi lisainformatsiooni on uuendatud", "event.deleted": "Grupp \"%1\" on kustutatud", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/fa_IR/groups.json b/public/language/fa_IR/groups.json index 27558f977a..4309d8390a 100644 --- a/public/language/fa_IR/groups.json +++ b/public/language/fa_IR/groups.json @@ -38,6 +38,7 @@ "details.private_help": "اگر فعال باشد، پیوستن به گروه مستلزم موافقت صاحب گروه است", "details.hidden": "پنهان", "details.hidden_help": "اگر فعال باشد، این گروه در فهرست گروه‌ها پیدا نمی‌شود و کاربران باید دستی فراخوانده شوند", + "details.delete_group": "Delete Group", "event.updated": "جزییات گروه با موفقیت به روز گردید", "event.deleted": "گروه \"%1\" حدف شد", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/fi/groups.json b/public/language/fi/groups.json index f324b87a58..a2cf33e9ce 100644 --- a/public/language/fi/groups.json +++ b/public/language/fi/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 7298e22cfc..35488f192e 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -38,11 +38,12 @@ "details.private_help": "Si cette case est cochée, rejoindre un groupe nécessite l'accord d'un propriétaire du groupe.", "details.hidden": "Masqué", "details.hidden_help": "Si cette case est cochée, ce groupe n'est pas affiché dans la liste des groupes, et les utilisateurs devront être invités manuellement.", + "details.delete_group": "Delete Group", "event.updated": "Les détails du groupe ont été mis à jour", "event.deleted": "Le groupe \"%1\" a été supprimé", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject" + "membership.accept-invitation": "Accepter l'invitation", + "membership.invitation-pending": "Invitation en attente", + "membership.join-group": "Rejoindre le groupe", + "membership.leave-group": "Quitter le groupe", + "membership.reject": "Refuser" } \ No newline at end of file diff --git a/public/language/he/groups.json b/public/language/he/groups.json index c4e95b17f4..0cb4cafcb8 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "פרטי הקבוצה עודכנו", "event.deleted": "קבוצת \"%1\" נמחקה", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json index 308ce94928..a5332f50b4 100644 --- a/public/language/hu/groups.json +++ b/public/language/hu/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/id/groups.json b/public/language/id/groups.json index c42a61d1fe..d67ca443d1 100644 --- a/public/language/id/groups.json +++ b/public/language/id/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 2babcabd07..1718c967ac 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Se abilitato, l'ingresso ai gruppi richiede l'approvazione di uno dei proprietari", "details.hidden": "Nascosto", "details.hidden_help": "Se abilitato, questo gruppo non sarà visibile nella lista dei gruppi e gli utenti dovranno essere invitati manualmente", + "details.delete_group": "Delete Group", "event.updated": "I dettagli del Gruppo sono stati aggiornati", "event.deleted": "Il gruppo \"%1\" è stato eliminato", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index badb766544..1e1623c38f 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index 1f65474e51..ce5f1c3912 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index cc39bdf99d..a6e81d61e8 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Paslėptas", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Grupės informacija atnaujinta", "event.deleted": "Grupė \"%1\" pašalinta", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index 8fcf3403c7..3bc71433f1 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Jika dibolehkan, menyertai kumpulan memerlukan kelulusan pemilik kumpulan", "details.hidden": "Sembunyi", "details.hidden_help": "Jika dibolehkan, kumpulan ini tidak akan dijumpai di senarai kumpulan, dan pengguna hendaklah di jemput secara manual", + "details.delete_group": "Delete Group", "event.updated": "Perincian kumpulan telah dikemaskini", "event.deleted": "Kumpulan \"%1\" telah dipadam", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json index 09391809c5..62e2979113 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Hvis aktivert, vil medlemskap i grupper kreve godkjennelse fra en gruppe-eier", "details.hidden": "Skjult", "details.hidden_help": "vis aktivert, vil denne gruppen ikke bli funnet i gruppelista, og brukere må inviteres manuellt", + "details.delete_group": "Delete Group", "event.updated": "Gruppedetaljer har blitt oppgradert", "event.deleted": "Gruppen \"%1\" har blitt slettet", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 8964e9902e..d91ad473b0 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Wanneer ingeschakeld, zal eerst een groepseigenaar goedkeuring moeten verlenen voordat nieuwe leden kunnen toetreden", "details.hidden": "Niet getoond", "details.hidden_help": "Indien geactiveerd zal deze groep niet getoond worden in de groepslijst en zullen gebruikers handmatig uitgenodigd moeten worden.", + "details.delete_group": "Delete Group", "event.updated": "Groepsdetails zijn bijgewerkt", "event.deleted": "De groep \"%1\" is verwijderd", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 0ded21291d..90c7195a0b 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Jeśli aktywowane, przystępowanie do grup wymaga zatwierdzenia przez właściciela grupy", "details.hidden": "Ukryty", "details.hidden_help": "Jeśli aktywowane, ta grupa nie będzie widoczna w wykazie grup, a użytkownicy będą musieli być zapraszani manualnie.", + "details.delete_group": "Delete Group", "event.updated": "Dane grupy zostały zaktualizowane", "event.deleted": "Grupa \"%1\" została skasowana", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/pt_BR/groups.json b/public/language/pt_BR/groups.json index 4a41877f62..5391da0e8f 100644 --- a/public/language/pt_BR/groups.json +++ b/public/language/pt_BR/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Se habilitado, a entrada nos grupos requer aprovação de um dos donos do grupo", "details.hidden": "Oculto", "details.hidden_help": "Se habilitado, este grupo não se encontrará na listagem de grupos e os usuários terão de ser convivados manualmente", + "details.delete_group": "Delete Group", "event.updated": "Os detalhes do grupo foram atualizados", "event.deleted": "O grupo \"%1\" foi deletado", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index d17aa24df7..16d4fbb1d3 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 4a3ef02436..d4c115bd0d 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Если включено, вступление в группы будет подтверждаться владельцем группы", "details.hidden": "Скрыто", "details.hidden_help": "Если включено, группа не будет показываться в списках, а пользователи должны приглашаться вручную", + "details.delete_group": "Delete Group", "event.updated": "Настройки группы обновлены", "event.deleted": "Группа \"%1\" удалена", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json index badb766544..1e1623c38f 100644 --- a/public/language/sc/groups.json +++ b/public/language/sc/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index badb766544..1e1623c38f 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/sr/groups.json b/public/language/sr/groups.json index 7f3f0e4fe3..a4666c6d8f 100644 --- a/public/language/sr/groups.json +++ b/public/language/sr/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Уколико је укључено, приступање групи захтева одобрење власника групе.", "details.hidden": "Скривена", "details.hidden_help": "Уколико је укључено, група неће бити видљива на списку група, и корисницима се позивнице морају слати ручно.", + "details.delete_group": "Delete Group", "event.updated": "Детаљи групе су ажурирани", "event.deleted": "Група „%1“ је обрисана", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index 152daab350..2cb6de26df 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/th/groups.json b/public/language/th/groups.json index 3747eb2a3d..027579e466 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "ซ่อน", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "ข้อมูล Group ได้รับการบันทึกแล้ว", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 46abe947de..bac723142e 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -38,6 +38,7 @@ "details.private_help": "Gruba katılmak için eğer etkinse grup sahibini onayı gerekir, ", "details.hidden": "Gizli", "details.hidden_help": "Bu grup eğer etkinse grup listelerinde bulunmaz, ve kullanıcılar bizzat davet eder", + "details.delete_group": "Delete Group", "event.updated": "Grup detayları güncellenmiştir", "event.deleted": "\"%1\" grubu silinmiş", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index 3b80f9359a..2deebd443e 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "Thông tin nhóm đã được cập nhật", "event.deleted": "The group \"%1\" has been deleted", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index ca11bcb910..0f02408c81 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -38,6 +38,7 @@ "details.private_help": "启用此选项后,加入小组需要组长审批。", "details.hidden": "隐藏", "details.hidden_help": "启用此选项后,小组将不在小组列表中展现,成员只能通过邀请加入。", + "details.delete_group": "Delete Group", "event.updated": "小组信息已更新", "event.deleted": "小组 \"%1\" 已被删除", "membership.accept-invitation": "Accept Invitation", diff --git a/public/language/zh_TW/groups.json b/public/language/zh_TW/groups.json index 2004ee24a7..b69c394a33 100644 --- a/public/language/zh_TW/groups.json +++ b/public/language/zh_TW/groups.json @@ -38,6 +38,7 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "隱藏", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.delete_group": "Delete Group", "event.updated": "群組詳細訊息已被更新", "event.deleted": "此 \"%1\" 群組已被刪除了", "membership.accept-invitation": "Accept Invitation", diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 95fa9266b7..53478fdcc5 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -125,8 +125,9 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll', }; function onMessagesParsed(html) { - var newMessage = $(html); - newMessage.insertBefore($('.user-typing')); + var newMessage = $(html), + chatContainer = $('.chat-content'); + newMessage.appendTo(chatContainer); newMessage.find('.timeago').timeago(); newMessage.find('img:not(".chat-user-image")').addClass('img-responsive'); Chats.scrollToBottom($('.expanded-chat .chat-content')); @@ -135,11 +136,13 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll', Chats.addSocketListeners = function() { socket.on('event:chats.receive', function(data) { var typingNotifEl = $('.user-typing'), - containerEl = $('.expanded-chat ul'); + containerEl = $('.expanded-chat ul'), + lastSpeaker = parseInt(containerEl.find('.chat-message').last().attr('data-uid'), 10); if (Chats.isCurrentChat(data.withUid)) { newMessage = data.self === 0; data.message.self = data.self; + data.message.newSet = lastSpeaker !== data.message.fromuid; Chats.parseMessage(data.message, onMessagesParsed); } else { $('.chats-list li[data-uid="' + data.withUid + '"]').addClass('unread'); @@ -148,22 +151,10 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll', }); socket.on('event:chats.userStartTyping', function(withUid) { - var typingNotifEl = $('.user-typing'); - - if (Chats.isCurrentChat(withUid)) { - typingNotifEl.removeClass('hide'); - } - $('.chats-list li[data-uid="' + withUid + '"]').addClass('typing'); }); socket.on('event:chats.userStopTyping', function(withUid) { - var typingNotifEl = $('.user-typing'); - - if (Chats.isCurrentChat(withUid)) { - typingNotifEl.addClass('hide'); - } - $('.chats-list li[data-uid="' + withUid + '"]').removeClass('typing'); }); @@ -173,7 +164,7 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll', }; Chats.resizeMainWindow = function() { - var messagesList = $('.expanded-chat ul'); + var messagesList = $('.expanded-chat .chat-content'); if (messagesList.length) { var margin = $('.expanded-chat ul').outerHeight(true) - $('.expanded-chat ul').height(), diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 9ccc434abf..41d178a413 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -80,9 +80,9 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra if (modal.is(":visible")) { taskbar.updateActive(modal.attr('UUID')); - Chats.scrollToBottom(modal.find('#chat-content')); + Chats.scrollToBottom(modal.find('.chat-content')); } else { - module.toggleNew(modal.attr('UUID'), true); + module.toggleNew(modal.attr('UUID'), true, true); } if (!isSelf && (!modal.is(":visible") || !app.isFocused)) { @@ -97,9 +97,10 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra } else { module.createModal({ username: username, - touid: data.withUid + touid: data.withUid, + silent: true }, function(modal) { - module.toggleNew(modal.attr('UUID'), true); + module.toggleNew(modal.attr('UUID'), true, true); if (!isSelf) { app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]'); sounds.play('chat-incoming'); @@ -110,7 +111,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra socket.on('event:chats.userStartTyping', function(withUid) { var modal = module.getModal(withUid); - var chatContent = modal.find('#chat-content'); + var chatContent = modal.find('.chat-content'); if (!chatContent.length) { return; } @@ -141,7 +142,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra } }); - callback(chats); + callback(null, chats); }); socket.on('event:chats.open', function(data) { @@ -233,7 +234,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra return; } - chatModal.find('#chat-content').css('height', module.calculateChatListHeight(chatModal)); + chatModal.find('.chat-content').css('height', module.calculateChatListHeight(chatModal)); }); chatModal.draggable({ @@ -311,8 +312,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra } }); - chatModal.find('.user-typing .text').translateText('[[modules:chat.user_typing, ' + data.username + ']]'); - taskbar.push('chat', chatModal.attr('UUID'), { title: data.username, touid: data.touid, @@ -374,7 +373,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra chatModal.removeClass('hide'); checkStatus(chatModal); taskbar.updateActive(uuid); - Chats.scrollToBottom(chatModal.find('#chat-content')); + Chats.scrollToBottom(chatModal.find('.chat-content')); module.bringModalToTop(chatModal); module.focusInput(chatModal); socket.emit('modules.chats.markRead', chatModal.attr('touid')); @@ -388,7 +387,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra module.enableMobileBehaviour = function(modalEl) { app.toggleNavbar(false); modalEl.attr('data-mobile', '1'); - var messagesEl = modalEl.find('#chat-content'); + var messagesEl = modalEl.find('.chat-content'); messagesEl.css('height', module.calculateChatListHeight(modalEl)); $(window).on('resize', function() { @@ -403,7 +402,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra module.calculateChatListHeight = function(modalEl) { var totalHeight = modalEl.find('.modal-content').outerHeight() - modalEl.find('.modal-header').outerHeight(), padding = parseInt(modalEl.find('.modal-body').css('padding-top'), 10) + parseInt(modalEl.find('.modal-body').css('padding-bottom'), 10), - contentMargin = parseInt(modalEl.find('#chat-content').css('margin-top'), 10) + parseInt(modalEl.find('#chat-content').css('margin-bottom'), 10), + contentMargin = parseInt(modalEl.find('.chat-content').css('margin-top'), 10) + parseInt(modalEl.find('.chat-content').css('margin-bottom'), 10), sinceHeight = modalEl.find('.since-bar').outerHeight(true), inputGroupHeight = modalEl.find('.input-group').outerHeight(); @@ -427,7 +426,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra function loadChatSince(chatModal, since, callback) { socket.emit('modules.chats.get', {touid: chatModal.attr('touid'), since: since}, function(err, messages) { - var chatContent = chatModal.find('#chat-content'); + var chatContent = chatModal.find('.chat-content'); chatContent.find('.chat-message').remove(); module.appendChatMessage(chatModal, messages, callback); }); @@ -458,14 +457,18 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra } module.appendChatMessage = function(chatModal, data, done) { - var chatContent = chatModal.find('#chat-content'), - typingNotif = chatModal.find('.user-typing'); + var chatContent = chatModal.find('.chat-content'), + lastSpeaker = parseInt(chatContent.find('.chat-message').last().attr('data-uid'), 10); + + if (!Array.isArray(data)) { + data.newSet = lastSpeaker !== data.fromuid; + } Chats.parseMessage(data, function(html) { var message = $(html); message.find('img:not(".chat-user-image")').addClass('img-responsive'); message.find('.timeago').timeago(); - message.insertBefore(typingNotif); + message.appendTo(chatContent); Chats.scrollToBottom(chatContent); if (typeof done === 'function') { diff --git a/public/src/modules/taskbar.js b/public/src/modules/taskbar.js index 58d3629c83..e664037c0d 100644 --- a/public/src/modules/taskbar.js +++ b/public/src/modules/taskbar.js @@ -74,7 +74,6 @@ define('taskbar', function() { }; taskbar.toggleNew = function(uuid, state, silent) { - console.log('TOGGLING'); var btnEl = taskbar.tasklist.find('[data-uuid="' + uuid + '"]'); btnEl.toggleClass('new', state); diff --git a/src/messaging.js b/src/messaging.js index 9edd99d836..bb1ce85182 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -164,6 +164,9 @@ var db = require('./database'), if (index > 0 && parseInt(message.timestamp, 10) > parseInt(messages[index-1].timestamp, 10) + (1000*60*5)) { // If it's been 5 minutes, this is a new set of messages message.newSet = true; + } else if (index > 0 && message.fromuid !== messages[index-1].fromuid) { + // If the previous message was from the other person, this is also a new set + message.newSet = true } return message; diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 7295efbb7f..093362c433 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -67,7 +67,7 @@ middleware.pageView = function(req, res, next) { }; middleware.pluginHooks = function(req, res, next) { - async.each(plugins.loadedHooks['filter:router.page'], function(hookObj, next) { + async.each(plugins.loadedHooks['filter:router.page'] || [], function(hookObj, next) { hookObj.method(req, res, next) }, function(req, res) { // If it got here, then none of the subscribed hooks did anything, or there were no hooks diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 6f2d364b0a..7ee8d59b0b 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -43,6 +43,10 @@ SocketGroups.leave = function(socket, data, callback) { return callback(new Error('[[error:invalid-uid]]')); } + if (data.groupName === 'administrators') { + return callback(new Error('[[error:cant-remove-self-as-admin]]')); + } + groups.leave(data.groupName, socket.uid, callback); }; @@ -131,7 +135,7 @@ function acceptRejectAll(type, socket, data, callback) { } ], callback); }); -}; +} SocketGroups.issueInvite = function(socket, data, callback) { if (!data) { diff --git a/src/socket.io/rooms.js b/src/socket.io/rooms.js index c32f9a5dc9..615d650cd6 100644 --- a/src/socket.io/rooms.js +++ b/src/socket.io/rooms.js @@ -39,19 +39,29 @@ rooms.broadcast = function(socket, room, msg, data, callback) { callback = callback || function() {}; + // Filter out socketIds that aren't actually connected + socketIds = socketIds.filter(function(id) { + return io.server.sockets.connected.hasOwnProperty(id); + }); + async.map(socketIds, function(id, next) { - var timeout; + var timeout, + timeoutPassed = false; + if (socket.id === id) { return setImmediate(next, null, []); } timeout = setTimeout(function() { + timeoutPassed = true; next(null, []); }, 500); - io.server.sockets.connected[id].emit(msg, data || {}, function(chats) { + io.server.sockets.connected[id].emit(msg, data || {}, function(err, returnData) { clearTimeout(timeout); - next(null, chats); + if (!timeoutPassed) { + next(null, returnData); + } }); }, callback); }; diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 6e9cafcf63..06ea14d9d7 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -97,7 +97,7 @@ SocketTopics.postcount = function(socket, tid, callback) { }; SocketTopics.markAsRead = function(socket, tids, callback) { - if(!Array.isArray(tids) || !socket.uid) { + if (!Array.isArray(tids) || !socket.uid) { return callback(new Error('[[error:invalid-data]]')); } @@ -123,14 +123,14 @@ SocketTopics.markAsRead = function(socket, tids, callback) { }; SocketTopics.markTopicNotificationsRead = function(socket, tid, callback) { - if(!tid || !socket.uid) { + if (!tid || !socket.uid) { return callback(new Error('[[error:invalid-data]]')); } topics.markTopicNotificationsRead(tid, socket.uid); }; SocketTopics.markAllRead = function(socket, data, callback) { - topics.getLatestTidsFromSet('topics:recent', 0, -1, 'day', function(err, tids) { + db.getSortedSetRevRangeByScore('topics:recent', 0, -1, '+inf', Date.now() - topics.unreadCutoff, function(err, tids) { if (err) { return callback(err); } diff --git a/src/topics/unread.js b/src/topics/unread.js index b0252d02ce..7abaf5ab4c 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -14,6 +14,8 @@ module.exports = function(Topics) { var unreadCutoff = 86400000 * 2; + Topics.unreadCutoff = unreadCutoff; + Topics.getTotalUnread = function(uid, callback) { Topics.getUnreadTids(0, uid, 0, 20, function(err, tids) { callback(err, tids ? tids.length : 0);