mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-22 23:42:54 +01:00
Merge branch 'master' of https://github.com/NodeBB/NodeBB
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "Отхвърляне"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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') {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user