From 6878466404d56ee43cee6898ee7964edb41c4256 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Tue, 24 May 2016 09:04:33 -0400 Subject: [PATCH 01/40] Latest translations and fallbacks --- public/language/et/email.json | 2 +- public/language/et/error.json | 16 +++--- public/language/et/global.json | 8 +-- public/language/et/groups.json | 4 +- public/language/et/login.json | 2 +- public/language/et/modules.json | 16 +++--- public/language/et/notifications.json | 8 +-- public/language/et/pages.json | 4 +- public/language/et/topic.json | 16 +++--- public/language/et/unread.json | 6 +-- public/language/et/uploads.json | 8 +-- public/language/et/user.json | 16 +++--- public/language/ro/category.json | 16 +++--- public/language/ro/email.json | 14 ++--- public/language/ro/global.json | 20 +++---- public/language/ro/groups.json | 74 +++++++++++++------------- public/language/ro/modules.json | 4 +- public/language/ro/notifications.json | 4 +- public/language/ro/pages.json | 12 ++--- public/language/ro/recent.json | 12 ++--- public/language/ro/reset_password.json | 2 +- public/language/ro/topic.json | 4 +- public/language/ro/unread.json | 6 +-- public/language/ro/uploads.json | 2 +- public/language/ro/user.json | 2 +- public/language/ro/users.json | 2 +- 26 files changed, 140 insertions(+), 140 deletions(-) diff --git a/public/language/et/email.json b/public/language/et/email.json index e87b35e247..03fa17fc9f 100644 --- a/public/language/et/email.json +++ b/public/language/et/email.json @@ -24,7 +24,7 @@ "digest.day": "päev", "digest.week": "nädal", "digest.month": "kuu", - "digest.subject": "Digest for %1", + "digest.subject": "Ima 1% jaoks", "notif.chat.subject": "Sulle on saabunud uus sõnum kasutajalt %1", "notif.chat.cta": "Vajuta siia, et jätkata vestlusega", "notif.chat.unsub.info": "See chat teavitus on saadetud teile tellimuse seadistuse tõttu.", diff --git a/public/language/et/error.json b/public/language/et/error.json index 6f7f2f54c4..62e3902f8a 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -14,7 +14,7 @@ "invalid-password": "Vigane parool", "invalid-username-or-password": "Palun täpsusta kasutajanime ja parooli", "invalid-search-term": "Vigane otsingusõna", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", + "csrf-invalid": "Me ei saanud Sind sisse logida, võimalik, et tänu aegunud sessioonile, palun proovi uuesti", "invalid-pagination-value": "Väär lehekülje numeratsioon, peab olema vähemalt %1 ja kõige rohkem %2", "username-taken": "Kasutajanimi on juba võetud", "email-taken": "Email on võetud", @@ -23,13 +23,13 @@ "no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email", "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.", "confirm-email-already-sent": "Kinnituskiri on juba saadetud, palun oota %1 minut(it) uue kirja saatmiseks.", - "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", + "sendmail-not-found": "Sendmail'i käivitatavat ei leitud, palun tee kindlaks, et see on installeeritud ja on käivitatav kasutaja poolt, kes käitab NodeBB't.", "username-too-short": "Kasutajanimi on liiga lühike", "username-too-long": "Kasutajanimi on liiga pikk", "password-too-long": "Parool liiga pikk", "user-banned": "Kasutaja bannitud", "user-too-new": "Vabandust, te peate ootama %1 sekund(it) enne esimese postituse loomist.", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Vabandust! Sinu IP-aadress on siin kogukonnas keelatud. Kui arvad, et see on eksitus, palun leia kontakti administraatoriga.", "no-category": "Kategooriat ei eksisteeri", "no-topic": "Teemat ei eksisteeri", "no-post": "Postitust ei eksisteeri", @@ -53,8 +53,8 @@ "still-uploading": "Palun oota, kuni üleslaadimised on laetud.", "file-too-big": "Maksimaalne üleslaetava faili suurus on %1 kB - valige väiksema mahuga fail.", "guest-upload-disabled": "Külaliste üleslaadimine on keelatud.", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Sa oled juba selle postituse järjehoidjatesse pannud.", + "already-unfavourited": "Sa oled juba selle postituse järjehoidjatest ära võtnud.", "cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!", "cant-remove-last-admin": "Te olete ainus administraator. Lisage keegi teine administraatoriks, enne kui eemaldate endalt administraatori.", "invalid-image-type": "Vigane pildi formaat. Lubatud formaadid on: %1", @@ -87,7 +87,7 @@ "cant-edit-chat-message": "Sul ei ole lubatud antud sõnumit muuta", "cant-remove-last-user": "Sa ei saa viimast kasutajat eemaldada", "cant-delete-chat-message": "Sul ei ole lubatud antud sõnumit kustutada", - "already-voting-for-this-post": "You have already voted for this post.", + "already-voting-for-this-post": "Sa oled juba hääletanud sellel postitusel.", "reputation-system-disabled": "Reputatsiooni süsteem ei ole aktiveeritud", "downvoting-disabled": "Negatiivsete häälte andmine ei ole võimaldatud", "not-enough-reputation-to-downvote": "Sul ei ole piisavalt reputatsiooni, et anda negatiivset hinnangut sellele postitusele.", @@ -101,6 +101,6 @@ "invite-maximum-met": "Sa oled kutsunud maksimaalse lubatud inimeste arvu (%1 %2 'st).", "no-session-found": "Sisse logimis sessiooni ei leitud!", "not-in-room": "Kasutaja pole ruumis", - "no-users-in-room": "No users in this room", - "cant-kick-self": "You can't kick yourself from the group" + "no-users-in-room": "Ühtegi kasutajat ei leidu siit ruumist", + "cant-kick-self": "Sa ei saa ennast ära visata gruppist" } \ No newline at end of file diff --git a/public/language/et/global.json b/public/language/et/global.json index f43dd9007a..93fdfd9a16 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -87,8 +87,8 @@ "map": "Kaart", "sessions": "Logitud Sessioonid", "ip_address": "IP Aadress", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "Sisesta lehekülje number", + "upload_file": "Lae fail üles", + "upload": "Lae üles", + "allowed-file-types": "Lubatud faili formaadid on %1" } \ No newline at end of file diff --git a/public/language/et/groups.json b/public/language/et/groups.json index db8dfce3d1..a78fc57db4 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -41,7 +41,7 @@ "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": "Kustuta grupp", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Privaatset gruppid on keelatud sellel süsteemi tasemel, see sätte ei tee midagi", "event.updated": "Grupi lisainformatsiooni on uuendatud", "event.deleted": "Grupp \"%1\" on kustutatud", "membership.accept-invitation": "Võta kutse vastu", @@ -50,5 +50,5 @@ "membership.leave-group": "Lahku grupist", "membership.reject": "Lükka tagasi", "new-group.group_name": "Grupi nimi:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Lae gruppi pilt üles" } \ No newline at end of file diff --git a/public/language/et/login.json b/public/language/et/login.json index 09a875ef4a..1ee4c2d703 100644 --- a/public/language/et/login.json +++ b/public/language/et/login.json @@ -5,7 +5,7 @@ "remember_me": "Mäleta mind?", "forgot_password": "Unustasid parooli?", "alternative_logins": "Alternatiivsed sisse logimise võimalused", - "failed_login_attempt": "Login Unsuccessful", + "failed_login_attempt": "Sisselogimine ebaõnnestus", "login_successful": "Edukalt sisse logitud!", "dont_have_account": "Pole veel kasutajat?" } \ No newline at end of file diff --git a/public/language/et/modules.json b/public/language/et/modules.json index 0df09f3b63..c4a2434ec1 100644 --- a/public/language/et/modules.json +++ b/public/language/et/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 kirjutab sõnumit...", "chat.user_has_messaged_you": "%1 saatis sulle sõnumi.", "chat.see_all": "Vaata kõiki vestluseid", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Märgi kõik jutud loetuks", "chat.no-messages": "Vali sõnumisaaja, et vaadata sõnumite ajalugu.", "chat.no-users-in-room": "Ühtki kasutajat selles ruumis", "chat.recent-chats": "Hiljutised vestlused", @@ -29,14 +29,14 @@ "composer.submit_and_lock": "Kinnita ja Lukusta", "composer.toggle_dropdown": "Aktiveeri rippmenüü", "composer.uploading": "%1 Üleslaadimine", - "composer.formatting.bold": "Bold", - "composer.formatting.italic": "Italic", - "composer.formatting.list": "List", - "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.bold": "Paksult", + "composer.formatting.italic": "Kaldkiri", + "composer.formatting.list": "Nimekiri", + "composer.formatting.strikethrough": "Läbitõmmatud", "composer.formatting.link": "Link", - "composer.formatting.picture": "Picture", - "composer.upload-picture": "Upload Image", - "composer.upload-file": "Upload File", + "composer.formatting.picture": "Pilt", + "composer.upload-picture": "Lae pilt üles", + "composer.upload-file": "Lae fail üles", "bootbox.ok": "Olgu", "bootbox.cancel": "Katkesta", "bootbox.confirm": "Kinnita", diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 11e2823a75..52319818af 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 ja %2 teist on kiitnud sinu postituse heaks: %3.", "moved_your_post": "%1 liigutas sinu postituse %2 'sse", "moved_your_topic": "%1 liigutas %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 pani Sinu postituse %2 järjehoidjatesse.", + "favourited_your_post_in_dual": "%1 ja %2 panid Sinu postituse %3 enda järjehoidjatesse.", + "favourited_your_post_in_multiple": "%1 ja %2 teist on Sinu postitust %3 järjehoidjasse lisanud.", "user_flagged_post_in": "%1 raporteeris postitust %2", "user_flagged_post_in_dual": "%1 ja %2 märgistasid postituse: %3", "user_flagged_post_in_multiple": "%1 ja %2 teist märgistasid postituse: %3", @@ -30,7 +30,7 @@ "user_started_following_you_dual": "%1 ja %2 hakkasid sind jälgima.", "user_started_following_you_multiple": "%1 ja %2 hakkasid sind jälgima.", "new_register": "%1 saatis registreerimistaotluse.", - "new_register_multiple": "There are %1 registration requests awaiting review.", + "new_register_multiple": "%1 registreerimistaotlust ootavad ülevaadet.", "email-confirmed": "Emaili aadress kinnitatud", "email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja on nüüd täielikult aktiveeritud.", "email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index f85b28ead0..24515767df 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -33,13 +33,13 @@ "account/posts": "Postitused, mis on tehtud kasutaja %1 poolt", "account/topics": "Teemad on kirjutanud %1", "account/groups": "Kasutaja %1 grupid", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "%1 järjehoidjad", "account/settings": "Kasutaja sätted", "account/watched": "Teemasid jälgib %1 kasutajat", "account/upvoted": "Postitused %1 poolt heaks kiidetud", "account/downvoted": "Postitused %1 poolt vastu hääletatud", "account/best": "Parimad postitused %1 poolt", - "confirm": "Email Confirmed", + "confirm": "Emaili aadress kinnitatud", "maintenance.text": "%1 foorumil on käimas hooldustööd. Palun külastage meid mõne aja pärast uuesti.", "maintenance.messageIntro": "Administraator on jätnud ka omaltpoolt sõnumi:", "throttled.text": "%1 ei ole hetkel kättesaadav liigse koormuse tõttu. Palun tulge tagasi mõni teine kord." diff --git a/public/language/et/topic.json b/public/language/et/topic.json index dd6b25ca24..a9024f4db7 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -26,13 +26,13 @@ "tools": "Tööriistad", "flag": "Märgista", "locked": "Lukustatud", - "bookmark_instructions": "Click here to return to the last read post in this thread.", + "bookmark_instructions": "Vajuta siia, et tagasi minna viimati loetud postituse juurde siin teemas.", "flag_title": "Märgista see postitus modereerimiseks", "flag_success": "See postitus on nüüd märgistatud modereerimiseks.", "deleted_message": "See teema on kustutatud. Ainult kasutajad kellel on piisavalt õigusi saavad seda näha.", "following_topic.message": "Sulle ei edastata enam teateid uutest postitustest kui keegi postitab siia teemasse.", "not_following_topic.message": "Sulle ei edastata enam teateid uutest postitustest siin teemas.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "ignoring_topic.message": "Sa ei näe seda teemat enam lugemata teemade nimekirjas. Sind teavitatakse, kui Sind mainitakse või Sinu postitust kiidetakse heaks.", "login_to_subscribe": "Palun registreeru kasutajaks või logi sisse, et tellida teateid selle postituse kohta.", "markAsUnreadForAll.success": "Teema märgitud mitte-loetuks kõikidele.", "mark_unread": "Märgi lugematuks", @@ -42,9 +42,9 @@ "watch.title": "Saa teateid uutest postitustest siin teemas", "unwatch.title": "Ära järgi enam seda teemat", "share_this_post": "Jaga seda postitust", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", + "watching": "Vaatan", + "not-watching": "Ei vaata", + "ignoring": "Ignoreerin", "watching.description": "Notify me of new replies.
Show topic in unread.", "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", "ignoring.description": "Do not notify me of new replies.
Do not show topic in unread.", @@ -72,9 +72,9 @@ "disabled_categories_note": "Kinnised kategooriad on hallid", "confirm_move": "Liiguta", "confirm_fork": "Fork", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Järjehoidja", + "favourites": "Järjehoidjad", + "favourites.has_no_favourites": "Sa ei ole ühtegi postitust pannud järjehoidjatesse veel.", "loading_more_posts": "Laen postitusi", "move_topic": "Liiguta teemat", "move_topics": "Liiguta teemasi", diff --git a/public/language/et/unread.json b/public/language/et/unread.json index 832d169fd4..169806bdb0 100644 --- a/public/language/et/unread.json +++ b/public/language/et/unread.json @@ -7,7 +7,7 @@ "all": "Kõik", "all_categories": "Kõik kategooriad", "topics_marked_as_read.success": "Teemad märgitud loetuks!", - "all-topics": "All Topics", - "new-topics": "New Topics", - "watched-topics": "Watched Topics" + "all-topics": "Kõik teemad", + "new-topics": "Uued teemad", + "watched-topics": "Vaadatud teemad" } \ No newline at end of file diff --git a/public/language/et/uploads.json b/public/language/et/uploads.json index 1622cb5693..feee146ab8 100644 --- a/public/language/et/uploads.json +++ b/public/language/et/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Laen faili üles...", + "select-file-to-upload": "Vali fail mida üles laadida!", + "upload-success": "Fail üles laetud edukalt!", + "maximum-file-size": "Maksimaalselt %1 kb" } \ No newline at end of file diff --git a/public/language/et/user.json b/public/language/et/user.json index ee556ae4e1..88809cc8a7 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -22,7 +22,7 @@ "profile": "Profiil", "profile_views": "Vaatamisi", "reputation": "Reputatsioon", - "favourites": "Bookmarks", + "favourites": "Järjehoidjad", "watched": "Vaadatud", "followers": "Jälgijad", "following": "Jälgimised", @@ -39,7 +39,7 @@ "change_username": "Vaheta kasutajanime", "change_email": "Vaheta emaili", "edit": "Muuda", - "edit-profile": "Edit Profile", + "edit-profile": "Redigeeri profiili", "default_picture": "Algne ikoon", "uploaded_picture": "Üleslaetud pilt", "upload_new_picture": "Laadi uus pilt", @@ -56,11 +56,11 @@ "password": "Parool", "username_taken_workaround": "Kasutajanimi mida soovisid, ei olnud saadaval, seeg muutsime seda natukene. Sinu uus kasutajanimi on nüüd: %1", "password_same_as_username": "Su parool kattub su kasutajanimega, palun vali mõni muu parool.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "Su parool kattub su e-mailiga, palun vali mõni muu parool.", "upload_picture": "Laadi pilt", "upload_a_picture": "Lae pilt üles", "remove_uploaded_picture": "Eemalda üleslaetud pilt", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Lae üles katte pilt", "settings": "Seaded", "show_email": "Näita minu emaili", "show_fullname": "Näita minu täisnime", @@ -92,12 +92,12 @@ "open_links_in_new_tab": "Ava väljaminevad lingid uues aknas", "enable_topic_searching": "Võimalda teemasisene otsing", "topic_search_help": "Kui see on sisse lükatud, siis teemasisene otsing võtab üle brauseri tavapärase otsingu ning võimaldab otsida ainult ekraanile mahtuva teema asemel terve teema ulatuses.", - "delay_image_loading": "Delay Image Loading", - "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", - "scroll_to_my_post": "After posting a reply, show the new post", + "delay_image_loading": "Viivita pildi laadimisega", + "image_load_delay_help": "Kui lubatud, pildid teemades ei lae kuni nad on nähtavuses", + "scroll_to_my_post": "Pärast vastuse postitamist, näita uut postitust", "follow_topics_you_reply_to": "Järgi teemasid, millele olete vastanud.", "follow_topics_you_create": "Järgi teemasi, mis on teie loodud.", - "grouptitle": "Group Title", + "grouptitle": "Grupi tiitel", "no-group-title": "Grupi tiitel puudub", "select-skin": "Vali välimus", "select-homepage": "Vali avaleht", diff --git a/public/language/ro/category.json b/public/language/ro/category.json index e525ac8878..1c3fe61fec 100644 --- a/public/language/ro/category.json +++ b/public/language/ro/category.json @@ -1,16 +1,16 @@ { - "category": "Category", - "subcategories": "Subcategories", + "category": "Categorie", + "subcategories": "Subcategorii", "new_topic_button": "Subiect Nou", - "guest-login-post": "Log in to post", + "guest-login-post": "Conecteaza-te pentru a posta", "no_topics": "Nu există nici un subiect de discuție în această categorie.
De ce nu încerci să postezi tu unul?", "browsing": "navighează", "no_replies": "Nu a răspuns nimeni", - "no_new_posts": "No new posts.", + "no_new_posts": "Nici o postare nouă", "share_this_category": "Distribuie această categorie", - "watch": "Watch", + "watch": "Urmărește", "ignore": "Ignoră", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category", - "watched-categories": "Watched categories" + "watch.message": "Urmăriți acum actualizări din această categorie", + "ignore.message": "Ignorați acum actualizări din această categorie", + "watched-categories": "Categorii urmărite" } \ No newline at end of file diff --git a/public/language/ro/email.json b/public/language/ro/email.json index b1a1f41d2f..e07033fd97 100644 --- a/public/language/ro/email.json +++ b/public/language/ro/email.json @@ -1,19 +1,19 @@ { "password-reset-requested": "Cererea de resetare a parolei a fost efectuată - %1!", "welcome-to": "Salutare lui %1", - "invite": "Invitation from %1", + "invite": "Invitație de la %1", "greeting_no_name": "Salut", "greeting_with_name": "Salut %1", "welcome.text1": "îți mulțumim că te-ai Înregistrat cu %1!", "welcome.text2": "Pentru a-ți activa cu success contul trebuie să verificăm adresa de email pe care ai folosit-o la înregistrare.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", "welcome.cta": "Apasă aici pentru a confirma adresa ta de email", - "invitation.text1": "%1 has invited you to join %2", + "invitation.text1": "%1 te-a invitat să te alături %2", "invitation.ctr": "Click here to create your account.", "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "Pentru a continua cu resetarea parolei, te rugăm sa apeși pe următorul link:", "reset.cta": "Apasă aici pentru a-ți reseta parola", - "reset.notify.subject": "Password successfully changed", + "reset.notify.subject": "Parola a fost schimbată cu succes", "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", @@ -21,10 +21,10 @@ "digest.cta": "Apasă aici pentru a vizita %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", "digest.no_topics": "There have been no active topics in the past %1", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", - "digest.subject": "Digest for %1", + "digest.day": "zi", + "digest.week": "saptămână", + "digest.month": "lună", + "digest.subject": "Rezumat pentru %1", "notif.chat.subject": "Ai primit un mesaj de la %1", "notif.chat.cta": "Apasă aici pentru a continua conversația", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", diff --git a/public/language/ro/global.json b/public/language/ro/global.json index 501638ec86..b79039789b 100644 --- a/public/language/ro/global.json +++ b/public/language/ro/global.json @@ -3,8 +3,8 @@ "search": "Căutare", "buttons.close": "Închide", "403.title": "Acces Interzis", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "Se pare că ai ajuns pe o pagină la care nu ai acces", + "403.login": "Poate ar trebui să te autentifici?", "404.title": "Nu a fost găsit", "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", "500.title": "Eroare internă.", @@ -49,7 +49,7 @@ "users": "Utilizatori", "topics": "Subiecte", "posts": "Mesaje", - "best": "Best", + "best": "Cel mai bun", "upvoted": "Upvoted", "downvoted": "Downvoted", "views": "Vizualizări", @@ -65,7 +65,7 @@ "posted_in_ago_by": "postat în %1 %2 de %3", "user_posted_ago": "%1 a postat %2", "guest_posted_ago": "Vizitator a postat %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "ultima editare de %1", "norecentposts": "Nici un mesaj recent", "norecenttopics": "Nici un subiect recent", "recentposts": "Mesaje Recente", @@ -85,10 +85,10 @@ "unfollow": "Nu mai urmări", "delete_all": "Şterge Tot", "map": "Hartă", - "sessions": "Login Sessions", - "ip_address": "IP Address", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "sessions": "Ședința de login", + "ip_address": "Adresa IP", + "enter_page_number": "Introdu numărul paginei", + "upload_file": "Încărcați fișierul", + "upload": "Încărcați", + "allowed-file-types": "Tipuri de fișiere permise sunt %1" } \ No newline at end of file diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index 60719c2bf9..b116606f87 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -1,54 +1,54 @@ { "groups": "Grupuri", "view_group": "Vezi Grup", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", - "pending.accept_all": "Accept All", - "pending.reject_all": "Reject All", - "pending.none": "There are no pending members at this time", - "invited.none": "There are no invited members at this time", - "invited.uninvite": "Rescind Invitation", + "owner": "Propietar de group", + "new_group": "Crează un grup nou", + "no_groups_found": "Nu sunt grupuri de văzut", + "pending.accept": "Acceptă", + "pending.reject": "Respinge", + "pending.accept_all": "Acceptă toate", + "pending.reject_all": "Respinge toate", + "pending.none": "Momentan nu există membrii în așteptare", + "invited.none": "Momentan nu există membrii invitați", + "invited.uninvite": "Anulează invitația", "invited.search": "Search for a user to invite to this group", - "invited.notification_title": "You have been invited to join %1", + "invited.notification_title": "Ai fost invitat să te alături %1", "request.notification_title": "Group Membership Request from %1", "request.notification_text": "%1 has requested to become a member of %2", - "cover-save": "Save", - "cover-saving": "Saving", + "cover-save": "Salvează", + "cover-saving": "Salvez", "details.title": "Detalii Grup", "details.members": "Listă Membrii", - "details.pending": "Pending Members", - "details.invited": "Invited Members", + "details.pending": "Membrii în așteptare", + "details.invited": "Membrii invitați", "details.has_no_posts": "Membrii acestui grup nu au facut nici o postare.", "details.latest_posts": "Ultimele Mesaje", - "details.private": "Private", + "details.private": "Privat", "details.disableJoinRequests": "Disable join requests", "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", - "details.owner_options": "Group Administration", - "details.group_name": "Group Name", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", + "details.owner_options": "Administrarea grupului", + "details.group_name": "Numele grupului", + "details.member_count": "Număr de membrii", + "details.creation_date": "Data creării", + "details.description": "Descriere", + "details.badge_preview": "Previzualizarea insignei", + "details.change_icon": "Schimbă icoana", + "details.change_colour": "Schimbă culoarea", + "details.badge_text": "Textul insignei", + "details.userTitleEnabled": "Arată insigna", "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", + "details.hidden": "Ascuns", "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", + "details.delete_group": "Șterge grupul", "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject", - "new-group.group_name": "Group Name:", - "upload-group-cover": "Upload group cover" + "event.updated": "Detaliile grupului au fost actualizate", + "event.deleted": "Grupul %1\" a fost șters", + "membership.accept-invitation": "Acceptă invitația", + "membership.invitation-pending": "Invitație in așteptare", + "membership.join-group": "Alăture-te grupului", + "membership.leave-group": "Părăsește grupul", + "membership.reject": "Respinge", + "new-group.group_name": "Numele grupului:", + "upload-group-cover": "Încarcă coperta de grup" } \ No newline at end of file diff --git a/public/language/ro/modules.json b/public/language/ro/modules.json index 7382e34154..fa79140b83 100644 --- a/public/language/ro/modules.json +++ b/public/language/ro/modules.json @@ -5,7 +5,7 @@ "chat.no_active": "Nu ai nici o conversație activă", "chat.user_typing": "%1 scrie ...", "chat.user_has_messaged_you": "%1 ți-a trimis un mesaj.", - "chat.see_all": "See all chats", + "chat.see_all": "Vezi toate conversațiile", "chat.mark_all_read": "Mark all chats read", "chat.no-messages": "Selectează un recipient pentru a vedea istoria mesajelor chat", "chat.no-users-in-room": "No users in this room", @@ -20,7 +20,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.roomname": "Chat Room %1", "chat.add-users-to-room": "Add users to room", - "composer.compose": "Compose", + "composer.compose": "Scrie", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 a spus în %2:", diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index 9684a7d9cc..79abb3f15c 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -1,11 +1,11 @@ { "title": "Notificări", "no_notifs": "Nu ai nici o notificare recentă", - "see_all": "See all notifications", + "see_all": "Vezi toate notificările", "mark_all_read": "Mark all notifications read", "back_to_home": "Înapoi la %1", "outgoing_link": "Link Extern", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "Părăsești acuma %1", "continue_to": "Continuă la %1", "return_to": "Întoarce-te la %1", "new_notification": "Notificare Nouă", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index b90accee42..3b57e3d986 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -1,24 +1,24 @@ { "home": "Acasă", "unread": "Subiecte Necitite", - "popular-day": "Popular topics today", + "popular-day": "Subiecte populare azi", "popular-week": "Popular topics this week", "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Subiecte Noi", "flagged-posts": "Flagged Posts", - "users/online": "Online Users", - "users/latest": "Latest Users", - "users/sort-posts": "Users with the most posts", + "users/online": "Utilizatori online", + "users/latest": "Ultimii membrii", + "users/sort-posts": "Membrii cu cele mai multe postări", "users/sort-reputation": "Users with the most reputation", "users/banned": "Banned Users", "users/search": "User Search", "notifications": "Notificări", "tags": "Taguri", "tag": "Topics tagged under \"%1\"", - "register": "Register an account", + "register": "Înregistrează un cont nou", "login": "Login to your account", - "reset": "Reset your account password", + "reset": "Resetează parola contului tău", "categories": "Categorii", "groups": "Grupuri", "group": "%1 group", diff --git a/public/language/ro/recent.json b/public/language/ro/recent.json index 5b657f39b1..7d6adfcb12 100644 --- a/public/language/ro/recent.json +++ b/public/language/ro/recent.json @@ -6,14 +6,14 @@ "year": "An", "alltime": "Tot Timpul", "no_recent_topics": "Nu există subiecte recente.", - "no_popular_topics": "There are no popular topics.", - "there-is-a-new-topic": "There is a new topic.", + "no_popular_topics": "Nu sunt subiecte populare.", + "there-is-a-new-topic": "Există un subiect nou.", "there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.", "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", "there-are-new-topics": "There are %1 new topics.", - "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", - "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", - "there-is-a-new-post": "There is a new post.", - "there-are-new-posts": "There are %1 new posts.", + "there-are-new-topics-and-a-new-post": "Exista %1 subiect nou și o postare nouă", + "there-are-new-topics-and-new-posts": "Exista %1 subiecte noi și %2 postări noi", + "there-is-a-new-post": "Exista o postare nouă", + "there-are-new-posts": "Există %1 postări noi", "click-here-to-reload": "Click here to reload." } \ No newline at end of file diff --git a/public/language/ro/reset_password.json b/public/language/ro/reset_password.json index 15800e2b55..02afb16f0c 100644 --- a/public/language/ro/reset_password.json +++ b/public/language/ro/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "Adresă de email invalidă / Adresa de email nu există!", "password_too_short": "The password entered is too short, please pick a different password.", "passwords_do_not_match": "The two passwords you've entered do not match.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "Parola ta a expirat, te rugăm alege altă parolă" } \ No newline at end of file diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index 83340e2e4b..37ca2d64c0 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -5,7 +5,7 @@ "no_topics_found": "Nu a fost găsit nici un subiect!", "no_posts_found": "Nu a fost găsit nici un mesaj!", "post_is_deleted": "Acest mesaj a fost șters!", - "topic_is_deleted": "This topic is deleted!", + "topic_is_deleted": "Acest subiect este șters!", "profile": "Profil", "posted_by": "Postat de %1", "posted_by_guest": "Postat de Vizitator", @@ -13,7 +13,7 @@ "notify_me": "Notică-mă de noi răspunsuri în acest subiect", "quote": "Citează", "reply": "Răspunde", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "Răspunde ca subiect", "guest-login-reply": "Log in to reply", "edit": "Editează", "delete": "Șterge", diff --git a/public/language/ro/unread.json b/public/language/ro/unread.json index c82e736759..7f77537dc6 100644 --- a/public/language/ro/unread.json +++ b/public/language/ro/unread.json @@ -5,9 +5,9 @@ "mark_as_read": "Marchează ca citit", "selected": "Selectate", "all": "Toate", - "all_categories": "All categories", + "all_categories": "Toate categoriile", "topics_marked_as_read.success": "Subiectele au fost marcate ca citite!", - "all-topics": "All Topics", - "new-topics": "New Topics", + "all-topics": "Toate subiectele", + "new-topics": "Subiecte noi", "watched-topics": "Watched Topics" } \ No newline at end of file diff --git a/public/language/ro/uploads.json b/public/language/ro/uploads.json index 1622cb5693..c104a65f68 100644 --- a/public/language/ro/uploads.json +++ b/public/language/ro/uploads.json @@ -2,5 +2,5 @@ "uploading-file": "Uploading the file...", "select-file-to-upload": "Select a file to upload!", "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "maximum-file-size": "Maxim %1 kB" } \ No newline at end of file diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 2a65e98896..5f310d1a75 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -12,7 +12,7 @@ "delete_account": "Șterge Cont", "delete_account_confirm": "Ești sigur ca vrei să îți ștergi contul?
Această acțiune este ireversibilă și nu o să mai fie posibil să îți recuperezi datele

Introdu numele tău de utilizator pentru a confirma că dorești să ștergi acest cont.", "delete_this_account_confirm": "Are you sure you want to delete this account?
This action is irreversible and you will not be able to recover any data

", - "account-deleted": "Account deleted", + "account-deleted": "Cont șters", "fullname": "Nume Întreg", "website": "Pagină Web", "location": "Locație", diff --git a/public/language/ro/users.json b/public/language/ro/users.json index 8f2cf6914c..6f05227dd0 100644 --- a/public/language/ro/users.json +++ b/public/language/ro/users.json @@ -7,7 +7,7 @@ "load_more": "Încarcă mai multe", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", - "online-only": "Online only", + "online-only": "Numai online", "invite": "Invită", "invitation-email-sent": "An invitation email has been sent to %1", "user_list": "Listă utilizatori", From 92ab2699ba28e8c223b838e00fd2999d81ec7f7e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 09:55:14 -0400 Subject: [PATCH 02/40] added some styling to allow mdl buttons to be stacked in ACP --- public/less/admin/admin.less | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index e733d8d9bd..3af3ded05d 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -50,12 +50,30 @@ color: @link-color; } + // .floating-button can either be a container or the button itself .floating-button { - background: @brand-primary !important; position: fixed; right: 30px; bottom: 30px; z-index: 1; + max-width: 56px; + + button { + &.primary { + background: @brand-primary !important; + } + + &.success { + background: @brand-success !important; + } + + &:not(:last-child) { + margin-bottom: 2rem; + } + } + } + button.floating-button { + background: @brand-primary !important; } .user-img { From afb0312f51d03c07edaae0cc49cf9afd509b5b84 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 10:37:45 -0400 Subject: [PATCH 03/40] closes #4672 --- src/controllers/users.js | 9 +++++++-- src/user.js | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/controllers/users.js b/src/controllers/users.js index 476766e7ba..c3dc8b0550 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -171,12 +171,17 @@ function render(req, res, data, next) { data.adminInviteOnly = registrationType === 'admin-invite-only'; data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; - user.getInvitesNumber(req.uid, function(err, num) { + async.parallel({ + numInvites: async.apply(user.getInvitesNumber, req.uid), + numUsers: async.apply(user.getUserCount) + }, function(err, meta) { if (err) { return next(err); } - data.invites = num; + res.append('X-Total-Count', meta.numUsers); + data.invites = meta.numInvites; + res.render('users', data); }); } diff --git a/src/user.js b/src/user.js index c7fb18e4fc..b222ae4a2b 100644 --- a/src/user.js +++ b/src/user.js @@ -33,6 +33,10 @@ var utils = require('../public/src/utils'); require('./user/invite')(User); require('./user/password')(User); + User.getUserCount = function(callback) { + db.sortedSetCount('username:uid', '-inf', '+inf', callback); + }; + User.updateLastOnlineTime = function(uid, callback) { callback = callback || function() {}; User.getUserFields(uid, ['status', 'lastonline'], function(err, userData) { From 79bcb9be109af9c0c2713c8b7e8ca5b43880a752 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 10:42:56 -0400 Subject: [PATCH 04/40] fixes #4675 --- loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader.js b/loader.js index b78abdc4a1..e853fa562c 100644 --- a/loader.js +++ b/loader.js @@ -171,7 +171,7 @@ function forkWorker(index, isPrimary) { } process.env.isPrimary = isPrimary; - process.env.isCluster = true; + process.env.isCluster = ports.length > 1 ? true : false; process.env.port = ports[index]; var worker = fork('app.js', [], { From dcb73f9647bd73acce0d0907d04d060e7fe05eb7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 24 May 2016 17:52:24 +0300 Subject: [PATCH 05/40] use userCount --- src/controllers/users.js | 10 ++++------ src/user.js | 4 ---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/controllers/users.js b/src/controllers/users.js index c3dc8b0550..c84de75b5b 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -126,6 +126,7 @@ usersController.getUsers = function(set, uid, page, callback) { loadmore_display: results.usersData.count > (stop - start + 1) ? 'block' : 'hide', users: results.usersData.users, pagination: pagination.create(page, pageCount), + userCount: results.usersData.count, title: setToTitles[set] || '[[pages:users/latest]]', breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs), setName: set, @@ -171,16 +172,13 @@ function render(req, res, data, next) { data.adminInviteOnly = registrationType === 'admin-invite-only'; data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; - async.parallel({ - numInvites: async.apply(user.getInvitesNumber, req.uid), - numUsers: async.apply(user.getUserCount) - }, function(err, meta) { + user.getInvitesNumber(req.uid, function(err, numInvites) { if (err) { return next(err); } - res.append('X-Total-Count', meta.numUsers); - data.invites = meta.numInvites; + res.append('X-Total-Count', data.userCount); + data.invites = numInvites; res.render('users', data); }); diff --git a/src/user.js b/src/user.js index b222ae4a2b..c7fb18e4fc 100644 --- a/src/user.js +++ b/src/user.js @@ -33,10 +33,6 @@ var utils = require('../public/src/utils'); require('./user/invite')(User); require('./user/password')(User); - User.getUserCount = function(callback) { - db.sortedSetCount('username:uid', '-inf', '+inf', callback); - }; - User.updateLastOnlineTime = function(uid, callback) { callback = callback || function() {}; User.getUserFields(uid, ['status', 'lastonline'], function(err, userData) { From 07c59ae174e8a995fb09f934460b2b96ecc06ad9 Mon Sep 17 00:00:00 2001 From: Nate Lee Date: Tue, 24 May 2016 10:02:27 -0700 Subject: [PATCH 06/40] changed cls.getItem to equal cls.get from cls.set based off of naming schema --- src/middleware/cls.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/cls.js b/src/middleware/cls.js index 0118fa998f..8cf0062d30 100644 --- a/src/middleware/cls.js +++ b/src/middleware/cls.js @@ -29,7 +29,7 @@ var namespace = continuationLocalStorage.createNamespace(APP_NAMESPACE); }; cls.setItem = cls.set; - cls.getItem = cls.set; + cls.getItem = cls.get; cls.namespace = namespace; cls.continuationLocalStorage = continuationLocalStorage; From 60af3b9b7746557cf72a4c2d07cc97e2bd070305 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 21:14:14 -0400 Subject: [PATCH 07/40] removed extra comma in object definition --- public/src/admin/manage/category-analytics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/admin/manage/category-analytics.js b/public/src/admin/manage/category-analytics.js index 52a24ecfeb..d9f38ed259 100644 --- a/public/src/admin/manage/category-analytics.js +++ b/public/src/admin/manage/category-analytics.js @@ -80,7 +80,7 @@ define('admin/manage/category-analytics', [], function() { data: ajaxify.data.analytics['posts:daily'] } ] - }, + } }; hourlyCanvas.width = $(hourlyCanvas).parent().width(); From 149565169bc2fd9f92389c61c65da2528b4fcd70 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 22:01:46 -0400 Subject: [PATCH 08/40] closes #4658 --- public/src/admin/advanced/errors.js | 64 +++++++++++++++++++ public/src/admin/manage/category-analytics.js | 4 +- src/analytics.js | 7 ++ src/controllers/admin.js | 1 + src/controllers/admin/errors.js | 20 ++++++ src/controllers/index.js | 2 + src/meta.js | 1 + src/meta/errors.js | 36 +++++++++++ src/middleware/middleware.js | 1 + src/routes/admin.js | 1 + src/views/admin/advanced/errors.tpl | 61 ++++++++++++++++++ src/views/admin/partials/menu.tpl | 2 + 12 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 public/src/admin/advanced/errors.js create mode 100644 src/controllers/admin/errors.js create mode 100644 src/meta/errors.js create mode 100644 src/views/admin/advanced/errors.tpl diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js new file mode 100644 index 0000000000..1713311eb7 --- /dev/null +++ b/public/src/admin/advanced/errors.js @@ -0,0 +1,64 @@ +"use strict"; +/*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */ + +define('admin/advanced/errors', ['Chart'], function(Chart) { + var Errors = {}; + + Errors.init = function() { + var notFoundCanvas = document.getElementById('not-found'), + tooBusyCanvas = document.getElementById('toobusy'), + dailyLabels = utils.getDaysArray(); + + dailyLabels.length = 7; + + if (utils.isMobile()) { + Chart.defaults.global.showTooltips = false; + } + + var data = { + 'not-found': { + labels: dailyLabels, + datasets: [ + { + label: "", + fillColor: "rgba(186,139,175,0.2)", + strokeColor: "rgba(186,139,175,1)", + pointColor: "rgba(186,139,175,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(186,139,175,1)", + data: ajaxify.data.analytics['not-found'] + } + ] + }, + 'toobusy': { + labels: dailyLabels, + datasets: [ + { + label: "", + fillColor: "rgba(151,187,205,0.2)", + strokeColor: "rgba(151,187,205,1)", + pointColor: "rgba(151,187,205,1)", + pointStrokeColor: "#fff", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(151,187,205,1)", + data: ajaxify.data.analytics['toobusy'] + } + ] + } + }; + + notFoundCanvas.width = $(notFoundCanvas).parent().width(); + tooBusyCanvas.width = $(tooBusyCanvas).parent().width(); + new Chart(notFoundCanvas.getContext('2d')).Line(data['not-found'], { + responsive: true, + animation: false + }); + new Chart(tooBusyCanvas.getContext('2d')).Line(data['toobusy'], { + responsive: true, + animation: false + }); + }; + + return Errors; +}); \ No newline at end of file diff --git a/public/src/admin/manage/category-analytics.js b/public/src/admin/manage/category-analytics.js index d9f38ed259..cf78cfa5e3 100644 --- a/public/src/admin/manage/category-analytics.js +++ b/public/src/admin/manage/category-analytics.js @@ -1,7 +1,7 @@ "use strict"; -/*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */ +/*global config, define, app, socket, ajaxify, bootbox, templates, utils */ -define('admin/manage/category-analytics', [], function() { +define('admin/manage/category-analytics', ['Chart'], function(Chart) { var CategoryAnalytics = {}; CategoryAnalytics.init = function() { diff --git a/src/analytics.js b/src/analytics.js index c1ede42eba..bbb1c06794 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -187,4 +187,11 @@ var db = require('./database'); }, callback); }; + Analytics.getErrorAnalytics = function(callback) { + async.parallel({ + 'not-found': async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:404', Date.now(), 7), + 'toobusy': async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:503', Date.now(), 7) + }, callback); + }; + }(exports)); \ No newline at end of file diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 2bba60cae6..c3ce96d205 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -14,6 +14,7 @@ var adminController = { }, events: require('./admin/events'), logs: require('./admin/logs'), + errors: require('./admin/errors'), database: require('./admin/database'), postCache: require('./admin/postCache'), plugins: require('./admin/plugins'), diff --git a/src/controllers/admin/errors.js b/src/controllers/admin/errors.js new file mode 100644 index 0000000000..d5ce5a1b76 --- /dev/null +++ b/src/controllers/admin/errors.js @@ -0,0 +1,20 @@ +'use strict'; + +var async = require('async'); + +var meta = require('../../meta'), + analytics = require('../../analytics'); + +var errorsController = {}; + +errorsController.get = function(req, res) { + async.parallel({ + 'not-found': async.apply(meta.errors.get), + analytics: async.apply(analytics.getErrorAnalytics) + }, function(err, data) { + res.render('admin/advanced/errors', data); + }); +}; + + +module.exports = errorsController; \ No newline at end of file diff --git a/src/controllers/index.js b/src/controllers/index.js index 09f156b19d..26b7527ce9 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -373,12 +373,14 @@ Controllers.handle404 = function(req, res) { } else if (isLanguage.test(req.url)) { res.status(200).json({}); } else if (req.path.startsWith(relativePath + '/uploads') || (req.get('accept') && req.get('accept').indexOf('text/html') === -1) || req.path === '/favicon.ico') { + meta.errors.log404(req.path || ''); res.sendStatus(404); } else if (req.accepts('html')) { if (process.env.NODE_ENV === 'development') { winston.warn('Route requested but not found: ' + req.url); } + meta.errors.log404(req.path.replace(/^\/api/, '') || ''); res.status(404); if (res.locals.isAPI) { diff --git a/src/meta.js b/src/meta.js index eb5816fdaf..3806c69556 100644 --- a/src/meta.js +++ b/src/meta.js @@ -24,6 +24,7 @@ var async = require('async'), require('./meta/sounds')(Meta); require('./meta/settings')(Meta); require('./meta/logs')(Meta); + require('./meta/errors')(Meta); require('./meta/tags')(Meta); require('./meta/dependencies')(Meta); Meta.templates = require('./meta/templates'); diff --git a/src/meta/errors.js b/src/meta/errors.js new file mode 100644 index 0000000000..5582d537b8 --- /dev/null +++ b/src/meta/errors.js @@ -0,0 +1,36 @@ +'use strict'; + +var async = require('async'), + winston = require('winston'), + validator = require('validator'); + +var db = require('../database'), + analytics = require('../analytics'); + +module.exports = function(Meta) { + + Meta.errors = {}; + + Meta.errors.log404 = function(route, callback) { + callback = callback || function() {}; + route = route.replace(/\/$/, ''); // remove trailing slashes + analytics.increment('errors:404'); + db.sortedSetIncrBy('errors:404', 1, route, callback); + }; + + Meta.errors.get = function(callback) { + db.getSortedSetRevRangeByScoreWithScores('errors:404', 0, -1, '+inf', '-inf', function(err, data) { + data = data.map(function(nfObject) { + nfObject.value = validator.escape(nfObject.value); + return nfObject; + }); + + callback(null, data); + }); + }; + + Meta.errors.clear = function(callback) { + console.log('clear errors'); + callback(); + }; +}; diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 9267289d3f..7409bd1577 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -302,6 +302,7 @@ middleware.privateUploads = function(req, res, next) { middleware.busyCheck = function(req, res, next) { if (global.env === 'production' && (!meta.config.hasOwnProperty('eventLoopCheckEnabled') || parseInt(meta.config.eventLoopCheckEnabled, 10) === 1) && toobusy()) { + analytics.increment('errors:503'); res.status(503).type('text/html').sendFile(path.join(__dirname, '../../public/503.html')); } else { next(); diff --git a/src/routes/admin.js b/src/routes/admin.js index 66391053a7..9767c26e9d 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -82,6 +82,7 @@ function addRoutes(router, middleware, controllers) { router.get('/advanced/database', middlewares, controllers.admin.database.get); router.get('/advanced/events', middlewares, controllers.admin.events.get); router.get('/advanced/logs', middlewares, controllers.admin.logs.get); + router.get('/advanced/errors', middlewares, controllers.admin.errors.get); router.get('/advanced/post-cache', middlewares, controllers.admin.postCache.get); router.get('/development/logger', middlewares, controllers.admin.logger.get); diff --git a/src/views/admin/advanced/errors.tpl b/src/views/admin/advanced/errors.tpl new file mode 100644 index 0000000000..996f71f818 --- /dev/null +++ b/src/views/admin/advanced/errors.tpl @@ -0,0 +1,61 @@ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
404 Not Found
+
+ + + + + + + + + + + + + + + + + + +
RouteCount
{../value}{../score}
+
+ Hooray! There are no routes that were not found. +
+
+
+
+
+
+
+
Manage Error Log
+
+
+ + +
+
+
+
+
diff --git a/src/views/admin/partials/menu.tpl b/src/views/admin/partials/menu.tpl index 8d0f0f853d..c68a470d4f 100644 --- a/src/views/admin/partials/menu.tpl +++ b/src/views/admin/partials/menu.tpl @@ -95,6 +95,7 @@
  • Database
  • Events
  • Logs
  • +
  • Errors
  • Post Cache
  • Logger
  • @@ -247,6 +248,7 @@
  • Database
  • Events
  • Logs
  • +
  • Errors
  • Post Cache
  • Logger
  • From ba412f4a56853b2d3c418a317626bcd21d439059 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 May 2016 23:04:57 -0400 Subject: [PATCH 09/40] fully completed #4658 --- package.json | 3 ++- public/src/admin/advanced/errors.js | 17 +++++++++++++++++ src/controllers/admin/errors.js | 14 ++++++++++++-- src/meta/errors.js | 7 +++---- src/routes/admin.js | 1 + src/socket.io/admin.js | 8 +++++++- src/views/admin/advanced/errors.tpl | 2 +- 7 files changed, 43 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 96a5c0eaaa..ce3674ef2f 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "html-to-text": "2.0.0", "ip": "1.1.2", "jimp": "0.2.21", + "json-2-csv": "^2.0.22", "less": "^2.0.0", "logrotate-stream": "^0.2.3", "lru-cache": "4.0.0", @@ -49,8 +50,8 @@ "nconf": "~0.8.2", "nodebb-plugin-composer-default": "3.0.31", "nodebb-plugin-dbsearch": "1.0.1", - "nodebb-plugin-emoji-one": "1.1.3", "nodebb-plugin-emoji-extended": "1.1.0", + "nodebb-plugin-emoji-one": "1.1.3", "nodebb-plugin-markdown": "5.1.5", "nodebb-plugin-mentions": "1.1.1", "nodebb-plugin-soundpack-default": "0.1.6", diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js index 1713311eb7..96b17fbe40 100644 --- a/public/src/admin/advanced/errors.js +++ b/public/src/admin/advanced/errors.js @@ -5,6 +5,23 @@ define('admin/advanced/errors', ['Chart'], function(Chart) { var Errors = {}; Errors.init = function() { + Errors.setupCharts(); + + $('[data-action="clear"]').on('click', Errors.clear404); + }; + + Errors.clear404 = function() { + bootbox.confirm('Are you sure you wish to clear the 404 error logs?', function(ok) { + if (ok) { + socket.emit('admin.errors.clear', {}, function(err) { + ajaxify.refresh(); + app.alertSuccess('"404 Not Found" errors cleared'); + }); + } + }); + }; + + Errors.setupCharts = function() { var notFoundCanvas = document.getElementById('not-found'), tooBusyCanvas = document.getElementById('toobusy'), dailyLabels = utils.getDaysArray(); diff --git a/src/controllers/admin/errors.js b/src/controllers/admin/errors.js index d5ce5a1b76..4b59932965 100644 --- a/src/controllers/admin/errors.js +++ b/src/controllers/admin/errors.js @@ -1,6 +1,7 @@ 'use strict'; -var async = require('async'); +var async = require('async'), + json2csv = require('json-2-csv').json2csv; var meta = require('../../meta'), analytics = require('../../analytics'); @@ -9,12 +10,21 @@ var errorsController = {}; errorsController.get = function(req, res) { async.parallel({ - 'not-found': async.apply(meta.errors.get), + 'not-found': async.apply(meta.errors.get, true), analytics: async.apply(analytics.getErrorAnalytics) }, function(err, data) { res.render('admin/advanced/errors', data); }); }; +errorsController.export = function(req, res) { + async.waterfall([ + async.apply(meta.errors.get, false), + async.apply(json2csv) + ], function(err, csv) { + res.set('Content-Type', 'text/csv').set('Content-Disposition', 'attachment; filename="404.csv"').send(csv); + }); +}; + module.exports = errorsController; \ No newline at end of file diff --git a/src/meta/errors.js b/src/meta/errors.js index 5582d537b8..4449a55f57 100644 --- a/src/meta/errors.js +++ b/src/meta/errors.js @@ -18,10 +18,10 @@ module.exports = function(Meta) { db.sortedSetIncrBy('errors:404', 1, route, callback); }; - Meta.errors.get = function(callback) { + Meta.errors.get = function(escape, callback) { db.getSortedSetRevRangeByScoreWithScores('errors:404', 0, -1, '+inf', '-inf', function(err, data) { data = data.map(function(nfObject) { - nfObject.value = validator.escape(nfObject.value); + nfObject.value = escape ? validator.escape(nfObject.value) : nfObject.value; return nfObject; }); @@ -30,7 +30,6 @@ module.exports = function(Meta) { }; Meta.errors.clear = function(callback) { - console.log('clear errors'); - callback(); + db.delete('errors:404', callback); }; }; diff --git a/src/routes/admin.js b/src/routes/admin.js index 9767c26e9d..521f0194bf 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -83,6 +83,7 @@ function addRoutes(router, middleware, controllers) { router.get('/advanced/events', middlewares, controllers.admin.events.get); router.get('/advanced/logs', middlewares, controllers.admin.logs.get); router.get('/advanced/errors', middlewares, controllers.admin.errors.get); + router.get('/advanced/errors/export', middlewares, controllers.admin.errors.export); router.get('/advanced/post-cache', middlewares, controllers.admin.postCache.get); router.get('/development/logger', middlewares, controllers.admin.logger.get); diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 6dd22134ba..8a1df2931e 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -33,7 +33,8 @@ var async = require('async'), settings: {}, email: {}, analytics: {}, - logs: {} + logs: {}, + errors: {} }; SocketAdmin.before = function(socket, method, data, next) { @@ -255,6 +256,11 @@ SocketAdmin.logs.clear = function(socket, data, callback) { meta.logs.clear(callback); }; +SocketAdmin.errors.clear = function(socket, data, callback) { + console.log('clearing errors?'); + meta.errors.clear(callback); +}; + SocketAdmin.getMoreEvents = function(socket, next, callback) { var start = parseInt(next, 10); if (start < 0) { diff --git a/src/views/admin/advanced/errors.tpl b/src/views/admin/advanced/errors.tpl index 996f71f818..67eea3084e 100644 --- a/src/views/admin/advanced/errors.tpl +++ b/src/views/admin/advanced/errors.tpl @@ -52,7 +52,7 @@
    Manage Error Log
    - + Export Error Log (CSV)
    From 2c5464760d3f62ac63d8747760995e5ef47ac4fa Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 25 May 2016 15:48:53 +0300 Subject: [PATCH 10/40] #4668 allow admins/mods to edit even after postEditDuration has expired --- public/src/client/topic/postTools.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 98b6ef1470..fa2a72e617 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -168,33 +168,33 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator postContainer.on('click', '[component="post/edit"]', function() { var btn = $(this); - + var timestamp = parseInt(getData(btn, 'data-timestamp'), 10); var postEditDuration = parseInt(ajaxify.data.postEditDuration, 10); - if (postEditDuration && Date.now() - timestamp > postEditDuration * 1000) { - var numDays = Math.floor(postEditDuration / 86400); + if (!ajaxify.data.privileges.isAdminOrMod && postEditDuration && Date.now() - timestamp > postEditDuration * 1000) { + var numDays = Math.floor(postEditDuration / 86400); var numHours = Math.floor((postEditDuration % 86400) / 3600); var numMinutes = Math.floor(((postEditDuration % 86400) % 3600) / 60); var numSeconds = ((postEditDuration % 86400) % 3600) % 60; var msg = '[[error:post-edit-duration-expired, ' + postEditDuration + ']]'; if (numDays) { if (numHours) { - msg = '[[error:post-edit-duration-expired-days-hours, ' + numDays + ', ' + numHours + ']]'; + msg = '[[error:post-edit-duration-expired-days-hours, ' + numDays + ', ' + numHours + ']]'; } else { msg = '[[error:post-edit-duration-expired-days, ' + numDays + ']]'; - } + } } else if (numHours) { if (numMinutes) { - msg = '[[error:post-edit-duration-expired-hours-minutes, ' + numHours + ', ' + numMinutes + ']]'; + msg = '[[error:post-edit-duration-expired-hours-minutes, ' + numHours + ', ' + numMinutes + ']]'; } else { msg = '[[error:post-edit-duration-expired-hours, ' + numHours + ']]'; - } + } } else if (numMinutes) { if (numSeconds) { - msg = '[[error:post-edit-duration-expired-minutes-seconds, ' + numMinutes + ', ' + numSeconds + ']]'; + msg = '[[error:post-edit-duration-expired-minutes-seconds, ' + numMinutes + ', ' + numSeconds + ']]'; } else { msg = '[[error:post-edit-duration-expired-minutes, ' + numMinutes + ']]'; - } + } } return app.alertError(msg); } From e8906fd9f68daab23f8f96d53216021f90ea6464 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Wed, 25 May 2016 09:03:22 -0400 Subject: [PATCH 11/40] Latest translations and fallbacks --- public/language/fr/error.json | 2 +- public/language/gl/error.json | 2 +- public/language/gl/topic.json | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 4772cba4c9..d2489a9094 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -14,7 +14,7 @@ "invalid-password": "Mot de passe invalide", "invalid-username-or-password": "Veuillez entrer un nom d'utilisateur et un mot de passe", "invalid-search-term": "Données de recherche invalides", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", + "csrf-invalid": "Nous ne pouvons pas vous connectez, possiblement car votre session a expiré. Merci de réessayer.", "invalid-pagination-value": "Valeur de pagination invalide. Celle-ci doit être comprise entre %1 et %2.", "username-taken": "Nom d’utilisateur déjà utilisé", "email-taken": "Email déjà utilisé", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 7f5c47fee7..910ae77dfd 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -14,7 +14,7 @@ "invalid-password": "Contrasinal Inválido", "invalid-username-or-password": "Especifica ámbolos dous por favor, nome de usuario e contrasinal", "invalid-search-term": "Termo de búsqueda inválido", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", + "csrf-invalid": "Non fomos capaces de entrar, probablemente debido a que a sesión expirou. Por favor, téntao de novo", "invalid-pagination-value": "Valor de paxinación incorreto, ten que estar entre %1 e %2", "username-taken": "Nome de usuario en uso", "email-taken": "Correo en uso", diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index f83cc7ee34..24004ac1fd 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -32,7 +32,7 @@ "deleted_message": "Este tema foi borrado. Só os usuarios con privilexios administrativos poden velo.", "following_topic.message": "Agora recibirás notificacións cando alguén publique neste tema.", "not_following_topic.message": "Non recibirás notificacións deste tema.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "ignoring_topic.message": "Xa non verás este fío na lista de fíos non lidos. Serás notificado cando sexas mencionado ou a túa publicación sexa votada.", "login_to_subscribe": "Por favor, identifícate para subscribirte a este tema.", "markAsUnreadForAll.success": "Publicación marcada como non lida para todos.", "mark_unread": "Marcar coma non lido", @@ -42,12 +42,12 @@ "watch.title": "Serás notificado canto haxa novas respostas neste tema", "unwatch.title": "Deixar de vixiar este tema", "share_this_post": "Compartir esta publicación", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", - "watching.description": "Notify me of new replies.
    Show topic in unread.", - "not-watching.description": "Do not notify me of new replies.
    Show topic in unread if category is not ignored.", - "ignoring.description": "Do not notify me of new replies.
    Do not show topic in unread.", + "watching": "Vendo", + "not-watching": "Non Vendo", + "ignoring": "Ignorar", + "watching.description": "Notificádeme das novas repostas.
    Amosa-lo fío nos non lidos.", + "not-watching.description": "Non me notifiquedes as novas respostas.
    Amosa-lo fío en non lidos se a categoría non está ignorada.", + "ignoring.description": "Non me notifiquedes as novas respostas.
    Non amosa-lo fío en non lidos.", "thread_tools.title": "Ferramentas do tema", "thread_tools.markAsUnreadForAll": "Marcar como non lido", "thread_tools.pin": "Fixar Tema", From 8ddcc237a71af34408386e0593f9b6c07e077a69 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 25 May 2016 19:33:46 +0300 Subject: [PATCH 12/40] removed submit and lock --- src/socket.io/posts.js | 4 ---- src/socket.io/topics.js | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 90163c532c..90d7a79284 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -52,10 +52,6 @@ SocketPosts.reply = function(socket, data, callback) { user.updateOnlineUsers(socket.uid); socketHelpers.notifyNew(socket.uid, 'newPost', result); - - if (data.lock) { - socketTopics.doTopicAction('lock', 'event:topic_locked', socket, {tids: [postData.topic.tid], cid: postData.topic.cid}); - } }); }; diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 451a1d0dce..0b8c170d8e 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -36,10 +36,6 @@ SocketTopics.post = function(socket, data, callback) { return callback(err); } - if (data.lock) { - SocketTopics.doTopicAction('lock', 'event:topic_locked', socket, {tids: [result.topicData.tid], cid: result.topicData.cid}); - } - callback(null, result.topicData); socket.emit('event:new_post', {posts: [result.postData]}); From 6c5cc5a513921758cbb912471a2f38853e0d72b6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 25 May 2016 19:36:38 +0300 Subject: [PATCH 13/40] up composer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ce3674ef2f..8ae4b4261f 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.31", + "nodebb-plugin-composer-default": "3.0.32", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.1.0", "nodebb-plugin-emoji-one": "1.1.3", From bdc23b4a8d42b19126858d6d6256e54b1711ba73 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 25 May 2016 20:17:02 +0300 Subject: [PATCH 14/40] add reputation to app.user --- src/middleware/header.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/middleware/header.js b/src/middleware/header.js index c1ed6d60c2..dccefcddf7 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -77,17 +77,21 @@ module.exports = function(app, middleware) { user.isGlobalModerator(req.uid, next); }, user: function(next) { + var userData = { + uid: 0, + username: '[[global:guest]]', + userslug: '', + email: '', + picture: meta.config.defaultAvatar, + status: 'offline', + banned: false, + reputation: 0, + 'email:confirmed': false + }; if (req.uid) { - user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next); + user.getUserFields(req.uid, Object.keys(userData), next); } else { - next(null, { - username: '[[global:guest]]', - userslug: '', - picture: meta.config.defaultAvatar, - status: 'offline', - banned: false, - uid: 0 - }); + next(null, userData); } }, navigation: async.apply(navigation.get), From 7c47f555be79de5cfb62e0e20dfb4581cf5cf51e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 25 May 2016 20:20:36 +0300 Subject: [PATCH 15/40] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ae4b4261f..2838c78696 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.12", - "nodebb-theme-persona": "4.0.142", + "nodebb-theme-persona": "4.0.143", "nodebb-theme-vanilla": "5.0.78", "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", From 920bc213d30ee100d92ccfa629fa24ae44d5f38b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 14:01:58 -0400 Subject: [PATCH 16/40] updated acp advanced/errors table to span the entire page --- src/views/admin/advanced/errors.tpl | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/views/admin/advanced/errors.tpl b/src/views/admin/advanced/errors.tpl index 67eea3084e..d3c23e78b7 100644 --- a/src/views/admin/advanced/errors.tpl +++ b/src/views/admin/advanced/errors.tpl @@ -18,6 +18,22 @@ + +
    +
    +
    Manage Error Log
    +
    +
    + Export Error Log (CSV) + +
    +
    +
    +
    + + +
    +
    404 Not Found
    @@ -47,15 +63,4 @@
    -
    -
    -
    Manage Error Log
    -
    -
    - Export Error Log (CSV) - -
    -
    -
    -
    -
    + \ No newline at end of file From 17b4dd85e7d35b343134483265a9a6aa93639942 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 25 May 2016 21:18:14 +0300 Subject: [PATCH 17/40] use valueToString in sortedSetIncrBy --- src/database/mongo/sorted.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index d8a9205ce0..9e9f72969e 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -520,7 +520,7 @@ module.exports = function(db, module) { return callback(); } var data = {}; - value = helpers.fieldToString(value); + value = helpers.valueToString(value); data.score = parseInt(increment, 10); db.collection('objects').findAndModify({_key: key, value: value}, {}, {$inc: data}, {new: true, upsert: true}, function(err, result) { From b5ced1db0fdfcbd4c362bd0d0634fd5de6ac4fe1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 14:57:31 -0400 Subject: [PATCH 18/40] upped composer version to MIT version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2838c78696..b0e00bb2b0 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.32", + "nodebb-plugin-composer-default": "4.0.0", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.1.0", "nodebb-plugin-emoji-one": "1.1.3", From a8f5000247857d7204ef98005695153b002e58cf Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 15:25:01 -0400 Subject: [PATCH 19/40] advising restart instead of reload on plugin toggle @pichalite --- public/src/admin/extend/plugins.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index 0cca29bef8..b4e8767184 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -31,12 +31,12 @@ define('admin/extend/plugins', function() { app.alert({ alert_id: 'plugin_toggled', title: 'Plugin ' + (status.active ? 'Enabled' : 'Disabled'), - message: status.active ? 'Please reload your NodeBB to fully activate this plugin' : 'Plugin successfully deactivated', + message: status.active ? 'Please restart your NodeBB to fully activate this plugin' : 'Plugin successfully deactivated', type: status.active ? 'warning' : 'success', timeout: 5000, clickfn: function() { require(['admin/modules/instance'], function(instance) { - instance.reload(); + instance.restart(); }); } }); From b4d14ef3661b4a6a17ba5e95e14972c47f248c62 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 15:28:37 -0400 Subject: [PATCH 20/40] fixes #4687 --- public/src/admin/advanced/errors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js index 96b17fbe40..2e72bcceb5 100644 --- a/public/src/admin/advanced/errors.js +++ b/public/src/admin/advanced/errors.js @@ -26,7 +26,7 @@ define('admin/advanced/errors', ['Chart'], function(Chart) { tooBusyCanvas = document.getElementById('toobusy'), dailyLabels = utils.getDaysArray(); - dailyLabels.length = 7; + dailyLabels = dailyLabels.slice(-7); if (utils.isMobile()) { Chart.defaults.global.showTooltips = false; From 8f665b65d1b62ff8f464a33f1fc2f1ccece1c85f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 15:39:07 -0400 Subject: [PATCH 21/40] up persona, #4661 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0e00bb2b0..ce7447adbe 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.12", - "nodebb-theme-persona": "4.0.143", + "nodebb-theme-persona": "4.0.144", "nodebb-theme-vanilla": "5.0.78", "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", From 2a5efd1a6000389f52964fa6391f358f197f3e7d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 15:57:43 -0400 Subject: [PATCH 22/40] up persona, closes #4646 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ce7447adbe..0fbe789426 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.12", - "nodebb-theme-persona": "4.0.144", + "nodebb-theme-persona": "4.0.145", "nodebb-theme-vanilla": "5.0.78", "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", From 6a4754efca61953fcb2c9279af09c62add084039 Mon Sep 17 00:00:00 2001 From: Timothy Fike Date: Wed, 25 May 2016 15:59:49 -0400 Subject: [PATCH 23/40] Set switches appropriately on plugin settings pages. (#4521) --- public/src/modules/settings/checkbox.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/modules/settings/checkbox.js b/public/src/modules/settings/checkbox.js index d091d0226d..865e89c0f3 100644 --- a/public/src/modules/settings/checkbox.js +++ b/public/src/modules/settings/checkbox.js @@ -15,6 +15,7 @@ define('settings/checkbox', function () { }, set: function (element, value) { element.prop('checked', value); + element.closest('.mdl-switch').toggleClass('is-checked', element.is(':checked')); }, get: function (element, trim, empty) { var value = element.prop('checked'); From efbc5f729d73f842af4d572d73848993bbcf636a Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 25 May 2016 22:00:44 +0200 Subject: [PATCH 24/40] update fontawesome.tpl to FA 4.6.2 (#4607) remove newline sort icons --- src/views/partials/fontawesome.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/partials/fontawesome.tpl b/src/views/partials/fontawesome.tpl index a179bfdd49..4ac0f1e01f 100644 --- a/src/views/partials/fontawesome.tpl +++ b/src/views/partials/fontawesome.tpl @@ -4,7 +4,7 @@
    - +

    For a full list of icons, please consult: From c5ec83a6ca62143b6d98479f35d342e008f15419 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 May 2016 23:12:52 -0400 Subject: [PATCH 25/40] up composer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0fbe789426..69b71672da 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.0.0", + "nodebb-plugin-composer-default": "4.0.1", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.1.0", "nodebb-plugin-emoji-one": "1.1.3", From 7e1e7eb05ad80abafb70cfc764593f853d4e5bf7 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Thu, 26 May 2016 09:02:25 -0400 Subject: [PATCH 26/40] Latest translations and fallbacks --- public/language/zh_TW/category.json | 12 +-- public/language/zh_TW/email.json | 46 +++++------ public/language/zh_TW/error.json | 18 ++--- public/language/zh_TW/global.json | 94 +++++++++++------------ public/language/zh_TW/modules.json | 6 +- public/language/zh_TW/notifications.json | 18 ++--- public/language/zh_TW/pages.json | 2 +- public/language/zh_TW/register.json | 6 +- public/language/zh_TW/reset_password.json | 4 +- public/language/zh_TW/search.json | 10 +-- public/language/zh_TW/success.json | 2 +- public/language/zh_TW/topic.json | 18 ++--- public/language/zh_TW/user.json | 12 +-- public/language/zh_TW/users.json | 2 +- 14 files changed, 125 insertions(+), 125 deletions(-) diff --git a/public/language/zh_TW/category.json b/public/language/zh_TW/category.json index 341f400cd8..fa2e367ae2 100644 --- a/public/language/zh_TW/category.json +++ b/public/language/zh_TW/category.json @@ -2,15 +2,15 @@ "category": "類別", "subcategories": "子類別", "new_topic_button": "新主題", - "guest-login-post": "登入後才能張貼", - "no_topics": "這個類別還沒有任何主題。
    為何不來發點東西呢?", + "guest-login-post": "登入後才能張貼文章", + "no_topics": "這個類別目前沒有任何主題。
    你要不要來張貼個新主題呢?", "browsing": "正在瀏覽", "no_replies": "還沒有回覆", "no_new_posts": "沒有新的張貼", "share_this_category": "分享這類別", - "watch": "觀看", + "watch": "關注", "ignore": "忽略", - "watch.message": "您正觀看著此類別的更新", - "ignore.message": "您已忽略此類別的更新", - "watched-categories": "看過的類別" + "watch.message": "你正關注此類別的更新", + "ignore.message": "你已忽略此類別的更新", + "watched-categories": "關注的類別" } \ No newline at end of file diff --git a/public/language/zh_TW/email.json b/public/language/zh_TW/email.json index 6fb33ade9c..d34fae331b 100644 --- a/public/language/zh_TW/email.json +++ b/public/language/zh_TW/email.json @@ -1,36 +1,36 @@ { "password-reset-requested": "已要求重設密碼 - %1!", - "welcome-to": "歡迎來到%1", + "welcome-to": "歡迎來到 %1", "invite": "邀請來自 %1", - "greeting_no_name": "您好", - "greeting_with_name": "您好,%1", - "welcome.text1": "感謝您註冊 %1!", - "welcome.text2": "要啟用你的帳戶,我們先要驗證你用作登記的電郵地址", - "welcome.text3": "管理者已經批準您的註冊申請。你現在可以使用你的帳號/密碼進行登入。", - "welcome.cta": "請點擊此處確認您的電郵地址", - "invitation.text1": "%1 邀請您加入 %2", + "greeting_no_name": "你好", + "greeting_with_name": "%1 你好", + "welcome.text1": "感謝註冊 %1!", + "welcome.text2": "要啟動你的帳戶,我們先要驗證你用作註冊的電子郵件地址", + "welcome.text3": "管理者已經批準你的註冊申請。你現在可以使用你的帳號/密碼進行登入。", + "welcome.cta": "請點擊此處來確認你的電子郵件地址", + "invitation.text1": "%1 邀請你加入 %2", "invitation.ctr": "點擊這裡來建立你的帳號", "reset.text1": "我們收到一個重設密碼的請求,你忘掉了密碼嗎?如果不是,請忽略這封郵件。", "reset.text2": "要繼續重置密碼,請點擊以下鏈接:", "reset.cta": "點擊這裡重置密碼", "reset.notify.subject": "密碼修改成功", - "reset.notify.text1": "提醒您密碼已於 %1 修改成功", - "reset.notify.text2": "如果您未允許此動作, 請即刻通知系統管理者", - "digest.notifications": "你有來自$1的未讀通知:", - "digest.latest_topics": "來自%1的最新話題", - "digest.cta": "點擊這裡訪問%1", - "digest.unsub.info": "本摘要按您的訂閱設置發送給您。", - "digest.no_topics": "在過去%1沒有活躍的話題", + "reset.notify.text1": "我們要通知你在 %1 的密碼已成功更改", + "reset.notify.text2": "如果你未允許此動作, 請立即通知系統管理者", + "digest.notifications": "你有來自 %1 的未讀通知:", + "digest.latest_topics": "來自 %1 的最新主題", + "digest.cta": "點擊這裡訪問 %1", + "digest.unsub.info": "本摘要依照你的訂閱設置發送給你。", + "digest.no_topics": "在過去 %1 沒有活躍的主題", "digest.day": "日", "digest.week": "週", "digest.month": "月", "digest.subject": "摘要於 %1", - "notif.chat.subject": "收到來自$1的聊天消息", - "notif.chat.cta": "點擊此處繼續對話", - "notif.chat.unsub.info": "本聊天通知按您的訂閱設置發送給您。", - "notif.post.cta": "按此以閱讀完整標題", - "notif.post.unsub.info": "本發文通知按您的訂閱設置發送給您。", - "test.text1": "這是一個測試電郵,以確認您的NodeBB郵件器設置正確。", - "unsub.cta": "點擊這裡更改這些設置", - "closing": "謝謝!" + "notif.chat.subject": "收到來自 %1 的聊天訊息", + "notif.chat.cta": "點擊此處繼續聊天對話", + "notif.chat.unsub.info": "本聊天通知按你的訂閱設置發送給你。", + "notif.post.cta": "點擊此處來閱讀完整主題", + "notif.post.unsub.info": "本張貼通知按你的訂閱設置發送給你。", + "test.text1": "這是一個測試電子郵件,用於確認你的NodeBB郵件功能是否設置正確。", + "unsub.cta": "點擊此處來更改這些設置", + "closing": "感謝!" } \ No newline at end of file diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 15f250d0c2..6ead3ec475 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -1,7 +1,7 @@ { "invalid-data": "無效的資料", - "not-logged-in": "您似乎還沒有登入喔!", - "account-locked": "您的帳戶暫時被鎖定!", + "not-logged-in": "你似乎還沒有登入喔!", + "account-locked": "你的帳戶暫時被鎖定!", "search-requires-login": "進行搜尋需要有帳號 - 請先註冊或登入", "invalid-cid": "無效的類別 ID", "invalid-tid": "無效的主題 ID", @@ -14,11 +14,11 @@ "invalid-password": "無效的密碼", "invalid-username-or-password": "請指定用戶名和密碼", "invalid-search-term": "無效的搜索字詞", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", + "csrf-invalid": "我們無法讓你登入,似乎是因為連線階段已到期。請再重試一次。", "invalid-pagination-value": "無效的分頁數值, 必需是至少 %1 與最多 %2", "username-taken": "該使用者名稱已被使用", "email-taken": "該信箱已被使用", - "email-not-confirmed": "您的電郵尚未得到確認,請點擊此處確認您的電子郵件。", + "email-not-confirmed": "你的電子郵件尚未確認,請點擊此處確認你的電子郵件。", "email-not-confirmed-chat": "你需要先確認電子郵件後才能進行聊天,請點擊這裡來確認你的電子郵件。", "no-email-to-confirm": "討論區要求電子郵件確認,請點擊這裡輸入一個電子郵件。", "email-confirm-failed": "我們無法確認你的Email,請之後再重試。", @@ -28,7 +28,7 @@ "username-too-long": "帳號太長", "password-too-long": "密碼太長", "user-banned": "該使用者已被停用", - "user-too-new": "抱歉,發表您第一篇文章須要等待 %1 秒", + "user-too-new": "抱歉,發表你第一篇文章須要等待 %1 秒", "blacklisted-ip": "抱歉,你的IP位置已經被這個社群禁用了。如果你覺得這是一個失誤,請連絡管理員。", "no-category": "類別並不存在", "no-topic": "主題並不存在", @@ -36,7 +36,7 @@ "no-group": "群組並不存在", "no-user": "使用者並不存在", "no-teaser": "Teaser 並不存在", - "no-privileges": "您似乎沒有執行這個行為的權限!", + "no-privileges": "你沒有執行這個行為的足夠權限!", "category-disabled": "該類別已被關閉", "topic-locked": "該主題已被鎖定", "post-edit-duration-expired": "在張貼 %1 秒後,你才能編輯張貼文章", @@ -55,7 +55,7 @@ "guest-upload-disabled": "訪客上傳是被禁止的", "already-favourited": "你已經將這篇張貼加入書籤", "already-unfavourited": "你已經將這篇張貼移除書籤", - "cant-ban-other-admins": "您無法禁止其他的管理員!", + "cant-ban-other-admins": "你無法封鎖其他的管理員!", "cant-remove-last-admin": "你是唯一的管理員。在你移除自己為管理員前,需要新增另一個使用者為管理員。", "invalid-image-type": "無效的圖像類型。允許的類型:%1", "invalid-image-extension": "無效的圖像擴充元件", @@ -96,8 +96,8 @@ "reload-failed": "NodeBB重載\"%1\"時遇到了問題。 NodeBB將繼續提供現有的客戶端資源,但請你撤消重載前的動作。", "registration-error": "註冊錯誤", "parse-error": "當剖析伺服器回應時發生了某個錯誤", - "wrong-login-type-email": "請使用您的電子郵件進行登錄", - "wrong-login-type-username": "請使用您的使用者名稱進行登錄", + "wrong-login-type-email": "請使用你的電子郵件進行登入", + "wrong-login-type-username": "請使用你的帳號進行登入", "invite-maximum-met": "你已經邀請最多可邀請的人數限制 (%1 於 %2)。", "no-session-found": "沒有找到登入的連線階段!", "not-in-room": "使用者沒有在聊天室中", diff --git a/public/language/zh_TW/global.json b/public/language/zh_TW/global.json index 57791619b2..85c0b4edd5 100644 --- a/public/language/zh_TW/global.json +++ b/public/language/zh_TW/global.json @@ -3,86 +3,86 @@ "search": "搜尋", "buttons.close": "關閉", "403.title": "禁止存取", - "403.message": "你沒有該頁面的存取權限", - "403.login": "可能是因為你尚未登入?", + "403.message": "你沒有該頁面的存取權限。", + "403.login": "或許是你應該 試著登入?", "404.title": "無法找到該頁", - "404.message": "你所查找的頁面並不存在,返回主頁。", + "404.message": "你所查找的頁面並不存在。返回首頁。", "500.title": "內部錯誤", - "500.message": "不好!看來是哪裡出錯了!", - "register": "注冊", - "login": "登錄", - "please_log_in": "請登入", - "logout": "退出", - "posting_restriction_info": "發表文章目前僅限於註冊的會員,點擊此處進行登錄。", + "500.message": "糟糕! 看來是不知道哪裡出錯了!", + "register": "註冊", + "login": "登入", + "please_log_in": "請先登入", + "logout": "登出", + "posting_restriction_info": "張貼文章目前只限註冊會員,點擊此處進行登入。", "welcome_back": "歡迎回來!", - "you_have_successfully_logged_in": "您已經成功登錄!", - "save_changes": "保存修改", + "you_have_successfully_logged_in": "你已成功登入!", + "save_changes": "儲存變更", "close": "關閉", "pagination": "分頁", - "pagination.out_of": "%1 out of %2", - "pagination.enter_index": "輸入Index", + "pagination.out_of": "%1 於 %2", + "pagination.enter_index": "輸入索引", "header.admin": "管理", "header.categories": "類別", "header.recent": "最近", "header.unread": "未讀", "header.tags": "標籤", "header.popular": "熱門", - "header.users": "用戶", + "header.users": "使用者", "header.groups": "群組", "header.chats": "聊天", "header.notifications": "通知", "header.search": "搜尋", - "header.profile": "設置", + "header.profile": "個人資料", "header.navigation": "導覽", - "notifications.loading": "消息載入中", - "chats.loading": "聊天載入中···", + "notifications.loading": "通知載入中", + "chats.loading": "聊天載入中", "motd.welcome": "歡迎來到 NodeBB,一個未來的討論平台。", "previouspage": "上一頁", "nextpage": "下一頁", "alert.success": "成功", "alert.error": "錯誤", "alert.banned": "封鎖", - "alert.banned.message": "你已被封鎖並將登出!", - "alert.unfollow": "你已不再關注 %1!", - "alert.follow": "你正在關注 %1!", - "online": "在線", + "alert.banned.message": "你剛被封鎖,將會被登出!", + "alert.unfollow": "你已不再跟隨 %1!", + "alert.follow": "你正在跟隨 %1!", + "online": "線上", "users": "使用者", "topics": "主題", - "posts": "文章", + "posts": "張貼", "best": "最棒", - "upvoted": "讚", - "downvoted": "爛", - "views": "Views", - "reputation": "聲譽", - "read_more": "閱讀更多...", + "upvoted": "正向投票", + "downvoted": "負向投票", + "views": "瀏覽", + "reputation": "聲望", + "read_more": "閱讀更多", "more": "更多", - "posted_ago_by_guest": "posted %1 by Guest", - "posted_ago_by": "posted %1 by %2", - "posted_ago": "posted %1", - "posted_in": "張貼於 %1", + "posted_ago_by_guest": "訪客張貼 %1", + "posted_ago_by": "%2 張貼 %1 ", + "posted_ago": "張貼 %1", + "posted_in": "張貼在 %1", "posted_in_by": "張貼於 %1 由 %2", - "posted_in_ago": "posted in %1", - "posted_in_ago_by": "posted in %1 %2 by %3", - "user_posted_ago": "%1 posted %2", - "guest_posted_ago": "Guest posted %1", + "posted_in_ago": "張貼在 %1 %2", + "posted_in_ago_by": "由 %3 張貼在 %1 %2 ", + "user_posted_ago": "%1 張貼 %2", + "guest_posted_ago": "訪客張貼 %1", "last_edited_by": "最後編輯由 %1", - "norecentposts": "最近沒新文章", - "norecenttopics": "最近沒新主題", - "recentposts": "最近的文章", - "recentips": "最近登錄的 IP 來源位址", + "norecentposts": "沒新張貼文", + "norecenttopics": "沒新主題", + "recentposts": "最近的張貼文", + "recentips": "最近登入的 IP 位址", "away": "離開", - "dnd": "不要打擾", - "invisible": "隱藏", + "dnd": "勿打擾", + "invisible": "隱形", "offline": "離線", "email": "Email", "language": "語言", - "guest": "Guest", - "guests": "Guests", - "updated.title": "討論區更新完畢", - "updated.message": "這個討論區最近被更新至最新的版本. 按此來重整這個頁面", + "guest": "訪客", + "guests": "訪客", + "updated.title": "討論區已更新", + "updated.message": "這個討論區最近已更新至最新的版本。點擊此處來重整這個頁面。", "privacy": "隱私", - "follow": "追蹤", - "unfollow": "取消追蹤", + "follow": "跟隨", + "unfollow": "取消跟隨", "delete_all": "全部刪除", "map": "地圖", "sessions": "登入連線階段", diff --git a/public/language/zh_TW/modules.json b/public/language/zh_TW/modules.json index 2c54a62a1e..bbf71c78bf 100644 --- a/public/language/zh_TW/modules.json +++ b/public/language/zh_TW/modules.json @@ -4,7 +4,7 @@ "chat.send": "發送", "chat.no_active": "暫無聊天", "chat.user_typing": "%1 正在輸入中...", - "chat.user_has_messaged_you": "%1 已傳送訊息給你了", + "chat.user_has_messaged_you": "%1 傳送訊息給你", "chat.see_all": "顯示全部聊天", "chat.mark_all_read": "所有訊息標為已讀", "chat.no-messages": "請選擇收件人來查看聊天記錄", @@ -23,8 +23,8 @@ "composer.compose": "撰寫", "composer.show_preview": "顯示預覽", "composer.hide_preview": "隱藏預覽", - "composer.user_said_in": "%1在%2裡說:", - "composer.user_said": "%1說:", + "composer.user_said_in": "%1 在 %2 裡說:", + "composer.user_said": "%1 說:", "composer.discard": "你確定要放棄這帖子嗎?", "composer.submit_and_lock": "提交然後鎖定", "composer.toggle_dropdown": "切換下拉選單", diff --git a/public/language/zh_TW/notifications.json b/public/language/zh_TW/notifications.json index 5f7ed6c29b..da335d908b 100644 --- a/public/language/zh_TW/notifications.json +++ b/public/language/zh_TW/notifications.json @@ -3,15 +3,15 @@ "no_notifs": "沒有新消息", "see_all": "觀看所有通知", "mark_all_read": "所有訊息設為已讀", - "back_to_home": "返回%1", + "back_to_home": "返回 %1", "outgoing_link": "站外連結", "outgoing_link_message": "你現在離開了 %1", "continue_to": "繼續前往 %1", - "return_to": "返回%1", + "return_to": "返回 %1", "new_notification": "新訊息通知", - "you_have_unread_notifications": "您有未讀的訊息!", + "you_have_unread_notifications": "你有未讀的通知。", "new_message_from": "來自 %1 的新訊息", - "upvoted_your_post_in": "%1 upvote了您在 %2的post。", + "upvoted_your_post_in": "%1 對你在 %2的張貼文投了正向票。", "upvoted_your_post_in_dual": "%1%2 已經對你在%3的張貼作正向投票。", "upvoted_your_post_in_multiple": "%1 與 %2 其他人已經對你在%3正向投票。", "moved_your_post": "%1 已經移動你的張貼到 %2", @@ -19,7 +19,7 @@ "favourited_your_post_in": "%1 已經把你在 %2 的張貼加入書籤。", "favourited_your_post_in_dual": "%1%2 已經把你在%3的張貼加入書籤。", "favourited_your_post_in_multiple": "%1 與 %2 其他人已經把你在 %3 的張貼加入書籤。", - "user_flagged_post_in": "%1 舉報了 %2裡的一個post。", + "user_flagged_post_in": "%1 標記了 %2裡的一個張貼。", "user_flagged_post_in_dual": "%1%2 標記一個張貼在 %3", "user_flagged_post_in_multiple": "%1 與 %2 其他人標記一個張貼在 %3", "user_posted_to": "%1 發布一個回覆給: %2", @@ -31,8 +31,8 @@ "user_started_following_you_multiple": "%1 與 %2 其他的開始跟隨你。", "new_register": "%1傳送了註冊要求。", "new_register_multiple": "目前有 %1 個註冊要求等待審核中。", - "email-confirmed": "已確認電郵", - "email-confirmed-message": "感謝您驗證您的電郵。您的帳戶現已全面啟用。", - "email-confirm-error-message": "驗證您的電郵地址時出現問題。也許啟動碼無效或已過期。", - "email-confirm-sent": "已發送確認電郵。" + "email-confirmed": "已確認電子郵件", + "email-confirmed-message": "感謝你驗證電子郵件。你的帳戶現已完整的啟動。", + "email-confirm-error-message": "驗證你的電子郵件地址時發生問題。也許是啟動碼無效或是已過期。", + "email-confirm-sent": "已發送確認電子郵件。" } \ No newline at end of file diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index 08dabadd1b..cb939e2372 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -25,7 +25,7 @@ "chats": "聊天", "chat": "與 %1 聊天", "account/edit": "編輯 \"%1\"", - "account/edit/password": "編輯\"%1\"的密碼", + "account/edit/password": "編輯 \"%1\" 的密碼", "account/edit/username": "編輯\"%1\"的帳號", "account/edit/email": "編輯\"%1\"的電子郵件", "account/following": "使用者 %1 跟隨", diff --git a/public/language/zh_TW/register.json b/public/language/zh_TW/register.json index d61934f70d..a48bfa98f7 100644 --- a/public/language/zh_TW/register.json +++ b/public/language/zh_TW/register.json @@ -1,8 +1,8 @@ { "register": "註冊", "help.email": "默認情況下,你的郵箱不會公開。", - "help.username_restrictions": "用戶名由%1到%2個字符組成。其他人可以通過 @用戶名 點名你。", - "help.minimum_password_length": "密碼必須至少包含%1個字符。", + "help.username_restrictions": "獨立的帳號由 %1 到 %2 個字元組成。其他人可以通過 @帳號 提及你。", + "help.minimum_password_length": "密碼必須至少包含 %1 個字元。", "email_address": "Email", "email_address_placeholder": "輸入郵箱地址", "username": "用戶名", @@ -15,5 +15,5 @@ "alternative_registration": "其他註冊方式", "terms_of_use": "使用條款", "agree_to_terms_of_use": "同意遵守使用條款", - "registration-added-to-queue": "您的註冊已經被加入到審核序列中。您將會在管理者批準後收到一封電子郵件。" + "registration-added-to-queue": "你的註冊已經被加入到審核序列中。你將會在管理者批準後收到一封電子郵件。" } \ No newline at end of file diff --git a/public/language/zh_TW/reset_password.json b/public/language/zh_TW/reset_password.json index 85ec4482e8..f7d83c8dd1 100644 --- a/public/language/zh_TW/reset_password.json +++ b/public/language/zh_TW/reset_password.json @@ -4,10 +4,10 @@ "password_changed.title": "密碼已更改", "password_changed.message": "

    密碼重設成功,請重新登錄。", "wrong_reset_code.title": "驗証碼不正確", - "wrong_reset_code.message": "您輸入的驗証碼有誤,請重新輸入,或申請新的驗証碼。", + "wrong_reset_code.message": "重置驗証碼不正確。請重新輸入,或是申請新重置驗証碼。", "new_password": "輸入新的密碼", "repeat_password": "再次確認新密碼", - "enter_email": "請輸入您的電子郵件地址,我們會寄送郵件告訴您如何重設密碼。", + "enter_email": "請輸入你的電子郵件地址,我們會寄送郵件告訴你如何重置你的帳戶。", "enter_email_address": "輸入電子郵件地址", "password_reset_sent": "密碼重設郵件已發送。", "invalid_email": "無效的電子郵件 / 電子郵件不存在!", diff --git a/public/language/zh_TW/search.json b/public/language/zh_TW/search.json index 457f1bfb7b..58b8258ed4 100644 --- a/public/language/zh_TW/search.json +++ b/public/language/zh_TW/search.json @@ -1,17 +1,17 @@ { - "results_matching": "有%1個跟\"%2\"相符的結果(%3秒)", + "results_matching": "有 %1 個與 \"%2\" 符合的結果 (%3秒)", "no-matches": "沒有找到相符的主題", "advanced-search": "進階搜尋", "in": "在", "titles": "標題", - "titles-posts": "標題與發布", - "posted-by": "Posted by", + "titles-posts": "標題與張貼", + "posted-by": "張貼由", "in-categories": "在類別中", "search-child-categories": "搜尋子類別", "reply-count": "回覆數量", "at-least": "最少", "at-most": "最多", - "post-time": "發布時間", + "post-time": "張貼時間", "newer-than": "較新", "older-than": "較舊", "any-date": "任意日期", @@ -22,7 +22,7 @@ "three-months": "三個月", "six-months": "六個月", "one-year": "一年", - "sort-by": "排序依據", + "sort-by": "排序依照", "last-reply-time": "最後回覆時間", "topic-title": "主題", "number-of-replies": "回覆數量", diff --git a/public/language/zh_TW/success.json b/public/language/zh_TW/success.json index 7d3170435b..1d652b82e6 100644 --- a/public/language/zh_TW/success.json +++ b/public/language/zh_TW/success.json @@ -1,6 +1,6 @@ { "success": "成功", - "topic-post": "您的文章已張貼成功", + "topic-post": "你的文章已張貼成功", "authentication-successful": "驗證成功", "settings-saved": "設定已儲存" } \ No newline at end of file diff --git a/public/language/zh_TW/topic.json b/public/language/zh_TW/topic.json index e0efc6b3fc..4719cd6fd1 100644 --- a/public/language/zh_TW/topic.json +++ b/public/language/zh_TW/topic.json @@ -32,7 +32,7 @@ "deleted_message": "此主題已被刪除。只有具有主題管理權限的用戶才能看到它。", "following_topic.message": "有人貼文回覆主題時, 你將會收到新通知.", "not_following_topic.message": "有人貼文回覆主題時, 你將不會收到通知.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "ignoring_topic.message": "你將不會再未讀主題列表中看到這個主題。當你被提及或你的張貼被正向投票時,你會被通知。", "login_to_subscribe": "請先註冊或登錄, 才可訂閱此主題.", "markAsUnreadForAll.success": "將全部的主題設為未讀.", "mark_unread": "標為未讀", @@ -42,12 +42,12 @@ "watch.title": "當主題有新回覆時將收到通知", "unwatch.title": "停止關注這個主題", "share_this_post": "分享這篇文章", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", - "watching.description": "Notify me of new replies.
    Show topic in unread.", - "not-watching.description": "Do not notify me of new replies.
    Show topic in unread if category is not ignored.", - "ignoring.description": "Do not notify me of new replies.
    Do not show topic in unread.", + "watching": "關注", + "not-watching": "取消關注", + "ignoring": "忽略", + "watching.description": "有新的回覆通知我。
    在未讀頁中顯示主題。", + "not-watching.description": "有新的回覆不用通知我。
    如果類別不是被忽略的,在未讀頁中顯示主題。", + "ignoring.description": "有新的回覆不用通知我。
    在未讀頁中不顯示主題。", "thread_tools.title": "主題工具箱", "thread_tools.markAsUnreadForAll": "設為未讀", "thread_tools.pin": "釘選主題", @@ -56,7 +56,7 @@ "thread_tools.unlock": "解除主題鎖定", "thread_tools.move": "移動主題", "thread_tools.move_all": "移動全部", - "thread_tools.fork": "Fork 主題", + "thread_tools.fork": "分叉主題", "thread_tools.delete": "刪除主題", "thread_tools.delete-posts": "刪除張貼", "thread_tools.delete_confirm": "你確定要刪除這個主題?", @@ -107,7 +107,7 @@ "oldest_to_newest": "從舊到新", "newest_to_oldest": "從新到舊", "most_votes": "得票最多", - "most_posts": "最多post", + "most_posts": "最多張貼", "stale.title": "改為建立新的主題?", "stale.warning": "你正回覆的主題是非常舊的一篇。你想要改為建立一個新主題,然後參考到這篇你回覆的?", "stale.create": "建立新主題", diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index a536503ff7..352b9d38a1 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -5,12 +5,12 @@ "joindate": "加入時間", "postcount": "文章數量", "email": "電子郵件", - "confirm_email": "確認電郵", + "confirm_email": "確認電子郵件", "ban_account": "禁用帳號", "ban_account_confirm": "你確定要禁用這個使用者?", "unban_account": "取消禁用帳號", "delete_account": "刪除帳戶", - "delete_account_confirm": "你確定要刪除自己的帳戶?
    此操作不能復原,您將無法恢復任何數據

    輸入您的使用者名稱,以確認您希望刪除這個帳戶。", + "delete_account_confirm": "你確定要刪除自己的帳戶?
    此操作不能復原,你將無法恢復任何數據

    輸入你的帳號,用來確認希望刪除這個帳戶。", "delete_this_account_confirm": "你確定要刪除這個帳戶?
    此操作是不能還原的,你將無法回復任何資料
    ", "account-deleted": "帳號已刪除", "fullname": "全名", @@ -34,7 +34,7 @@ "follow": "跟隨", "unfollow": "取消跟隨", "more": "更多", - "profile_update_success": "您的個人資料已更新成功!", + "profile_update_success": "你的個人資料已更新成功!", "change_picture": "改變頭像", "change_username": "更改帳號", "change_email": "更改電子郵件", @@ -50,11 +50,11 @@ "change_password_error_wrong_current": "目前的密碼不正確!", "change_password_error_length": "密碼太短!", "change_password_error_match": "密碼必須要一致!", - "change_password_error_privileges": "您沒有變更此密碼的權限!", + "change_password_error_privileges": "你沒有變更此密碼的權限!", "change_password_success": "你的密碼已經更新!", "confirm_password": "確認密碼", "password": "密碼", - "username_taken_workaround": "您所註冊的使用者名稱已經被使用了,所以我們將它略微改變。你現在改稱 %1", + "username_taken_workaround": "你想要註冊的帳號已經被使用了,所以我們將它略作改變。你現在的帳號名稱是 %1", "password_same_as_username": "你的密碼和帳號是一樣的,請選擇另一組密碼。", "password_same_as_email": "你的密碼和電子郵件是一樣的,請選擇另一組密碼。", "upload_picture": "上傳頭像", @@ -66,7 +66,7 @@ "show_fullname": "顯示我的全名", "restrict_chats": "只允許我跟隨的用戶和我聊天", "digest_label": "訂閱摘要", - "digest_description": "使用 eamil 訂閱本論壇新的訊息通知與主題 (根據您所設的時間表)", + "digest_description": "根據你所設的時間排程,用電子郵件訂閱這個討論區 (新的通知與主題)。", "digest_off": "關閉", "digest_daily": "每日", "digest_weekly": "每週", diff --git a/public/language/zh_TW/users.json b/public/language/zh_TW/users.json index b3e5acd9cb..be4ad3a86b 100644 --- a/public/language/zh_TW/users.json +++ b/public/language/zh_TW/users.json @@ -5,7 +5,7 @@ "search": "搜尋", "enter_username": "輸入想找的使用者帳號", "load_more": "載入更多", - "users-found-search-took": "發現 %1 用戶!搜尋只用 %2 秒。", + "users-found-search-took": "找到 %1 使用者! 搜尋用了 %2 秒。", "filter-by": "過濾依照", "online-only": "線上僅有", "invite": "邀請", From 439576fa8c2d222c743462d4cb2c0e12ebb195a4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 May 2016 16:07:38 -0400 Subject: [PATCH 27/40] up composer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 69b71672da..10bb6fa3da 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.0.1", + "nodebb-plugin-composer-default": "4.0.2", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.1.0", "nodebb-plugin-emoji-one": "1.1.3", From 975adf1741f756ba9544c139cbe614b9b1f34556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 27 May 2016 10:00:22 +0300 Subject: [PATCH 28/40] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10bb6fa3da..ac158a5096 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.12", - "nodebb-theme-persona": "4.0.145", + "nodebb-theme-persona": "4.0.146", "nodebb-theme-vanilla": "5.0.78", "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", From 9f3c1f6641a3a2236163aafdcf7854fc545163f5 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Fri, 27 May 2016 09:02:28 -0400 Subject: [PATCH 29/40] Latest translations and fallbacks --- public/language/fr/topic.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index cf74ed31cb..f06b98b1a4 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -32,7 +32,7 @@ "deleted_message": "Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.", "following_topic.message": "Vous recevrez désormais des notifications lorsque quelqu'un postera dans ce sujet.", "not_following_topic.message": "Vous ne recevrez plus de notifications pour ce sujet.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "ignoring_topic.message": "Vous ne verrez plus ce sujet dans la liste des sujets non lus. Vous serez notifié lorsque vous serez mentionné ou que quelqu'un votera pour votre message.", "login_to_subscribe": "Veuillez vous enregistrer ou vous connecter afin de vous abonner à ce sujet.", "markAsUnreadForAll.success": "Sujet marqué comme non lu pour tout le monde.", "mark_unread": "Marquer comme non-lu", @@ -42,12 +42,12 @@ "watch.title": "Être notifié des nouvelles réponses dans ce sujet", "unwatch.title": "Arrêter de surveiller ce sujet", "share_this_post": "Partager ce message", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", - "watching.description": "Notify me of new replies.
    Show topic in unread.", - "not-watching.description": "Do not notify me of new replies.
    Show topic in unread if category is not ignored.", - "ignoring.description": "Do not notify me of new replies.
    Do not show topic in unread.", + "watching": "Surveiller", + "not-watching": "Ne pas surveiller", + "ignoring": "Ignorer", + "watching.description": "Me notifier les nouvelles réponses.
    Afficher le sujet dans l'onglet \"Non lu\".", + "not-watching.description": "Ne pas me notifier les nouvelles réponses.
    Afficher le sujet dans l'onglet \"Non lu\" si la catégorie n'est pas ignorée.", + "ignoring.description": "Ne pas me notifier les nouvelle réponses.
    Ne pas afficher ce sujet dans l'onglet \"Non lu\".", "thread_tools.title": "Outils pour sujets", "thread_tools.markAsUnreadForAll": "Marquer comme non lu", "thread_tools.pin": "Épingler le sujet", From 38ad9804560cff910814f3cababa2acc1305d7e7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 27 May 2016 11:35:58 -0400 Subject: [PATCH 30/40] Fixes #4694, fixes #4697 --- src/notifications.js | 17 +++++++++++++++++ src/socket.io/helpers.js | 13 +++++++++---- src/socket.io/posts/favourites.js | 4 +++- src/socket.io/posts/move.js | 2 +- src/socket.io/topics/move.js | 2 +- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 4f6d73f385..7ca9c50277 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -268,6 +268,23 @@ var utils = require('../public/src/utils'); }); }; + Notifications.rescind = function(nid, callback) { + callback = callback || function() {}; + + async.parallel([ + async.apply(db.sortedSetRemove, 'notifications', nid), + async.apply(db.delete, 'notifications:' + nid) + ], function(err) { + if (err) { + winston.error('Encountered error rescinding notification (' + nid + '): ' + err.message); + } else { + winston.verbose('[notifications/rescind] Rescinded notification "' + nid + '"'); + } + + callback(err, nid); + }); + }; + Notifications.markRead = function(nid, uid, callback) { callback = callback || function() {}; if (!parseInt(uid, 10) || !nid) { diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 68182293f4..dfcecf7f5c 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -77,7 +77,7 @@ function filterTidCidIgnorers(uids, tid, cid, callback) { ], callback); } -SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) { +SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, command, notification) { if (!pid || !fromuid || !notification) { return; } @@ -107,7 +107,7 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) bodyLong: results.postObj.content, pid: pid, path: '/post/' + pid, - nid: 'post:' + pid + ':uid:' + fromuid, + nid: command + ':post:' + pid + ':uid:' + fromuid, from: fromuid, mergeId: notification + '|' + pid, topicTitle: results.topicTitle @@ -124,7 +124,7 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) }; -SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification) { +SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, command, notification) { if (!tid || !fromuid || !notification) { return; } @@ -150,7 +150,7 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification notifications.create({ bodyShort: '[[' + notification + ', ' + results.username + ', ' + titleEscaped + ']]', path: '/topic/' + results.topicData.slug, - nid: 'tid:' + tid + ':uid:' + fromuid, + nid: command + ':tid:' + tid + ':uid:' + fromuid, from: fromuid }, next); } @@ -164,6 +164,11 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification }); }; +SocketHelpers.rescindUpvoteNotification = function(pid, fromuid) { + var nid = 'upvote:post:' + pid + ':uid:' + fromuid; + notifications.rescind(nid); +}; + SocketHelpers.emitToTopicAndCategory = function(event, data) { websockets.in('topic_' + data.tid).emit(event, data); websockets.in('category_' + data.cid).emit(event, data); diff --git a/src/socket.io/posts/favourites.js b/src/socket.io/posts/favourites.js index 3d93afac08..01be736949 100644 --- a/src/socket.io/posts/favourites.js +++ b/src/socket.io/posts/favourites.js @@ -152,7 +152,9 @@ module.exports = function(SocketPosts) { } if (result && notification) { - socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, notification); + socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, command, notification); + } else if (result && command === 'unvote') { + socketHelpers.rescindUpvoteNotification(data.pid, socket.uid); } callback(); }); diff --git a/src/socket.io/posts/move.js b/src/socket.io/posts/move.js index 637ef7da1f..e73ad58a9a 100644 --- a/src/socket.io/posts/move.js +++ b/src/socket.io/posts/move.js @@ -28,7 +28,7 @@ module.exports = function(SocketPosts) { topics.movePostToTopic(data.pid, data.tid, next); }, function (next) { - socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'notifications:moved_your_post'); + socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'move', 'notifications:moved_your_post'); next(); } ], callback); diff --git a/src/socket.io/topics/move.js b/src/socket.io/topics/move.js index 80fc2e3772..a25947aab5 100644 --- a/src/socket.io/topics/move.js +++ b/src/socket.io/topics/move.js @@ -40,7 +40,7 @@ module.exports = function(SocketTopics) { socketHelpers.emitToTopicAndCategory('event:topic_moved', topicData); - socketHelpers.sendNotificationToTopicOwner(tid, socket.uid, 'notifications:moved_your_topic'); + socketHelpers.sendNotificationToTopicOwner(tid, socket.uid, 'move', 'notifications:moved_your_topic'); next(); }); From 34f2d256511c68e6cc56ec336a1b44778c3d0999 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 27 May 2016 11:59:37 -0400 Subject: [PATCH 31/40] fixes #4696 --- public/src/modules/notifications.js | 6 ++++-- src/socket.io/helpers.js | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index 86723dc3e5..533199c31c 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -102,9 +102,11 @@ define('notifications', ['sounds', 'translator', 'components'], function(sound, ajaxify.refresh(); } - if (!unreadNotifs[notifData.nid]) { - incrementNotifCount(1); + socket.emit('notifications.getCount', function(err, count) { + Notifications.updateNotifCount(count); + }); + if (!unreadNotifs[notifData.nid]) { sound.play('notification'); unreadNotifs[notifData.nid] = true; } diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index dfcecf7f5c..9efeb4c5d9 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -167,6 +167,12 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, command, not SocketHelpers.rescindUpvoteNotification = function(pid, fromuid) { var nid = 'upvote:post:' + pid + ':uid:' + fromuid; notifications.rescind(nid); + + posts.getPostField(pid, 'uid', function(err, uid) { + user.notifications.getUnreadCount(uid, function(err, count) { + websockets.in('uid_' + uid).emit('event:notifications.updateCount', count); + }); + }); }; SocketHelpers.emitToTopicAndCategory = function(event, data) { From c288ba0a172d079f55f8e19e504b46a5e0878878 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Fri, 27 May 2016 14:55:02 -0500 Subject: [PATCH 32/40] fix replying on IE11 - see https://github.com/NodeBB/NodeBB/commit/c50f228accc3485fcee74e875b9316f8e65e9261#commitcomment-17651064 (#4699) --- public/src/client/topic/postTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index fa2a72e617..0195c00417 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -232,7 +232,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator var selection = window.getSelection ? window.getSelection() : document.selection.createRange(); var content = button.parents('[component="post"]').find('[component="post/content"]').get(0); - if (content && selection.containsNode(content, true)) { + if (selection && selection.containsNode && content && selection.containsNode(content, true)) { var bounds = document.createRange(); bounds.selectNodeContents(content); var range = selection.getRangeAt(0).cloneRange(); From 839ff069678cc08cb55e0bd5b0dd4bfdac81b114 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 27 May 2016 18:51:49 -0400 Subject: [PATCH 33/40] up lavender --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac158a5096..dc2a607c41 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", - "nodebb-theme-lavender": "3.0.12", + "nodebb-theme-lavender": "3.0.13", "nodebb-theme-persona": "4.0.146", "nodebb-theme-vanilla": "5.0.78", "nodebb-widget-essentials": "2.0.9", From 444a192a2275487207135b3da1ca9c311e1e7c64 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Sat, 28 May 2016 09:02:22 -0400 Subject: [PATCH 34/40] Latest translations and fallbacks --- public/language/ro/login.json | 2 +- public/language/ro/notifications.json | 2 +- public/language/ro/pages.json | 4 ++-- public/language/ro/recent.json | 4 ++-- public/language/ro/topic.json | 2 +- public/language/ro/unread.json | 2 +- public/language/ro/uploads.json | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/language/ro/login.json b/public/language/ro/login.json index 56396705d2..c79bb9e0f9 100644 --- a/public/language/ro/login.json +++ b/public/language/ro/login.json @@ -5,7 +5,7 @@ "remember_me": "Autentifică-mă automat la fiecare vizită", "forgot_password": "Ai uitat parola?", "alternative_logins": "Autentificare Alternativă", - "failed_login_attempt": "Login Unsuccessful", + "failed_login_attempt": "Login nereușit", "login_successful": "Te-ai autentificat cu succes!", "dont_have_account": "Nu ai un cont?" } \ No newline at end of file diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index 79abb3f15c..ef01014715 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -2,7 +2,7 @@ "title": "Notificări", "no_notifs": "Nu ai nici o notificare recentă", "see_all": "Vezi toate notificările", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Marchează toate notificările citite", "back_to_home": "Înapoi la %1", "outgoing_link": "Link Extern", "outgoing_link_message": "Părăsești acuma %1", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 3b57e3d986..1e6792ac3e 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -2,8 +2,8 @@ "home": "Acasă", "unread": "Subiecte Necitite", "popular-day": "Subiecte populare azi", - "popular-week": "Popular topics this week", - "popular-month": "Popular topics this month", + "popular-week": "Subiecte populare în săptămâna asta", + "popular-month": "Subiecte populare în luna asta", "popular-alltime": "All time popular topics", "recent": "Subiecte Noi", "flagged-posts": "Flagged Posts", diff --git a/public/language/ro/recent.json b/public/language/ro/recent.json index 7d6adfcb12..45d788dfc3 100644 --- a/public/language/ro/recent.json +++ b/public/language/ro/recent.json @@ -8,9 +8,9 @@ "no_recent_topics": "Nu există subiecte recente.", "no_popular_topics": "Nu sunt subiecte populare.", "there-is-a-new-topic": "Există un subiect nou.", - "there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.", + "there-is-a-new-topic-and-a-new-post": "Există un subiect nou si o postare nouă.", "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", - "there-are-new-topics": "There are %1 new topics.", + "there-are-new-topics": "Există %1 postări noi.", "there-are-new-topics-and-a-new-post": "Exista %1 subiect nou și o postare nouă", "there-are-new-topics-and-new-posts": "Exista %1 subiecte noi și %2 postări noi", "there-is-a-new-post": "Exista o postare nouă", diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index 37ca2d64c0..764d203e19 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -14,7 +14,7 @@ "quote": "Citează", "reply": "Răspunde", "reply-as-topic": "Răspunde ca subiect", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Login pentru a răspunde", "edit": "Editează", "delete": "Șterge", "purge": "Curăță", diff --git a/public/language/ro/unread.json b/public/language/ro/unread.json index 7f77537dc6..a5b6c46e7e 100644 --- a/public/language/ro/unread.json +++ b/public/language/ro/unread.json @@ -9,5 +9,5 @@ "topics_marked_as_read.success": "Subiectele au fost marcate ca citite!", "all-topics": "Toate subiectele", "new-topics": "Subiecte noi", - "watched-topics": "Watched Topics" + "watched-topics": "Subiecte urmărite" } \ No newline at end of file diff --git a/public/language/ro/uploads.json b/public/language/ro/uploads.json index c104a65f68..aa633f773e 100644 --- a/public/language/ro/uploads.json +++ b/public/language/ro/uploads.json @@ -1,6 +1,6 @@ { "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", + "select-file-to-upload": "Selectează un fișier pentru încărcare!", "upload-success": "File uploaded successfully!", "maximum-file-size": "Maxim %1 kB" } \ No newline at end of file From bff844806f1f788e08761022a57a6a53d3da8ee7 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Sun, 29 May 2016 09:02:23 -0400 Subject: [PATCH 35/40] Latest translations and fallbacks --- public/language/es/category.json | 6 +++--- public/language/es/error.json | 2 +- public/language/es/global.json | 4 ++-- public/language/es/pages.json | 4 ++-- public/language/es/topic.json | 14 +++++++------- public/language/es/user.json | 18 +++++++++--------- public/language/fr/category.json | 6 +++--- public/language/fr/global.json | 8 ++++---- public/language/fr/pages.json | 4 ++-- public/language/fr/topic.json | 12 ++++++------ public/language/fr/unread.json | 2 +- public/language/fr/user.json | 12 ++++++------ 12 files changed, 46 insertions(+), 46 deletions(-) diff --git a/public/language/es/category.json b/public/language/es/category.json index 5b0b5aee30..608bf7c75a 100644 --- a/public/language/es/category.json +++ b/public/language/es/category.json @@ -2,14 +2,14 @@ "category": "Categoría", "subcategories": "Subcategorías", "new_topic_button": "Nuevo tema", - "guest-login-post": "Acceder para poder escribir un mensaje", + "guest-login-post": "Accede para poder escribir un mensaje", "no_topics": "No hay temas en esta categoría.
    ¿Por qué no te animas y publicas uno?", "browsing": "viendo ahora", "no_replies": "Nadie ha respondido aún", "no_new_posts": "No hay mensajes nuevos.", "share_this_category": "Compartir esta categoría", - "watch": "Seguir", - "ignore": "Ignorar", + "watch": "Siguiendo", + "ignore": "Ignorando", "watch.message": "Ahora estás viendo actualizaciones de esta categoría", "ignore.message": "Ahora estás ignorando las actualizaciones de esta categoría", "watched-categories": "Categorías seguidas" diff --git a/public/language/es/error.json b/public/language/es/error.json index 56bac12bea..91303b3f99 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -14,7 +14,7 @@ "invalid-password": "Contraseña no válida", "invalid-username-or-password": "Por favor especifica tanto un usuario como contraseña", "invalid-search-term": "Término de búsqueda inválido", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", + "csrf-invalid": "El acceso ha fallado porque tu sesión ha expirado. Por favor prueba otra vez.", "invalid-pagination-value": "Número de página inválido, debe estar entre %1 y %2", "username-taken": "Nombre de usuario ocupado", "email-taken": "Correo electrónico ocupado", diff --git a/public/language/es/global.json b/public/language/es/global.json index f962a4fa80..f91bbda9b4 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -49,7 +49,7 @@ "users": "Usuarios", "topics": "Temas", "posts": "Posts", - "best": "Mejor", + "best": "Mejor valorados", "upvoted": "Votado positivamente", "downvoted": "Votado negativamente", "views": "Visitas", @@ -59,7 +59,7 @@ "posted_ago_by_guest": "publicado %1 por Invitado", "posted_ago_by": "publicado %1 por %2", "posted_ago": "publicado %1", - "posted_in": "Publicado %1", + "posted_in": "publicado en %1", "posted_in_by": "publicado en %1 por %2", "posted_in_ago": "publicado en %1 %2", "posted_in_ago_by": "publicado en %1 %2 por %3", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index 4a79f28222..23f1ae0dac 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -23,8 +23,8 @@ "groups": "Grupos", "group": "Grupo de %1", "chats": "Chats", - "chat": "Chateando con %1", - "account/edit": "Editando \"%1\"", + "chat": "Chatear con %1", + "account/edit": "Editar \"%1\"", "account/edit/password": "Editar contraseña de \"%1\"", "account/edit/username": "Editar nombre de usuario de \"%1\"", "account/edit/email": "Editar email \"%1\"", diff --git a/public/language/es/topic.json b/public/language/es/topic.json index 26308aae76..37a417cd42 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -32,7 +32,7 @@ "deleted_message": "Este tema ha sido borrado. Solo los usuarios que tengan privilegios de administración de temas pueden verlo.", "following_topic.message": "Ahora recibiras notificaciones cuando alguien publique en este tema.", "not_following_topic.message": "No recibiras notificaciones de este tema.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "ignoring_topic.message": "Ya no verás este tema en no leídos. Serás notificado si te mencionan o te votan.", "login_to_subscribe": "Por favor, conéctate para subscribirte a este tema.", "markAsUnreadForAll.success": "Publicación marcada como no leída para todos.", "mark_unread": "Marcar no leído", @@ -42,12 +42,12 @@ "watch.title": "Serás notificado cuando haya nuevas respuestas en este tema", "unwatch.title": "Dejar de seguir este tema", "share_this_post": "Compartir este post", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", - "watching.description": "Notify me of new replies.
    Show topic in unread.", - "not-watching.description": "Do not notify me of new replies.
    Show topic in unread if category is not ignored.", - "ignoring.description": "Do not notify me of new replies.
    Do not show topic in unread.", + "watching": "Siguiendo", + "not-watching": "No siguiendo", + "ignoring": "Ignorando", + "watching.description": "Notificarme de nuevas respuestas.
    Mostrar tema en no leídos. ", + "not-watching.description": "No notificarme de nuevas respuestas.
    Mostrar tema en no leídos si sigo esa categoría. ", + "ignoring.description": "No notificarme de nuevas respuestas.
    No mostrar tema en no leídos. ", "thread_tools.title": "Herramientas", "thread_tools.markAsUnreadForAll": "Marcar no leído", "thread_tools.pin": "Adherir tema", diff --git a/public/language/es/user.json b/public/language/es/user.json index 6f7f75385b..1e09fdb7c3 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -2,13 +2,13 @@ "banned": "Baneado", "offline": "Desconectado", "username": "Nombre de usuario", - "joindate": "Fecha de Registro", + "joindate": "Fecha de registro", "postcount": "Número De Publicaciones", "email": "Correo electrónico", "confirm_email": "Confirmar correo electrónico", - "ban_account": "Banear Cuenta", + "ban_account": "Banear cuenta", "ban_account_confirm": "Quieres confirmar el baneo de este usuario?", - "unban_account": "Desbanear Cuenta", + "unban_account": "Desbanear cuenta", "delete_account": "Eliminar cuenta", "delete_account_confirm": "¿Estás seguro de que quieres eliminar tu cuenta?
    Esta acción es irreversible y no podrás recuperar ninguno de tus datos.

    Introduce tu nombre de usuario para confirmar la eliminación de la cuenta.", "delete_this_account_confirm": "Esta seguro de eliminar este usuario?
    Esta acción de irreversible y no podrás recuperar ningún dato

    ", @@ -30,7 +30,7 @@ "signature": "Firma", "birthday": "Cumpleaños", "chat": "Chat", - "chat_with": "Chateando con %1", + "chat_with": "Chatear con %1", "follow": "Seguir", "unfollow": "Dejar de seguir", "more": "Más", @@ -90,20 +90,20 @@ "notification_sounds": "Reproducir un sonido al recibir una notificación", "browsing": "Preferencias de navegación.", "open_links_in_new_tab": "Abrir los enlaces externos en una nueva pestaña", - "enable_topic_searching": "Activar la búsqueda \"in-topic\"", - "topic_search_help": "Si está activada, la búsqueda 'in-topic' sustituirá el comportamiento por defecto del navegador y le permitirá buscar en el tema al completo, en vez de hacer una búsqueda únicamente sobre el contenido mostrado en pantalla", + "enable_topic_searching": "Activar la búsqueda \"dentro del tema\"", + "topic_search_help": "Si está activada, la búsqueda 'dentro del tema' al usar el buscador de la barra de navegación automáticamente buscaras solo en el tema actual.", "delay_image_loading": "Retrasar la carga de imágenes", "image_load_delay_help": "Si se habilita, las imágenes no cargarán hasta que se vean en pantalla", "scroll_to_my_post": "Luego de enviar una respuesta, mostrar el nuevo mensaje", "follow_topics_you_reply_to": "Seguir los temas en los que respondes", "follow_topics_you_create": "Seguir publicaciones que creas", - "grouptitle": "Título del Grupo", + "grouptitle": "Título del grupo", "no-group-title": "Sin título de grupo", "select-skin": "Seleccionar una plantilla", - "select-homepage": "Seleccione una Página de inicio", + "select-homepage": "Seleccione una página de inicio", "homepage": "Página de inicio", "homepage_description": "Seleccione una página para su uso habitual como la página principal del foro o 'Ninguno' para utilizar la página de inicio.", - "custom_route": "Modificar página de ruta", + "custom_route": "Pagina de inicio personalizada", "custom_route_help": "Introduzca un nombre de ruta aquí, sin ninguna barra anterior (por ejemplo, \"reciente\", o \"popular\")", "sso.title": "Servicios de Inicio de sesión Único", "sso.associated": "Asociado con", diff --git a/public/language/fr/category.json b/public/language/fr/category.json index 785b6af048..a44eb21efe 100644 --- a/public/language/fr/category.json +++ b/public/language/fr/category.json @@ -8,9 +8,9 @@ "no_replies": "Personne n'a répondu", "no_new_posts": "Pas de nouveau message", "share_this_category": "Partager cette catégorie", - "watch": "Surveiller", + "watch": "S'abonner", "ignore": "Ne plus surveiller", - "watch.message": "Vous surveillez désormais les mises à jour de cette catégorie.", + "watch.message": "Vous êtes désormais abonné aux mises à jour de cette catégorie.", "ignore.message": "Vous ne surveillez plus les mises jour de cette catégorie.", - "watched-categories": "Catégories Suivies" + "watched-categories": "Abonnements" } \ No newline at end of file diff --git a/public/language/fr/global.json b/public/language/fr/global.json index 7096b63f7c..c68abe3813 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -43,8 +43,8 @@ "alert.error": "Erreur", "alert.banned": "Banni", "alert.banned.message": "Vous venez d'être banni, vous allez maintenant être déconnecté.", - "alert.unfollow": "Vous ne suivez désormais plus %1 !", - "alert.follow": "Vous suivez désormais %1 !", + "alert.unfollow": "Vous n'êtes plus abonné à %1 !", + "alert.follow": "Vous êtes désormais abonné à %1 !", "online": "En ligne", "users": "Utilisateurs", "topics": "Sujets", @@ -81,8 +81,8 @@ "updated.title": "Forum mis à jour", "updated.message": "Ce forum a été mis à jour à la dernière version. Cliquez ici pour recharger la page.", "privacy": "Vie privée", - "follow": "Suivre", - "unfollow": "Ne plus suivre", + "follow": "S'abonner", + "unfollow": "Se désabonner", "delete_all": "Tout supprimer", "map": "Carte", "sessions": "Sessions de connexion", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 3c0cb29b90..c391e743ba 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -28,14 +28,14 @@ "account/edit/password": "Édition du mot de passe de \"%1\"", "account/edit/username": "Édition du nom d'utilisateur de \"%1\"", "account/edit/email": "Édition de l'e-mail de \"%1\"", - "account/following": "Les personnes que %1 suit", + "account/following": "Les personnes auxquelles %1 est abonné", "account/followers": "Les personnes qui suivent %1", "account/posts": "Messages postés par %1", "account/topics": "Sujets créés par %1", "account/groups": "Groupes auxquels appartient %1", "account/favourites": "Marques-pages de %1", "account/settings": "Paramètres d'utilisateur", - "account/watched": "Sujets surveillés par %1", + "account/watched": "Sujets auxquels %1 est abonné", "account/upvoted": "Messages pour lesquels %1 a voté", "account/downvoted": "Messages contre lesquels %1 a voté", "account/best": "Meilleurs messages postés par %1", diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index f06b98b1a4..247410d7e3 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -37,14 +37,14 @@ "markAsUnreadForAll.success": "Sujet marqué comme non lu pour tout le monde.", "mark_unread": "Marquer comme non-lu", "mark_unread.success": "Sujet marqué comme non lu.", - "watch": "Surveiller", - "unwatch": "Ne plus surveiller", + "watch": "S'abonner", + "unwatch": "Se désabonner", "watch.title": "Être notifié des nouvelles réponses dans ce sujet", - "unwatch.title": "Arrêter de surveiller ce sujet", + "unwatch.title": "Se désabonner de ce sujet", "share_this_post": "Partager ce message", - "watching": "Surveiller", - "not-watching": "Ne pas surveiller", - "ignoring": "Ignorer", + "watching": "Abonné", + "not-watching": "Non abonné", + "ignoring": "Ignoré", "watching.description": "Me notifier les nouvelles réponses.
    Afficher le sujet dans l'onglet \"Non lu\".", "not-watching.description": "Ne pas me notifier les nouvelles réponses.
    Afficher le sujet dans l'onglet \"Non lu\" si la catégorie n'est pas ignorée.", "ignoring.description": "Ne pas me notifier les nouvelle réponses.
    Ne pas afficher ce sujet dans l'onglet \"Non lu\".", diff --git a/public/language/fr/unread.json b/public/language/fr/unread.json index c0849c4be8..dae04c99b9 100644 --- a/public/language/fr/unread.json +++ b/public/language/fr/unread.json @@ -9,5 +9,5 @@ "topics_marked_as_read.success": "Sujets marqués comme lus !", "all-topics": "Tous les sujets", "new-topics": "Nouveau sujet", - "watched-topics": "Sujets surveillés" + "watched-topics": "Abonnements" } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 77af69be58..2e2b4da342 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -23,7 +23,7 @@ "profile_views": "Vues", "reputation": "Réputation", "favourites": "Marque-pages", - "watched": "Suivis", + "watched": "Abonnements", "followers": "Abonnés", "following": "Abonnements", "aboutme": "À propos de moi", @@ -64,7 +64,7 @@ "settings": "Paramètres", "show_email": "Afficher mon email", "show_fullname": "Afficher mon nom complet", - "restrict_chats": "Autoriser la réception de messages provenant uniquement des personnes que je suis", + "restrict_chats": "Autoriser la réception de messages ne provenant que des personnes que je suis", "digest_label": "S’inscrire aux comptes-rendus", "digest_description": "S'abonner par email aux mises à jours de ce forum (nouvelles notifications et nouveaux sujets) selon le planning sélectionné.", "digest_off": "Désactivé", @@ -78,7 +78,7 @@ "follows_no_one": "Cet utilisateur ne suit personne :(", "has_no_posts": "Cet utilisateur n'a encore rien posté.", "has_no_topics": "Cet utilisateur n'a encore créé aucun sujet.", - "has_no_watched_topics": "Cet utilisateur n'a encore consulté aucun sujet.", + "has_no_watched_topics": "Cet utilisateur ne s'est encore abonné à aucun sujet.", "has_no_upvoted_posts": "Cet utilisateur n'a voté pour aucun message", "has_no_downvoted_posts": "Cet utilisateur n'a voté contre aucun message", "has_no_voted_posts": "Personne n'a voté pour des messages de cet utilisateur", @@ -93,10 +93,10 @@ "enable_topic_searching": "Activer la recherche dans les sujets", "topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts affichés à l'écran.", "delay_image_loading": "Délayer le chargement des images", - "image_load_delay_help": "Lorsque cette option est activée, les images des sujets ne seront pas chargées avant qu'elles soient visibles dans la fenêtre.", + "image_load_delay_help": "Lorsque cette option est activée, les images des sujets ne seront pas chargées avant qu'elles ne soient visibles dans la fenêtre.", "scroll_to_my_post": "Après avoir répondu, montrer le nouveau message", - "follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez", - "follow_topics_you_create": "Suivre les sujets que vous créez", + "follow_topics_you_reply_to": "S'abonner aux sujets auxquels vous répondez", + "follow_topics_you_create": "S'abonner aux sujets que vous créez", "grouptitle": "Nom du groupe", "no-group-title": "Aucun titre de groupe", "select-skin": "Sélectionner un thème", From e4afa6795699d9f6c6b97fe40ed438d539ba0035 Mon Sep 17 00:00:00 2001 From: Leonardo Vieira Date: Sun, 29 May 2016 07:25:50 -0300 Subject: [PATCH 36/40] allow resizing chat from left/top as well --- public/src/modules/chat.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 3bc391cfd1..f2ff94bd55 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -204,6 +204,7 @@ define('chat', [ app.loadJQueryUI(function() { chatModal.find('.modal-content').resizable({ + handles: 'n, e, s, w, se', minHeight: 250, minWidth: 400 }); From 9ae8ee861abe0f167951fef2e24e7b74015981e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 29 May 2016 21:52:13 +0300 Subject: [PATCH 37/40] closes #4700 --- src/socket.io/admin/categories.js | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 4061bb001a..b2186b9e3d 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -72,38 +72,25 @@ Categories.getPrivilegeSettings = function(socket, cid, callback) { }; Categories.copyPrivilegesToChildren = function(socket, cid, callback) { - async.parallel({ - category: function(next) { - categories.getCategories([cid], socket.uid, next); - }, - privileges: function(next) { - privileges.categories.list(cid, next); - } - }, function(err, results) { + categories.getCategories([cid], socket.uid, function(err, categories) { if (err) { return callback(err); } - var category = results.category[0]; + var category = categories[0]; async.eachSeries(category.children, function(child, next) { - copyPrivilegesToChildrenRecursive(child, results.privileges.groups, next); + copyPrivilegesToChildrenRecursive(cid, child, next); }, callback); }); }; -function copyPrivilegesToChildrenRecursive(category, privilegeGroups, callback) { - async.eachSeries(privilegeGroups, function(privGroup, next) { - var privs = Object.keys(privGroup.privileges); - async.each(privs, function(privilege, next) { - var isSet = privGroup.privileges[privilege]; - groups[isSet ? 'join' : 'leave']('cid:' + category.cid + ':privileges:' + privilege, privGroup.name, next); - }, next); - }, function(err) { +function copyPrivilegesToChildrenRecursive(parentCid, category, callback) { + categories.copyPrivilegesFrom(parentCid, category.cid, function(err) { if (err) { return callback(err); } async.eachSeries(category.children, function(child, next) { - copyPrivilegesToChildrenRecursive(child, privilegeGroups, next); + copyPrivilegesToChildrenRecursive(parentCid, child, next); }, callback); }); } From 26be7c25e4d7083607ec1d2610eeaf200c8c2f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 29 May 2016 22:27:37 +0300 Subject: [PATCH 38/40] closes #4701 --- src/categories/create.js | 15 +++++++++------ src/socket.io/admin/categories.js | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/categories/create.js b/src/categories/create.js index f6338f8ef2..82a317270b 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -62,7 +62,7 @@ module.exports = function(Categories) { }, function(results, next) { if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) { - return Categories.copySettingsFrom(data.cloneFromCid, category.cid, next); + return Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid, next); } next(null, category); }, @@ -81,7 +81,7 @@ module.exports = function(Categories) { return [backgrounds[index], text[index]]; }; - Categories.copySettingsFrom = function(fromCid, toCid, callback) { + Categories.copySettingsFrom = function(fromCid, toCid, copyParent, callback) { var destination; async.waterfall([ function (next) { @@ -97,11 +97,11 @@ module.exports = function(Categories) { destination = results.destination; var tasks = []; - if (utils.isNumber(results.source.parentCid)) { + if (copyParent && utils.isNumber(results.source.parentCid)) { tasks.push(async.apply(db.sortedSetAdd, 'cid:' + results.source.parentCid + ':children', results.source.order, toCid)); } - if (destination && utils.isNumber(destination.parentCid)) { + if (copyParent && destination && utils.isNumber(destination.parentCid)) { tasks.push(async.apply(db.sortedSetRemove, 'cid:' + destination.parentCid + ':children', toCid)); } @@ -114,8 +114,11 @@ module.exports = function(Categories) { destination.numRecentReplies = results.source.numRecentReplies; destination.class = results.source.class; destination.imageClass = results.source.imageClass; - destination.parentCid = results.source.parentCid || 0; - + + if (copyParent) { + destination.parentCid = results.source.parentCid || 0; + } + tasks.push(async.apply(db.setObject, 'category:' + toCid, destination)); async.series(tasks, next); diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index b2186b9e3d..8e24359e7a 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -96,7 +96,7 @@ function copyPrivilegesToChildrenRecursive(parentCid, category, callback) { } Categories.copySettingsFrom = function(socket, data, callback) { - categories.copySettingsFrom(data.fromCid, data.toCid, callback); + categories.copySettingsFrom(data.fromCid, data.toCid, true, callback); }; Categories.copyPrivilegesFrom = function(socket, data, callback) { From 71b3a42bed0c1ee747dc5baaff3e56165aab3a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 29 May 2016 22:38:20 +0300 Subject: [PATCH 39/40] closes #4698 --- public/src/client/category.js | 2 ++ public/src/client/recent.js | 6 ++++-- public/src/client/unread.js | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/public/src/client/category.js b/public/src/client/category.js index 5f44197a6c..10816286d9 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -59,6 +59,8 @@ define('forum/category', [ }); handleIgnoreWatch(cid); + + $(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics}); }; function handleIgnoreWatch(cid) { diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 938453894e..1f6536327d 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -5,8 +5,8 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinitescroll, components) { var Recent = {}; - var newTopicCount = 0, - newPostCount = 0; + var newTopicCount = 0; + var newPostCount = 0; $(window).on('action:ajaxify.start', function(ev, data) { if (ajaxify.currentPage !== data.url) { @@ -26,6 +26,8 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite if (!config.usePagination) { infinitescroll.init(Recent.loadMoreTopics); } + + $(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics}); }; Recent.watchForNewPosts = function () { diff --git a/public/src/client/unread.js b/public/src/client/unread.js index 5a3ec3543c..5e0fc8e127 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -20,6 +20,8 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', ' recent.watchForNewPosts(); + $(window).trigger('action:topics.loaded', {topics: ajaxify.data.topics}); + $('#markSelectedRead').on('click', function() { var tids = topicSelect.getSelectedTids(); if(!tids.length) { From d839f291ac7d54088c4d09c43af0a75bff92cc27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 29 May 2016 22:45:12 +0300 Subject: [PATCH 40/40] closes #4706 --- public/language/en_GB/notifications.json | 3 --- src/notifications.js | 3 +-- src/socket.io/posts/favourites.js | 4 ++-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/public/language/en_GB/notifications.json b/public/language/en_GB/notifications.json index 07ec757374..5a2ed58908 100644 --- a/public/language/en_GB/notifications.json +++ b/public/language/en_GB/notifications.json @@ -18,9 +18,6 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/src/notifications.js b/src/notifications.js index 7ca9c50277..f95eb52248 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -428,7 +428,6 @@ var utils = require('../public/src/utils'); Notifications.merge = function(notifications, callback) { // When passed a set of notification objects, merge any that can be merged var mergeIds = [ - 'notifications:favourited_your_post_in', 'notifications:upvoted_your_post_in', 'notifications:user_started_following_you', 'notifications:user_posted_to', @@ -475,7 +474,7 @@ var utils = require('../public/src/utils'); } switch(mergeId) { - case 'notifications:favourited_your_post_in': // intentional fall-through + // intentional fall-through case 'notifications:upvoted_your_post_in': case 'notifications:user_started_following_you': case 'notifications:user_posted_to': diff --git a/src/socket.io/posts/favourites.js b/src/socket.io/posts/favourites.js index 01be736949..c3c4f23de9 100644 --- a/src/socket.io/posts/favourites.js +++ b/src/socket.io/posts/favourites.js @@ -92,7 +92,7 @@ module.exports = function(SocketPosts) { }; SocketPosts.favourite = function(socket, data, callback) { - favouriteCommand(socket, 'favourite', 'favourited', 'notifications:favourited_your_post_in', data, callback); + favouriteCommand(socket, 'favourite', 'favourited', '', data, callback); }; SocketPosts.unfavourite = function(socket, data, callback) { @@ -103,7 +103,7 @@ module.exports = function(SocketPosts) { if (!socket.uid) { return callback(new Error('[[error:not-logged-in]]')) } - if(!data || !data.pid || !data.room_id) { + if (!data || !data.pid || !data.room_id) { return callback(new Error('[[error:invalid-data]]')); } async.parallel({