diff --git a/package.json b/package.json index 29f48a1eea..a0ba7381d7 100644 --- a/package.json +++ b/package.json @@ -61,8 +61,8 @@ "nodebb-plugin-spam-be-gone": "0.4.10", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "3.0.14", - "nodebb-theme-persona": "4.1.45", - "nodebb-theme-vanilla": "5.1.29", + "nodebb-theme-persona": "4.1.50", + "nodebb-theme-vanilla": "5.1.33", "nodebb-widget-essentials": "2.0.11", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", @@ -123,4 +123,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} diff --git a/public/language/ar/global.json b/public/language/ar/global.json index 4c86069873..fdfd1362f8 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -96,5 +96,6 @@ "upload": "ارفع", "allowed-file-types": "صيغ الملفات المدعومة هي 1%", "unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من تغيير الصفحة؟", - "reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى." + "reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 1e20b5b6cf..dbee05cfab 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/bg/global.json b/public/language/bg/global.json index d4ffed8334..06eb4b3e59 100644 --- a/public/language/bg/global.json +++ b/public/language/bg/global.json @@ -96,5 +96,6 @@ "upload": "Качване", "allowed-file-types": "Разрешените файлови типове са: %1", "unsaved-changes": "Имате незапазени промени. Наистина ли искате да напуснете тази страница?", - "reconnecting-message": "Изглежда връзката Ви към %1 беше прекъсната. Моля, изчакайте докато се опитаме да Ви свържем отново." + "reconnecting-message": "Изглежда връзката Ви към %1 беше прекъсната. Моля, изчакайте докато се опитаме да Ви свържем отново.", + "play": "Пускане" } \ No newline at end of file diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 52c196ef97..2bac3f837e 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Блокиран до %1", "info.banned-permanently": "Блокиран за постоянно", "info.banned-reason-label": "Причина", - "info.banned-no-reason": "Няма посочена причина." + "info.banned-no-reason": "Няма посочена причина.", + "info.username-history": "История на потребителските имена", + "info.email-history": "Историята на е-пощите" } \ No newline at end of file diff --git a/public/language/bn/global.json b/public/language/bn/global.json index 545020267d..35c002b5c3 100644 --- a/public/language/bn/global.json +++ b/public/language/bn/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/bn/user.json b/public/language/bn/user.json index 6e099a4896..59811361ce 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/cs/global.json b/public/language/cs/global.json index e822b289c3..9043a00952 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -96,5 +96,6 @@ "upload": "Nahrát", "allowed-file-types": "Povolené typy souborů jsou %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 51ff8ce91c..5694a135f0 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/da/global.json b/public/language/da/global.json index 5ef9da2842..0d07e841e8 100644 --- a/public/language/da/global.json +++ b/public/language/da/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Tilladte filtyper er %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/da/user.json b/public/language/da/user.json index 4d82a665fb..11a2dd8a92 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/de/global.json b/public/language/de/global.json index 2793fc58cf..99a92d3cf5 100644 --- a/public/language/de/global.json +++ b/public/language/de/global.json @@ -96,5 +96,6 @@ "upload": "Hochladen", "allowed-file-types": "Erlaubte Dateitypen sind %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 125580cfab..63a7e1a2e1 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Grund", - "info.banned-no-reason": "Kein Grund angegeben." + "info.banned-no-reason": "Kein Grund angegeben.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/el/global.json b/public/language/el/global.json index 34df3b45bf..a88c6acf22 100644 --- a/public/language/el/global.json +++ b/public/language/el/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/el/user.json b/public/language/el/user.json index 4753cfbe6d..c83190a479 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/en@pirate/global.json b/public/language/en@pirate/global.json index aa50d9d08a..2b231e6687 100644 --- a/public/language/en@pirate/global.json +++ b/public/language/en@pirate/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/en@pirate/user.json b/public/language/en@pirate/user.json index 9b8a875035..9c67a66c10 100644 --- a/public/language/en@pirate/user.json +++ b/public/language/en@pirate/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/en_GB/global.json b/public/language/en_GB/global.json index e2785de2f5..1881b53acb 100644 --- a/public/language/en_GB/global.json +++ b/public/language/en_GB/global.json @@ -23,6 +23,7 @@ "you_have_successfully_logged_in": "You have successfully logged in", "save_changes": "Save Changes", + "save": "Save", "close": "Close", "pagination": "Pagination", diff --git a/public/language/en_GB/groups.json b/public/language/en_GB/groups.json index 8d129fe376..2efc9a69fc 100644 --- a/public/language/en_GB/groups.json +++ b/public/language/en_GB/groups.json @@ -59,5 +59,7 @@ "membership.reject": "Reject", "new-group.group_name": "Group Name:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Upload group cover", + "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", + "bulk-invite": "Bulk Invite" } \ No newline at end of file diff --git a/public/language/en_GB/user.json b/public/language/en_GB/user.json index 4dfd450cff..10a21ff03e 100644 --- a/public/language/en_GB/user.json +++ b/public/language/en_GB/user.json @@ -142,5 +142,7 @@ "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", "info.username-history": "Username History", - "info.email-history": "Email History" + "info.email-history": "Email History", + "info.moderation-note": "Moderation Note", + "info.moderation-note.success": "Moderation note saved" } diff --git a/public/language/en_US/global.json b/public/language/en_US/global.json index 383516d05c..d2a0e03fa3 100644 --- a/public/language/en_US/global.json +++ b/public/language/en_US/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/en_US/user.json b/public/language/en_US/user.json index 057433ae31..00a3201eb2 100644 --- a/public/language/en_US/user.json +++ b/public/language/en_US/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/es/global.json b/public/language/es/global.json index 42a7109f6a..ba5f1ee95b 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -96,5 +96,6 @@ "upload": "Subir", "allowed-file-types": "Los tipos de archivos permitidos son: %1", "unsaved-changes": "Tienes cambios sin guardar. Seguro que quieres salir?", - "reconnecting-message": "Has perdido la conexión. Reconectando a %1." + "reconnecting-message": "Has perdido la conexión. Reconectando a %1.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/es/user.json b/public/language/es/user.json index f8a4a800e0..508ffdae32 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Baneado hasta %1", "info.banned-permanently": "Baneado permanentemente", "info.banned-reason-label": "Motivo", - "info.banned-no-reason": "Motivo no especificado" + "info.banned-no-reason": "Motivo no especificado", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/et/global.json b/public/language/et/global.json index 67ae319e61..12c77773ba 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -96,5 +96,6 @@ "upload": "Lae üles", "allowed-file-types": "Lubatud faili formaadid on %1", "unsaved-changes": "Sul on salvestamata muudatusi. Oled kindel, et soovid lahkuda?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/et/user.json b/public/language/et/user.json index e0b9078d8f..1d356f8229 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Keelustatud kuni %1", "info.banned-permanently": "Igavesti keelustatud", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 4426710bc8..497dcd049a 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -1,9 +1,9 @@ { "invalid-data": "داده(های) نامعتبر", - "not-logged-in": "وارد حساب کاربری نشده اید.", + "not-logged-in": "وارد حساب کاربری نشده‌اید.", "account-locked": "حساب کاربری شما موقتاً مسدود شده است.", - "search-requires-login": "استفاده از جستجو نیازمند ورود با نام کاربری و رمز عبور است. لطفا ابتدا وارد شوید.", - "invalid-cid": "شناسه دسته نامعتبر است.", + "search-requires-login": "استفاده از جستجو نیازمند ورود با نام‌کاربری و رمز‌عبور است. لطفا ابتدا وارد شوید.", + "invalid-cid": "آی‌دی دسته‌بندی نامعتبر است.", "invalid-tid": "شناسه موضوع نامعتبر است.", "invalid-pid": "شناسه پست نامعتبر است.", "invalid-uid": "شناسه کاربر نامعتبر است.", diff --git a/public/language/fa_IR/global.json b/public/language/fa_IR/global.json index 386c069b39..476d95651f 100644 --- a/public/language/fa_IR/global.json +++ b/public/language/fa_IR/global.json @@ -96,5 +96,6 @@ "upload": "بارگذاری", "allowed-file-types": "فایل قابل قبول اینها هستند %1", "unsaved-changes": "تغییرات شما ذخیره نشده. شما مطمئن هستید که میخواهید از اینجا دور شوید؟", - "reconnecting-message": "اتصال شما به %1 به نظر می‌رسد از دست رفته. لطفا صبر کنید ما سعی می‌کنیم که دوباره شما را متصل کنیم." + "reconnecting-message": "اتصال شما به %1 به نظر می‌رسد از دست رفته. لطفا صبر کنید ما سعی می‌کنیم که دوباره شما را متصل کنیم.", + "play": "پخش" } \ No newline at end of file diff --git a/public/language/fa_IR/user.json b/public/language/fa_IR/user.json index 71224d0abe..6e0fd1416a 100644 --- a/public/language/fa_IR/user.json +++ b/public/language/fa_IR/user.json @@ -121,5 +121,7 @@ "info.banned-until": "مسدود شده تا %1", "info.banned-permanently": "مسدود شده به طور دائم", "info.banned-reason-label": "دلیل", - "info.banned-no-reason": "هیچ دلیلی ارایه نشد." + "info.banned-no-reason": "هیچ دلیلی ارایه نشد.", + "info.username-history": "تاریخچه نام کاربری", + "info.email-history": "تاریخچه رایانامه" } \ No newline at end of file diff --git a/public/language/fa_IR/users.json b/public/language/fa_IR/users.json index 81b664bbb1..0e470d9fef 100644 --- a/public/language/fa_IR/users.json +++ b/public/language/fa_IR/users.json @@ -1,7 +1,7 @@ { "latest_users": "آخرین کاربران", "top_posters": "برترین فرستنده‌ها", - "most_reputation": "بیش‌ترین اعتبار", + "most_reputation": "بیشترین اعتبار", "most_flags": "بیشترین پرچم‌ها", "search": "جستجو", "enter_username": "یک نام کاربری برای جستجو وارد کنید", @@ -10,12 +10,12 @@ "filter-by": "فیلتر با", "online-only": "فقط آنلاین", "invite": "دعوت", - "invitation-email-sent": "ایمیل دعوتنامه برای %1 ارسال شد", + "invitation-email-sent": "رایانامه دعوت‌نامه برای %1 ارسال شد", "user_list": "فهرست کاربران", "recent_topics": "موضوع‌های اخیر", "popular_topics": "موضوع‌های پربازدید", "unread_topics": "موضوع‌های خوانده نشده", - "categories": "دسته‌ها", + "categories": "دسته‌بندی‌ها", "tags": "برچسب‌ها", "no-users-found": "کاربری پیدا نشد!" } \ No newline at end of file diff --git a/public/language/fi/global.json b/public/language/fi/global.json index 434aece0f3..a56b79e888 100644 --- a/public/language/fi/global.json +++ b/public/language/fi/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/fi/user.json b/public/language/fi/user.json index bc44655d7d..ad20653c29 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/fr/global.json b/public/language/fr/global.json index a37d6fa925..84d20f4319 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -96,5 +96,6 @@ "upload": "Envoyer", "allowed-file-types": "Les types de fichiers autorisés sont : %1", "unsaved-changes": "Vous avez des modifications non sauvegardées. Êtes-vous sûr de vouloir naviguer tout de même ?", - "reconnecting-message": "Il semble que votre connexion ait été perdue, veuillez patienter pendant que nous vous re-connectons." + "reconnecting-message": "Il semble que votre connexion ait été perdue, veuillez patienter pendant que nous vous re-connectons.", + "play": "Lire" } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 66d9fd4267..c6633441f3 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banni jusqu'au %1", "info.banned-permanently": "Banni de façon permanente", "info.banned-reason-label": "Raison", - "info.banned-no-reason": "Aucune raison donnée" + "info.banned-no-reason": "Aucune raison donnée", + "info.username-history": "Historique des noms d'utilisateur", + "info.email-history": "Historique des adresses email" } \ No newline at end of file diff --git a/public/language/gl/global.json b/public/language/gl/global.json index 0f8663d96f..f2aa29ee3d 100644 --- a/public/language/gl/global.json +++ b/public/language/gl/global.json @@ -96,5 +96,6 @@ "upload": "Subir", "allowed-file-types": "Os tipos de arquivos permitidos son: %1", "unsaved-changes": "Non gardaches tódolos cambios. Queres continuar e saír da páxina?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/gl/user.json b/public/language/gl/user.json index 075c2d5c51..3fd472308b 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Baneado hasta 1%", "info.banned-permanently": "Baneado permanentemente", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/he/global.json b/public/language/he/global.json index 8f2c2347b2..a5dc920333 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -96,5 +96,6 @@ "upload": "העלה", "allowed-file-types": "פורמטי הקבצים המורשים הם %1", "unsaved-changes": "יש לך שינויים שאינם נשמרו. האם הנך בטוח שברצונך להמשיך?", - "reconnecting-message": "נראה שההתחברות שלך אל %1 אבדה, אנא המתן בזמן שהמערכת מנסה לחבר אותך מחדש" + "reconnecting-message": "נראה שההתחברות שלך אל %1 אבדה, אנא המתן בזמן שהמערכת מנסה לחבר אותך מחדש", + "play": "Play" } \ No newline at end of file diff --git a/public/language/he/user.json b/public/language/he/user.json index e16b685fee..7373c8c74c 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/hu/global.json b/public/language/hu/global.json index 1aae7c960b..fbca98ab9f 100644 --- a/public/language/hu/global.json +++ b/public/language/hu/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/hu/user.json b/public/language/hu/user.json index b852439d9e..40710b2266 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/id/global.json b/public/language/id/global.json index 313a120729..9d596c7d6e 100644 --- a/public/language/id/global.json +++ b/public/language/id/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/id/user.json b/public/language/id/user.json index 666ba89276..d0c0032195 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/it/global.json b/public/language/it/global.json index 8aa3659f7d..57bbaa0164 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -96,5 +96,6 @@ "upload": "Carica", "allowed-file-types": "Le estensioni permesse dei file sono %1", "unsaved-changes": "Hai delle modifiche non salvate. Sei sicuro che vuoi lasciare la pagina?", - "reconnecting-message": "Sembra che la tua connessione a %1 sia stata persa, per favore attenti mentre proviamo a riconnetterti." + "reconnecting-message": "Sembra che la tua connessione a %1 sia stata persa, per favore attenti mentre proviamo a riconnetterti.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/it/user.json b/public/language/it/user.json index 3cc0daa921..0042f1ba9f 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Bannato fino %1", "info.banned-permanently": "Bannato permanentemente", "info.banned-reason-label": "Motivo", - "info.banned-no-reason": "Non è stata data nessuna motivazione." + "info.banned-no-reason": "Non è stata data nessuna motivazione.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/ja/global.json b/public/language/ja/global.json index 107ae13ee7..e38ea7315b 100644 --- a/public/language/ja/global.json +++ b/public/language/ja/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 613332cdb2..9379383b8a 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/ko/global.json b/public/language/ko/global.json index 6e9b7b3a93..9fd5fa47ef 100644 --- a/public/language/ko/global.json +++ b/public/language/ko/global.json @@ -96,5 +96,6 @@ "upload": "업로드", "allowed-file-types": "사용가능한 파일 유형: %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 8937d90611..b58a7d9480 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/lt/global.json b/public/language/lt/global.json index 1ffeb7040a..1a6070a82c 100644 --- a/public/language/lt/global.json +++ b/public/language/lt/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 3046cca2e8..2b52a624bd 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Užblokuotas iki %1", "info.banned-permanently": "Užblokuotas visam laikui", "info.banned-reason-label": "Priežastis", - "info.banned-no-reason": "Be priežasties" + "info.banned-no-reason": "Be priežasties", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/ms/global.json b/public/language/ms/global.json index 40d6209ba9..e651a3fdf1 100644 --- a/public/language/ms/global.json +++ b/public/language/ms/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 3cbbcf1e26..3d9402845d 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/nb/global.json b/public/language/nb/global.json index 020fe6aa62..03ab9adf9f 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 75c3a35287..0fed01f667 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/nl/global.json b/public/language/nl/global.json index bf94e340b2..2cf9f0d6f6 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Toegestane bestandstypen zijn %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/nl/user.json b/public/language/nl/user.json index f8c51f1d35..a06c32c5cb 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Verbannen tot %1", "info.banned-permanently": "Voor altijd verbannen", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 9e2e24f64d..b865879460 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -29,7 +29,7 @@ "username-too-long": "Zbyt długa nazwa użytkownika", "password-too-long": "Hasło jest za długie", "user-banned": "Użytkownik zbanowany", - "user-banned-reason": "User banned (Reason: %1)", + "user-banned-reason": "Użytkownik zbanowany (powód: %1)", "user-too-new": "Przepraszamy, musisz odczekać %1 sekund(y) przed utworzeniem pierwszego posta", "blacklisted-ip": "Twój adres IP został zablokowany na tej społeczności. Jeśli uważasz to za błąd, zgłoś to administratorowi", "ban-expiry-missing": "Wprowadź datę końca blokady", diff --git a/public/language/pl/global.json b/public/language/pl/global.json index b3e8819172..cccd6705d6 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -96,5 +96,6 @@ "upload": "Załaduj", "allowed-file-types": "Dozwolone typy plików %1", "unsaved-changes": "Posiadasz niezapisane zmiany. Jesteś pewien, że chcesz opuścić stronę?", - "reconnecting-message": "Wygląda na to, że Twoje połączenie z %1 zostało przerwane. Proszę czekać gdy staramy się je odnowić." + "reconnecting-message": "Wygląda na to, że Twoje połączenie z %1 zostało przerwane. Proszę czekać gdy staramy się je odnowić.", + "play": "Odtwórz" } \ No newline at end of file diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index dc5ec1e37c..cf2c18fbe3 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -51,7 +51,7 @@ "not-watching.description": "Nie informuj mnie o nowych odpowiedziach
Pokaż temat w nieprzeczytanych, jeśli kategoria nie jest ignorowana.", "ignoring.description": "Nie informuj mnie o nowych odpowiedziach
Nie pokazuj tematu w nieprzeczytanych.", "thread_tools.title": "Narzędzia Tematu", - "thread_tools.markAsUnreadForAll": "Mark unread for all", + "thread_tools.markAsUnreadForAll": "Zaznacz wszystkie jako nieprzeczytane", "thread_tools.pin": "Przypnij Temat", "thread_tools.unpin": "Odepnij Temat", "thread_tools.lock": "Zablokuj Temat", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 10d7b78316..0fc4ba0af9 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -93,7 +93,7 @@ "incoming-message-sound": "Dźwięk przychodzącej wiadomości", "outgoing-message-sound": "Dźwięk wychodzącej wiadomości", "notification-sound": "Dźwięk powiadomienia", - "no-sound": "No sound", + "no-sound": "Bez dźwięku", "browsing": "Ustawienia szukania", "open_links_in_new_tab": "Otwieraj linki wychodzące w nowej karcie", "enable_topic_searching": "Odblokuj szukanie w temacie", @@ -121,5 +121,7 @@ "info.banned-until": "Zbanowany do %1", "info.banned-permanently": "Zbanowany permanentnie", "info.banned-reason-label": "Powód", - "info.banned-no-reason": "Nie podano powodu." + "info.banned-no-reason": "Nie podano powodu.", + "info.username-history": "Historia nazwy użytkownika", + "info.email-history": "Historia adresu e-mail" } \ No newline at end of file diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index b99b1bada0..38571fe60d 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -29,7 +29,7 @@ "username-too-long": "Nome de usuário muito longo", "password-too-long": "A senha é muito grande", "user-banned": "Usuário banido", - "user-banned-reason": "User banned (Reason: %1)", + "user-banned-reason": "Usuário banido (Motivo: %1)", "user-too-new": "Desculpe, é necessário que você aguarde %1 segundo(s) antes de fazer o seu primeiro post.", "blacklisted-ip": "Desculpe, o seu endereço IP foi banido desta comunidade. Se você acha que isso é um engano, por favor contate um administrador.", "ban-expiry-missing": "Por favor forneça uma data para o fim deste banimento", diff --git a/public/language/pt_BR/global.json b/public/language/pt_BR/global.json index 3b9cb20fea..7e3b515eed 100644 --- a/public/language/pt_BR/global.json +++ b/public/language/pt_BR/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Os tipos de arquivo permitidos são %1", "unsaved-changes": "Você tem alterações não salvas. Tem certeza que você deseja sair da página?", - "reconnecting-message": "Parece que sua conexão com %1 caiu, por favor aguarde enquanto tentamos reconectar." + "reconnecting-message": "Parece que sua conexão com %1 caiu, por favor aguarde enquanto tentamos reconectar.", + "play": "Executar" } \ No newline at end of file diff --git a/public/language/pt_BR/topic.json b/public/language/pt_BR/topic.json index 2b74650131..3d7531fadd 100644 --- a/public/language/pt_BR/topic.json +++ b/public/language/pt_BR/topic.json @@ -51,7 +51,7 @@ "not-watching.description": "Não me notificar de novas respostas.
Mostrar tópico em não-lido se a categoria não estiver sendo ignorada.", "ignoring.description": "Não me notificar de novas respostas.
Não mostrar tópico em não-lido.", "thread_tools.title": "Ferramentas de Tópico", - "thread_tools.markAsUnreadForAll": "Mark unread for all", + "thread_tools.markAsUnreadForAll": "Marcar como não-lido para todos", "thread_tools.pin": "Fixar Tópico", "thread_tools.unpin": "Desfixar Tópico", "thread_tools.lock": "Trancar Tópico", diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index e1a090a9b9..2d306417f6 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -93,7 +93,7 @@ "incoming-message-sound": "Som de recebimento de mensagem", "outgoing-message-sound": "Som de envio de mensagem", "notification-sound": "Som de notificação", - "no-sound": "No sound", + "no-sound": "Sem som", "browsing": "Configurações de Navegação", "open_links_in_new_tab": "Abrir links externos em nova aba", "enable_topic_searching": "Habilitar Pesquisa dentro de Tópico", @@ -121,5 +121,7 @@ "info.banned-until": "Banido até %1", "info.banned-permanently": "Banido permanentemente", "info.banned-reason-label": "Motivo", - "info.banned-no-reason": "Sem motivo escolhido." + "info.banned-no-reason": "Sem motivo escolhido.", + "info.username-history": "Histórico do Nome de Usuário", + "info.email-history": "Histórico do Email" } \ No newline at end of file diff --git a/public/language/ro/global.json b/public/language/ro/global.json index c634e3a1c8..f8b346044f 100644 --- a/public/language/ro/global.json +++ b/public/language/ro/global.json @@ -96,5 +96,6 @@ "upload": "Încărcați", "allowed-file-types": "Tipuri de fișiere permise sunt %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/ro/user.json b/public/language/ro/user.json index fa33cfde6b..9ed9377725 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/ru/global.json b/public/language/ru/global.json index f2b3f3d8c5..9c584431ed 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -96,5 +96,6 @@ "upload": "Загрузить", "allowed-file-types": "Разрешенные форматы файлов %1", "unsaved-changes": "У вас есть несохраненные изменения. Вы уверены, что хотите уйти?", - "reconnecting-message": "Похоже, подключение к %1 было разорвано, подождите, пока мы пытаемся восстановить соединение." + "reconnecting-message": "Похоже, подключение к %1 было разорвано, подождите, пока мы пытаемся восстановить соединение.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 2e2fe18957..ab372b0d1a 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Заблокирован до %1", "info.banned-permanently": "Заблокирован навсегда", "info.banned-reason-label": "Причина", - "info.banned-no-reason": "Без объяснения причин." + "info.banned-no-reason": "Без объяснения причин.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/rw/global.json b/public/language/rw/global.json index bb0164820c..f0922ae9ac 100644 --- a/public/language/rw/global.json +++ b/public/language/rw/global.json @@ -96,5 +96,6 @@ "upload": "Pakira", "allowed-file-types": "Ubwoko bw'amafayilo bwemewe ni %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/rw/user.json b/public/language/rw/user.json index 5b65837c81..ab2f435f54 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/sc/global.json b/public/language/sc/global.json index a5b6a3e20f..159188e8c2 100644 --- a/public/language/sc/global.json +++ b/public/language/sc/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 23f54011e1..90746c1fe8 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/sk/global.json b/public/language/sk/global.json index 7a2ac8cbaa..f184a5f15a 100644 --- a/public/language/sk/global.json +++ b/public/language/sk/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 1b0005c625..a98ec25207 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/sl/global.json b/public/language/sl/global.json index 14ae52986b..e1bd5970e0 100644 --- a/public/language/sl/global.json +++ b/public/language/sl/global.json @@ -51,7 +51,7 @@ "users": "Uporabniki", "topics": "Teme", "posts": "Objave", - "best": "Najbolše", + "best": "Najboljše", "upvoters": "Glasovalcev za", "upvoted": "Glasov za", "downvoters": "Glasovalcev proti", @@ -96,5 +96,6 @@ "upload": "Prenos", "allowed-file-types": "Dovoljene vrste datotek so %1", "unsaved-changes": "Imate neshranjene spremembe. A res želite stran?", - "reconnecting-message": "Kot kaže je bila povezava do %1 prekinjena. Počakajte, ponovno poskušamo vzpostaviti povezavo." + "reconnecting-message": "Kot kaže je bila povezava do %1 prekinjena. Počakajte, ponovno poskušamo vzpostaviti povezavo.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/sl/tags.json b/public/language/sl/tags.json index df2187edd8..90d0a74dc2 100644 --- a/public/language/sl/tags.json +++ b/public/language/sl/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Ni novih tem s to oznako.", "tags": "Oznake", - "enter_tags_here": "Tu vpišite oznake. Dovoljeno število znakov: najmaj %1 in največ 2%.", + "enter_tags_here": "Tu vpišite oznake. Dovoljeno število znakov: najmaj %1 in največ %2.", "enter_tags_here_short": "Vpišite oznake...", "no_tags": "Oznak še ni." } \ No newline at end of file diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 26d2040d4b..fedcef19fc 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -62,7 +62,7 @@ "upload_a_picture": "Naloži fotografijo", "remove_uploaded_picture": "Odstrani preneseno sliko ", "upload_cover_picture": "Prenesi fotografijo naslovnice", - "settings": "Nastavitve.", + "settings": "Nastavitve", "show_email": "Pokaži moj e-poštni naslov.", "show_fullname": "Pokaži moj ime in priimek.", "restrict_chats": "Dovoli klepet samo z osebami, ki jim sledim.", @@ -89,11 +89,11 @@ "topics_per_page": "Število tem na stran", "posts_per_page": "Število objav na stran", "notification_sounds": "Zvočno me opozori, ko prejmem obvestilo", - "notifications_and_sounds": "Notifications & Sounds", - "incoming-message-sound": "Incoming message sound", - "outgoing-message-sound": "Outgoing message sound", - "notification-sound": "Notification sound", - "no-sound": "No sound", + "notifications_and_sounds": "Obvestila in zvoki", + "incoming-message-sound": "Zvok za prejeto sporočilo", + "outgoing-message-sound": "Zvok za poslano sporočilo", + "notification-sound": "Zvok obvestila", + "no-sound": "Ni zvoka", "browsing": "Preglej nastavitve", "open_links_in_new_tab": "Zunanje povezave odpri v novem zavihku", "enable_topic_searching": "Omogoči iskanje znotraj teme", @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/sr/global.json b/public/language/sr/global.json index 8af7ca5b1d..57615dd8df 100644 --- a/public/language/sr/global.json +++ b/public/language/sr/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/sr/user.json b/public/language/sr/user.json index c4f7639e10..824efb8cc5 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/sv/global.json b/public/language/sv/global.json index 992f2a32fe..50e107b718 100644 --- a/public/language/sv/global.json +++ b/public/language/sv/global.json @@ -96,5 +96,6 @@ "upload": "Ladda upp", "allowed-file-types": "Tillåtna filtyper är %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index 03ba94fc00..74baf42d74 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/th/global.json b/public/language/th/global.json index 09e26d956a..94080b0922 100644 --- a/public/language/th/global.json +++ b/public/language/th/global.json @@ -96,5 +96,6 @@ "upload": "Upload", "allowed-file-types": "Allowed file types are %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index af15ad9890..41048b8c6a 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 65c8a3586f..7ae7eff012 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -29,7 +29,7 @@ "username-too-long": "Kullanıcı ismi çok uzun.", "password-too-long": "Parola çok uzun", "user-banned": "Kullanıcı Yasaklı", - "user-banned-reason": "User banned (Reason: %1)", + "user-banned-reason": "Kullanıcı yasaklandı (Sebep: %1)", "user-too-new": "Özür dileriz, ilk iletinizi yapmadan önce %1 saniye beklemeniz gerekiyor", "blacklisted-ip": "Üzgünüz, IP adresiniz, bu toplulukta yasaklandı. Bunun bir hata olduğunu düşünüyorsanız, bir yönetici ile irtibata geçiniz.", "ban-expiry-missing": "Bu yasak için bir bitiş tarihi girin", diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 59c01ab819..98c65856b4 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -96,5 +96,6 @@ "upload": "Yükle", "allowed-file-types": "İzin verilen dosya tipleri %1", "unsaved-changes": "Kaydedilmemiş değişiklikler var. Çıkmak istediğinize emin misiniz?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Oynat" } \ No newline at end of file diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index d46d9dc0b5..56d3adc900 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -51,7 +51,7 @@ "not-watching.description": "Yeni bir ileti geldiğinde bildirme.
Kategori susturulmamışsa okunmamış olarak göster.", "ignoring.description": "Yeni bir ileti geldiğinde bildirme.
Okunmamış olarak gösterme.", "thread_tools.title": "Konu Ayaları", - "thread_tools.markAsUnreadForAll": "Mark unread for all", + "thread_tools.markAsUnreadForAll": "Hepsini okundu işaretle", "thread_tools.pin": "Başlığı İğnele", "thread_tools.unpin": "Başlığı İğneleme", "thread_tools.lock": "Başlığı Kitle", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 4922ec388f..1d7b966ecb 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -93,7 +93,7 @@ "incoming-message-sound": "Gelen mesaj sesi", "outgoing-message-sound": "Giden ileti sesi", "notification-sound": "Bildiri sesi", - "no-sound": "No sound", + "no-sound": "Ses yok", "browsing": "Tarayıcı Ayaları", "open_links_in_new_tab": "Dışarı giden bağlantıları yeni sekmede aç", "enable_topic_searching": "Konu içi aramayı aktive et", @@ -121,5 +121,7 @@ "info.banned-until": "Yasaklama süresi %1", "info.banned-permanently": "Kalıcı yasakla", "info.banned-reason-label": "Gerekçe", - "info.banned-no-reason": "Gerekçe belirtilmedi." + "info.banned-no-reason": "Gerekçe belirtilmedi.", + "info.username-history": "Kullanıcı Adı Geçmişi", + "info.email-history": "Email Geçmişi" } \ No newline at end of file diff --git a/public/language/vi/global.json b/public/language/vi/global.json index 01890dcd33..5d16408aae 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -96,5 +96,6 @@ "upload": "Tải lên", "allowed-file-types": "Các định dạng file được cho phép là %1", "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "play": "Play" } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 0d3666bbe7..55615761b0 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -121,5 +121,7 @@ "info.banned-until": "Banned until %1", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given." + "info.banned-no-reason": "No reason given.", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/zh_CN/global.json b/public/language/zh_CN/global.json index 23a31f52a6..67baf99e9d 100644 --- a/public/language/zh_CN/global.json +++ b/public/language/zh_CN/global.json @@ -96,5 +96,6 @@ "upload": "上传", "allowed-file-types": "允许的文件类型有 %1", "unsaved-changes": "您有未保存的更改,您确定您要离开么?", - "reconnecting-message": "与 %1 的连接断开,我们正在尝试重连,请耐心等待" + "reconnecting-message": "与 %1 的连接断开,我们正在尝试重连,请耐心等待", + "play": "Play" } \ No newline at end of file diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index 4f61238f56..fac99339d1 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -121,5 +121,7 @@ "info.banned-until": "封禁到 %1", "info.banned-permanently": "永久封禁", "info.banned-reason-label": "原因", - "info.banned-no-reason": "没有原因" + "info.banned-no-reason": "没有原因", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/language/zh_TW/global.json b/public/language/zh_TW/global.json index 54a8ce2248..6c523cf698 100644 --- a/public/language/zh_TW/global.json +++ b/public/language/zh_TW/global.json @@ -96,5 +96,6 @@ "upload": "上傳", "allowed-file-types": "允許的檔案類型是 %1", "unsaved-changes": "你還沒有儲存更動。你確定想要離開這個頁面?", - "reconnecting-message": "看起來你的連線到 %1 已經遺失,請稍等一下我們嘗試重新連線。" + "reconnecting-message": "看起來你的連線到 %1 已經遺失,請稍等一下我們嘗試重新連線。", + "play": "Play" } \ No newline at end of file diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index 99e3adca75..d25b5fc25b 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -121,5 +121,7 @@ "info.banned-until": "禁用至 %1", "info.banned-permanently": "永久禁用", "info.banned-reason-label": "理由", - "info.banned-no-reason": "沒有給理由" + "info.banned-no-reason": "沒有給理由", + "info.username-history": "Username History", + "info.email-history": "Email History" } \ No newline at end of file diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index 5647f8b2d7..4351f4eae3 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -1,5 +1,5 @@ "use strict"; -/*global config, componentHandler, define, socket, app, ajaxify, utils, bootbox, Slideout, NProgress, RELATIVE_PATH*/ +/*global config, componentHandler, socket, app, bootbox, Slideout, NProgress*/ (function() { var logoutTimer = 0; @@ -31,7 +31,7 @@ function showCorrectNavTab() { // show correct tab if url has # if (window.location.hash) { - $('.nav-pills a[href=' + window.location.hash + ']').tab('show'); + $('.nav-pills a[href="' + window.location.hash + '"]').tab('show'); } } @@ -52,8 +52,6 @@ }); $(window).on('action:ajaxify.contentLoaded', function(ev, data) { - var url = data.url; - selectMenuItem(data.url); setupRestartLinks(); @@ -65,7 +63,7 @@ NProgress.set(0.7); }); - $(window).on('action:ajaxify.end', function(ev, data) { + $(window).on('action:ajaxify.end', function() { NProgress.done(); }); } @@ -82,7 +80,7 @@ socket.emit('admin.restart'); }); - mousetrap.bind('/', function(event) { + mousetrap.bind('/', function() { $('#acp-search input').focus(); return false; diff --git a/public/src/client/account/info.js b/public/src/client/account/info.js index b95f68b838..3e1a218827 100644 --- a/public/src/client/account/info.js +++ b/public/src/client/account/info.js @@ -1,13 +1,26 @@ 'use strict'; -/* globals define */ +/* globals define, socket, ajaxify, app */ define('forum/account/info', ['forum/account/header'], function(header) { var Info = {}; Info.init = function() { header.init(); + handleModerationNote(); }; + function handleModerationNote() { + $('[component="account/save-moderation-note"]').on('click', function() { + var note = $('[component="account/moderation-note"]').val(); + socket.emit('user.setModerationNote', {uid: ajaxify.data.uid, note: note}, function(err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('[[user:info.moderation-note.success]]'); + }); + }); + } + return Info; }); diff --git a/public/src/client/categoryTools.js b/public/src/client/categoryTools.js index 970ab29d4a..8344ddf355 100644 --- a/public/src/client/categoryTools.js +++ b/public/src/client/categoryTools.js @@ -68,7 +68,9 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect', 'components', return app.alertError(err.message); } app.alertSuccess('[[topic:markAsUnreadForAll.success]]'); - + tids.forEach(function(tid) { + $('[component="category/topic"][data-tid="' + tid + '"]').addClass('unread'); + }); onCommandComplete(); }); } diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 619dbc9ec0..2435042289 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -81,6 +81,39 @@ define('forum/chats', [ Chats.addSinceHandler(ajaxify.data.roomId, $('.expanded-chat .chat-content'), $('.expanded-chat [data-since]')); Chats.addRenameHandler(ajaxify.data.roomId, $('[component="chat/room/name"]')); + Chats.addScrollHandler(ajaxify.data.roomId, ajaxify.data.uid, $('.chat-content')); + }; + + Chats.addScrollHandler = function(roomId, uid, el) { + var loading = false; + el.off('scroll').on('scroll', function() { + if (loading) { + return; + } + + var top = (el[0].scrollHeight - el.height()) * 0.1; + if (el.scrollTop() >= top) { + return; + } + loading = true; + + socket.emit('modules.chats.getMessages', {roomId: roomId, uid: uid, start: $('.chat-content').children('[data-index]').first().attr('data-index')}, function(err, data) { + if (err) { + return app.alertError(err.message); + } + + messages.parseMessage(data, function(html) { + var currentScrollTop = el.scrollTop(); + var previousHeight = el[0].scrollHeight; + html = $(html); + el.prepend(html); + html.find('.timeago').timeago(); + html.find('img:not(.not-responsive)').addClass('img-responsive'); + el.scrollTop((el[0].scrollHeight - previousHeight) + currentScrollTop); + loading = false; + }); + }); + }); }; Chats.addEditDeleteHandler = function(element, roomId) { @@ -265,7 +298,7 @@ define('forum/chats', [ }; Chats.switchChat = function(roomid) { - ajaxify.go('chats/' + roomid); + ajaxify.go('user/' + ajaxify.data.userslug + '/chats/' + roomid); }; Chats.loadChatSince = function(roomId, chatContentEl, since) { diff --git a/public/src/client/chats/recent.js b/public/src/client/chats/recent.js index 6905841269..9afc7ab76a 100644 --- a/public/src/client/chats/recent.js +++ b/public/src/client/chats/recent.js @@ -23,6 +23,7 @@ define('forum/chats/recent', function() { } recentChats.attr('loading', 1); socket.emit('modules.chats.getRecentChats', { + uid: ajaxify.data.uid, after: recentChats.attr('data-nextstart') }, function(err, data) { if (err) { diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index f71b37886e..d2f1cfbd8d 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -1,5 +1,5 @@ "use strict"; -/* globals define, socket, ajaxify, app, bootbox, utils, RELATIVE_PATH */ +/* globals define, socket, ajaxify, app, bootbox, utils, config */ define('forum/groups/details', [ 'forum/groups/memberlist', @@ -227,23 +227,41 @@ define('forum/groups/details', [ }; function handleMemberInvitations() { - if (ajaxify.data.group.isOwner) { - var searchInput = $('[component="groups/members/invite"]'); - require(['autocomplete'], function(autocomplete) { - autocomplete.user(searchInput, function(event, selected) { - socket.emit('groups.issueInvite', { - toUid: selected.item.user.uid, - groupName: ajaxify.data.group.name - }, function(err) { - if (!err) { - ajaxify.refresh(); - } else { - app.alertError(err.message); - } - }); + if (!ajaxify.data.group.isOwner) { + return; + } + + var searchInput = $('[component="groups/members/invite"]'); + require(['autocomplete'], function(autocomplete) { + autocomplete.user(searchInput, function(event, selected) { + socket.emit('groups.issueInvite', { + toUid: selected.item.user.uid, + groupName: ajaxify.data.group.name + }, function(err) { + if (err) { + return app.alertError(err.message); + } + ajaxify.refresh(); }); }); - } + }); + + $('[component="groups/members/bulk-invite-button"]').on('click', function() { + var usernames = $('[component="groups/members/bulk-invite"]').val(); + if (!usernames) { + return false; + } + socket.emit('groups.issueMassInvite', { + usernames: usernames, + groupName: ajaxify.data.group.name + }, function(err) { + if (err) { + return app.alertError(err.message); + } + ajaxify.refresh(); + }); + return false; + }); } function removeCover() { diff --git a/public/src/client/search.js b/public/src/client/search.js index b9632513bc..91839ff880 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -63,49 +63,49 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco function fillOutForm() { var params = utils.params(); var searchData = searchModule.getSearchPreferences(); - params = utils.merge(searchData, params); + var formData = utils.merge(searchData, params); - if (params) { + if (formData) { if (params.term) { $('#search-input').val(params.term); } - if (params.in) { - $('#search-in').val(params.in); - updateFormItemVisiblity(params.in); + if (formData.in) { + $('#search-in').val(formData.in); + updateFormItemVisiblity(formData.in); } - if (params.by) { - $('#posted-by-user').val(params.by); + if (formData.by) { + $('#posted-by-user').val(formData.by); } - if (params.categories) { - $('#posted-in-categories').val(params.categories); + if (formData.categories) { + $('#posted-in-categories').val(formData.categories); } - if (params.searchChildren) { + if (formData.searchChildren) { $('#search-children').prop('checked', true); } - if (params.replies) { - $('#reply-count').val(params.replies); - $('#reply-count-filter').val(params.repliesFilter); + if (formData.replies) { + $('#reply-count').val(formData.replies); + $('#reply-count-filter').val(formData.repliesFilter); } - if (params.timeRange) { - $('#post-time-range').val(params.timeRange); - $('#post-time-filter').val(params.timeFilter); + if (formData.timeRange) { + $('#post-time-range').val(formData.timeRange); + $('#post-time-filter').val(formData.timeFilter); } - if (params.sortBy) { - $('#post-sort-by').val(params.sortBy); - $('#post-sort-direction').val(params.sortDirection); + if (formData.sortBy) { + $('#post-sort-by').val(formData.sortBy); + $('#post-sort-direction').val(formData.sortDirection); } - if (params.showAs) { - var isTopic = params.showAs === 'topics'; - var isPost = params.showAs === 'posts'; + if (formData.showAs) { + var isTopic = formData.showAs === 'topics'; + var isPost = formData.showAs === 'posts'; $('#show-as-topics').prop('checked', isTopic).parent().toggleClass('active', isTopic); $('#show-as-posts').prop('checked', isPost).parent().toggleClass('active', isPost); } diff --git a/public/src/client/topic/delete-posts.js b/public/src/client/topic/delete-posts.js index a40ef3dbc5..8c114679c4 100644 --- a/public/src/client/topic/delete-posts.js +++ b/public/src/client/topic/delete-posts.js @@ -1,31 +1,33 @@ 'use strict'; -/* globals define, app, ajaxify, socket, templates */ +/* globals define, app, ajaxify, socket */ -define('forum/topic/delete-posts', ['components', 'postSelect', 'translator'], function(components, postSelect, translator) { +define('forum/topic/delete-posts', ['components', 'postSelect'], function(components, postSelect) { - var DeletePosts = {}, - modal, - deleteBtn, - purgeBtn; + var DeletePosts = {}; + var modal; + var deleteBtn; + var purgeBtn; DeletePosts.init = function() { $('.topic').on('click', '[component="topic/delete/posts"]', onDeletePostsClicked); + $(window).on('action:ajaxify.start', onAjaxifyStart); }; - function onDeletePostsClicked() { - parseModal(function(html) { - modal = $(html); + function onAjaxifyStart() { + closeModal(); + $(window).off('action:ajaxify.start', onAjaxifyStart); + } - modal.on('hidden.bs.modal', function() { - modal.remove(); - }); + function onDeletePostsClicked() { + app.parseAndTranslate('partials/delete_posts_modal', {}, function(html) { + modal = html; + + $('body').append(modal); deleteBtn = modal.find('#delete_posts_confirm'); purgeBtn = modal.find('#purge_posts_confirm'); - showModal(); - modal.find('.close,#delete_posts_cancel').on('click', closeModal); postSelect.init(function() { @@ -43,20 +45,6 @@ define('forum/topic/delete-posts', ['components', 'postSelect', 'translator'], f }); } - function parseModal(callback) { - templates.parse('partials/delete_posts_modal', {}, function(html) { - translator.translate(html, callback); - }); - } - - function showModal() { - modal.modal({backdrop: false, show: true}) - .css('position', 'fixed') - .css('left', Math.max(0, (($(window).width() - modal.outerWidth()) / 2) + $(window).scrollLeft()) + 'px') - .css('top', '0px') - .css('z-index', '2000'); - } - function deletePosts(btn, command) { btn.attr('disabled', true); socket.emit(command, { @@ -74,7 +62,7 @@ define('forum/topic/delete-posts', ['components', 'postSelect', 'translator'], f function showPostsSelected() { if (postSelect.pids.length) { - modal.find('#pids').text(postSelect.pids.join(', ')); + modal.find('#pids').translateHtml('[[topic:fork_pid_count, ' + postSelect.pids.length + ']]'); } else { modal.find('#pids').translateHtml('[[topic:fork_no_pids]]'); } @@ -92,10 +80,13 @@ define('forum/topic/delete-posts', ['components', 'postSelect', 'translator'], f function closeModal() { postSelect.pids.forEach(function(pid) { - components.get('post', 'pid', pid).css('opacity', 1); + components.get('post', 'pid', pid).toggleClass('bg-success', false); }); - modal.modal('hide'); + if (modal) { + modal.remove(); + modal = null; + } components.get('topic').off('click', '[data-pid]'); postSelect.enableClicksOnPosts(); diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 68a864198e..4d8434adb8 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -220,7 +220,7 @@ define('forum/topic/events', [ function onNewNotification(data) { var tid = ajaxify.data.tid; if (data && data.tid && parseInt(data.tid, 10) === parseInt(tid, 10)) { - socket.emit('topics.markTopicNotificationsRead', tid); + socket.emit('topics.markTopicNotificationsRead', [tid]); } } diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 8e0b435434..7b87b6e376 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -31,7 +31,7 @@ define('chat', [ if (!ajaxify.currentPage.match(/^chats\//)) { app.openChat(roomId); } else { - ajaxify.go('chats/' + roomId); + ajaxify.go('user/' + app.user.userslug + '/chats/' + roomId); } }); @@ -104,7 +104,7 @@ define('chat', [ }; module.loadChatsDropdown = function(chatsListEl) { - socket.emit('modules.chats.getRecentChats', {after: 0}, function(err, data) { + socket.emit('modules.chats.getRecentChats', {uid: app.user.uid, after: 0}, function(err, data) { if (err) { return app.alertError(err.message); } @@ -214,7 +214,7 @@ define('chat', [ components.get('chat/input').val(text); }); - ajaxify.go('chats/' + chatModal.attr('roomId')); + ajaxify.go('user/' + app.user.userslug + '/chats/' + chatModal.attr('roomId')); module.close(chatModal); } @@ -261,6 +261,8 @@ define('chat', [ Chats.loadChatSince(chatModal.attr('roomId'), chatModal.find('.chat-content'), 'recent'); + Chats.addScrollHandler(chatModal.attr('roomId'), app.user.uid, chatModal.find('.chat-content')); + checkStatus(chatModal); taskbar.push('chat', chatModal.attr('UUID'), { diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index a031efdd0f..f0fc980666 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -183,6 +183,10 @@ var namespace = result[0]; var key = result[1]; + if (namespace && !key) { + return Promise.resolve('[[' + namespace + ']]'); + } + var translation = this.getTranslation(namespace, key); var argsToTranslate = args.map(function (arg) { return string(arg).collapseWhitespace().decodeHTMLEntities().escapeHTML().s; @@ -298,7 +302,7 @@ Translator.create(lang).translate(text).then(function (output) { return cb(output); }).catch(function (err) { - console.error('Translation failed: ' + err.message); + console.error('Translation failed: ' + err.stack); }); }, diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index d9393c7c08..e7a1d0ba4e 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -32,6 +32,39 @@ module.exports = function(Categories) { ], callback); }; + Categories.updateRecentTid = function(cid, tid, callback) { + async.parallel({ + count: function(next) { + db.sortedSetCard('cid:' + cid + ':recent_tids', next); + }, + numRecentReplies: function(next) { + db.getObjectField('category:' + cid, 'numRecentReplies', next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + + if (results.count < results.numRecentReplies) { + return db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid, callback); + } + async.waterfall([ + function(next) { + db.getSortedSetRangeWithScores('cid:' + cid + ':recent_tids', 0, results.count - results.numRecentReplies, next); + }, + function(data, next) { + if (!data.length) { + return next(); + } + db.sortedSetsRemoveRangeByScore(['cid:' + cid + ':recent_tids'], '-inf', data[data.length - 1].score, next); + }, + function(next) { + db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid, next); + } + ], callback); + }); + }; + Categories.getRecentTopicReplies = function(categoryData, uid, callback) { if (!Array.isArray(categoryData) || !categoryData.length) { return callback(); @@ -39,7 +72,10 @@ module.exports = function(Categories) { async.waterfall([ function(next) { - async.map(categoryData, getRecentTopicTids, next); + var keys = categoryData.map(function(category) { + return 'cid:' + category.cid + ':recent_tids'; + }); + db.getSortedSetsMembers(keys, next); }, function(results, next) { var tids = _.flatten(results); @@ -62,45 +98,6 @@ module.exports = function(Categories) { ], callback); }; - function getRecentTopicTids(category, callback) { - var count = parseInt(category.numRecentReplies, 10); - if (!count) { - return callback(null, []); - } - - if (count === 1) { - async.waterfall([ - function (next) { - db.getSortedSetRevRange('cid:' + category.cid + ':pids', 0, 0, next); - }, - function (pid, next) { - posts.getPostField(pid, 'tid', next); - }, - function (tid, next) { - next(null, [tid]); - } - ], callback); - return; - } - - async.parallel({ - pinnedTids: function(next) { - db.getSortedSetRevRangeByScore('cid:' + category.cid + ':tids', 0, -1, '+inf', Date.now(), next); - }, - tids: function(next) { - db.getSortedSetRevRangeByScore('cid:' + category.cid + ':tids', 0, Math.max(1, count), Date.now(), '-inf', next); - } - }, function(err, results) { - if (err) { - return callback(err); - } - - results.tids = results.tids.concat(results.pinnedTids); - - callback(null, results.tids); - }); - } - function getTopics(tids, callback) { var topicData; async.waterfall([ diff --git a/src/categories/topics.js b/src/categories/topics.js index 05b20668cf..b1a0bfae54 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -89,6 +89,9 @@ module.exports = function(Categories) { db.sortedSetAdd('cid:' + cid + ':tids', postData.timestamp, postData.tid, next); } }, + function(next){ + Categories.updateRecentTid(cid, postData.tid, next); + }, function(next) { db.sortedSetIncrBy('cid:' + cid + ':tids:posts', 1, postData.tid, next); } diff --git a/src/controllers/accounts/chats.js b/src/controllers/accounts/chats.js index 4af94c5521..7ff867134c 100644 --- a/src/controllers/accounts/chats.js +++ b/src/controllers/accounts/chats.js @@ -4,74 +4,111 @@ var async = require('async'); var messaging = require('../../messaging'); var meta = require('../../meta'); +var user = require('../../user'); var helpers = require('../helpers'); - var chatsController = {}; chatsController.get = function(req, res, callback) { if (parseInt(meta.config.disableChat, 10) === 1) { return callback(); } + var uid; + var username; + var recentChats; - messaging.getRecentChats(req.uid, 0, 19, function(err, recentChats) { + async.waterfall([ + function(next) { + async.parallel({ + uid: async.apply(user.getUidByUserslug, req.params.userslug), + username: async.apply(user.getUsernameByUserslug, req.params.userslug) + }, next); + }, + function(results, next) { + uid = results.uid; + username = results.username; + if (!uid) { + return callback(); + } + messaging.getRecentChats(uid, 0, 19, next); + }, + function(_recentChats, next) { + recentChats = _recentChats; + if (!req.params.roomid) { + return res.render('chats', { + rooms: recentChats.rooms, + uid: uid, + userslug: req.params.userslug, + nextStart: recentChats.nextStart, + allowed: true, + title: '[[pages:chats]]', + breadcrumbs: helpers.buildBreadcrumbs([{text: username, url: '/user/' + req.params.userslug}, {text: '[[pages:chats]]'}]) + }); + } + messaging.isUserInRoom(req.uid, req.params.roomid, next); + }, + function(inRoom, next) { + if (!inRoom && parseInt(req.uid, 10) === parseInt(uid, 10)) { + return callback(); + } + async.parallel({ + users: async.apply(messaging.getUsersInRoom, req.params.roomid, 0, -1), + messages: async.apply(messaging.getMessages, { + uid: uid, + roomId: req.params.roomid, + since: 'recent', + isNew: false + }), + room: async.apply(messaging.getRoomData, req.params.roomid) + }, next); + } + ], function(err, data) { if (err) { return callback(err); } + var room = data.room; + room.messages = data.messages; - if (!req.params.roomid) { - return res.render('chats', { - rooms: recentChats.rooms, - nextStart: recentChats.nextStart, - allowed: true, - title: '[[pages:chats]]', - breadcrumbs: helpers.buildBreadcrumbs([{text: '[[pages:chats]]'}]) - }); - } - - async.waterfall([ - function (next) { - messaging.isUserInRoom(req.uid, req.params.roomid, next); - }, - function (inRoom, next) { - if (!inRoom) { - return callback(); - } - - async.parallel({ - users: async.apply(messaging.getUsersInRoom, req.params.roomid, 0, -1), - messages: async.apply(messaging.getMessages, { - uid: req.uid, - roomId: req.params.roomid, - since: 'recent', - isNew: false - }), - room: async.apply(messaging.getRoomData, req.params.roomid) - }, next); - } - ], function(err, data) { - if (err) { - return callback(err); - } - var room = data.room; - room.messages = data.messages; - - room.isOwner = parseInt(room.owner, 10) === parseInt(req.uid, 10); - room.users = data.users.filter(function(user) { - return user && parseInt(user.uid, 10) && parseInt(user.uid, 10) !== req.uid; - }); - - room.rooms = recentChats.rooms; - room.nextStart = recentChats.nextStart; - room.title = room.roomName; - room.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[pages:chats]]', url: '/chats'}, {text: room.roomName}]); - room.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0; - room.maximumChatMessageLength = parseInt(meta.config.maximumChatMessageLength, 10) || 1000; - room.showUserInput = !room.maximumUsersInChatRoom || room.maximumUsersInChatRoom > 2; - - res.render('chats', room); + room.isOwner = parseInt(room.owner, 10) === parseInt(req.uid, 10); + room.users = data.users.filter(function(user) { + return user && parseInt(user.uid, 10) && parseInt(user.uid, 10) !== req.uid; }); + + room.rooms = recentChats.rooms; + room.uid = uid; + room.userslug = req.params.userslug; + room.nextStart = recentChats.nextStart; + room.title = room.roomName; + room.breadcrumbs = helpers.buildBreadcrumbs([ + {text: username, url: '/user/' + req.params.userslug}, + {text: '[[pages:chats]]', url: '/user/' + req.params.userslug + '/chats'}, + {text: room.roomName} + ]); + room.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0; + room.maximumChatMessageLength = parseInt(meta.config.maximumChatMessageLength, 10) || 1000; + room.showUserInput = !room.maximumUsersInChatRoom || room.maximumUsersInChatRoom > 2; + + res.render('chats', room); }); }; +chatsController.redirectToChat = function(req, res, next) { + var roomid = parseInt(req.params.roomid, 10); + if (!req.uid) { + return next(); + } + user.getUserField(req.uid, 'userslug', function(err, userslug) { + if (err || !userslug) { + return next(err); + } + + if (!roomid) { + return helpers.redirect(res, '/user/' + userslug + '/chats'); + } + helpers.redirect(res, '/user/' + userslug + '/chats/' + roomid); + }); +}; + + + module.exports = chatsController; \ No newline at end of file diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index 29bcb1d851..3d9b2a9a1e 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -92,6 +92,7 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { userData.theirid = userData.uid; userData.isAdmin = isAdmin; userData.isGlobalModerator = isGlobalModerator; + userData.isAdminOrGlobalModerator = isAdmin || isGlobalModerator; userData.canBan = isAdmin || isGlobalModerator; userData.canChangePassword = isAdmin || (isSelf && parseInt(meta.config['password:disableEdit'], 10) !== 1); userData.isSelf = isSelf; @@ -118,6 +119,7 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { userData.location = validator.escape(String(userData.location || '')); userData.signature = validator.escape(String(userData.signature || '')); userData.aboutme = validator.escape(String(userData.aboutme || '')); + userData.birthday = validator.escape(String(userData.birthday || '')); userData['cover:url'] = userData['cover:url'] || require('../../coverPhoto').getDefaultProfileCover(userData.uid); userData['cover:position'] = userData['cover:position'] || '50% 50%'; diff --git a/src/controllers/admin/flags.js b/src/controllers/admin/flags.js index 75a82d1e55..bed5c57767 100644 --- a/src/controllers/admin/flags.js +++ b/src/controllers/admin/flags.js @@ -1,6 +1,8 @@ "use strict"; var async = require('async'); +var validator = require('validator'); + var posts = require('../../posts'); var user = require('../../user'); var categories = require('../../categories'); @@ -54,7 +56,7 @@ flagsController.get = function(req, res, next) { assignees: results.assignees, analytics: results.analytics, categories: results.categories, - byUsername: byUsername, + byUsername: validator(String(byUsername)), sortByCount: sortBy === 'count', sortByTime: sortBy === 'time', pagination: pagination.create(page, pageCount, req.query), diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index ce2c652b6a..43707bfccd 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -322,6 +322,9 @@ authenticationController.onSuccessfulLogin = function(req, uid, callback) { }, function (next) { db.setObjectField('uid:' + uid + 'sessionUUID:sessionId', uuid, req.sessionID, next); + }, + function (next) { + user.updateLastOnlineTime(uid, next); } ], function(err) { if (err) { diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 9d106a85f2..d017f1d5c8 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -283,7 +283,7 @@ topicsController.get = function(req, res, callback) { } if (markedRead) { topics.pushUnreadCount(req.uid); - topics.markTopicNotificationsRead(tid, req.uid); + topics.markTopicNotificationsRead([tid], req.uid); } }); } diff --git a/src/controllers/unread.js b/src/controllers/unread.js index c610b91723..8860f541d9 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -3,6 +3,7 @@ var async = require('async'); var querystring = require('querystring'); +var validator = require('validator'); var categories = require('../categories'); var privileges = require('../privileges'); @@ -85,7 +86,7 @@ unreadController.get = function(req, res, next) { return filter && filter.selected; })[0]; - data.querystring = req.query.cid ? ('?cid=' + req.query.cid) : ''; + data.querystring = cid ? ('?cid=' + validator.escape(String(cid))) : ''; res.render('unread', data); }); diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index dbf294119e..585abea8b6 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -231,9 +231,11 @@ module.exports = function(db, module) { module.incrObjectFieldBy = function(key, field, value, callback) { callback = callback || helpers.noop; - if (!key) { + value = parseInt(value, 10); + if (!key || isNaN(value)) { return callback(); } + var data = {}; field = helpers.fieldToString(field); data[field] = value; diff --git a/src/messaging.js b/src/messaging.js index b17bea6ec2..2fe69e50fe 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -49,21 +49,22 @@ var async = require('async'), }; Messaging.getMessages = function(params, callback) { - var uid = params.uid, - roomId = params.roomId, - since = params.since, - isNew = params.isNew, - count = params.count || 250, - markRead = params.markRead || true; + var uid = params.uid; + var roomId = params.roomId; + var since = params.since; + var isNew = params.isNew; + var start = params.hasOwnProperty('start') ? params.start : 0; + var count = params.count || 250; + var markRead = params.markRead || true; var min = params.count ? 0 : Date.now() - (terms[since] || terms.day); if (since === 'recent') { - count = 49; + count = 50; min = 0; } - db.getSortedSetRevRangeByScore('uid:' + uid + ':chat:room:' + roomId + ':mids', 0, count, '+inf', min, function(err, mids) { + db.getSortedSetRevRangeByScore('uid:' + uid + ':chat:room:' + roomId + ':mids', start, count, '+inf', min, function(err, mids) { if (err) { return callback(err); } @@ -71,10 +72,24 @@ var async = require('async'), if (!Array.isArray(mids) || !mids.length) { return callback(null, []); } + var indices = {}; + mids.forEach(function(mid, index) { + indices[mid] = start + index; + }); mids.reverse(); - Messaging.getMessagesData(mids, uid, roomId, isNew, callback); + Messaging.getMessagesData(mids, uid, roomId, isNew, function(err, messageData) { + if (err) { + return callback(err); + } + + for(var i=0; i