diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..0799652254 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,20 @@ +node_modules/ +public/src/nodebb.min.js +*.sublime-project +*.sublime-workspace +.project +.vagrant +.DS_Store +logs/ +/public/templates +/public/uploads +/public/sounds +/public/vendor +/public/nodebb.min.js +/public/acp.min.js +/public/src/modules/string.js +.idea/ +.vscode/ +*.ipr +*.iws +/coverage diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..f8ca19c4cb --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "rules": { + "handle-callback-err": [ "error", "^(e$|(e|(.*(_e|E)))rr)" ] + } +} + diff --git a/.gitignore b/.gitignore index a83a93d01f..510c95a201 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ provision.sh *.komodoproject .DS_Store feeds/recent.rss +.eslintcache logs/ @@ -51,4 +52,4 @@ tx.exe .transifexrc ##Coverage output -coverage \ No newline at end of file +coverage diff --git a/.travis.yml b/.travis.yml index ffd3716c2a..82838ced67 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,11 +19,9 @@ addons: packages: - g++-4.8 node_js: - - "4.2" - - "4.1" - - "4.0" - - "0.11" - - "0.10" + - "6" + - "5" + - "4" branches: only: - master \ No newline at end of file diff --git a/app.js b/app.js index c633af9932..c348cbfed5 100644 --- a/app.js +++ b/app.js @@ -1,7 +1,7 @@ /* NodeBB - A better forum platform for the modern web https://github.com/NodeBB/NodeBB/ - Copyright (C) 2013-2014 NodeBB Inc. + Copyright (C) 2013-2016 NodeBB Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -54,10 +54,11 @@ if (nconf.get('config')) { var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database')); loadConfig(); +versionCheck(); if (!process.send) { // If run using `node app`, log GNU copyright info along with server info - winston.info('NodeBB v' + nconf.get('version') + ' Copyright (C) 2013-2014 NodeBB Inc.'); + winston.info('NodeBB v' + nconf.get('version') + ' Copyright (C) 2013-' + (new Date()).getFullYear() + ' NodeBB Inc.'); winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); winston.info(''); @@ -117,6 +118,9 @@ function start() { if (!nconf.get('upload_path')) { nconf.set('upload_path', '/public/uploads'); } + if (!nconf.get('sessionKey')) { + nconf.set('sessionKey', 'express.sid'); + } // Parse out the relative_url and other goodies from the configured URL var urlObject = url.parse(nconf.get('url')); var relativePath = urlObject.pathname !== '/' ? urlObject.pathname : ''; @@ -347,3 +351,15 @@ function restart() { shutdown(1); } } + +function versionCheck() { + var version = process.version.slice(1); + var range = pkg.engines.node; + var semver = require('semver'); + var compatible = semver.satisfies(version, range); + + if (!compatible) { + winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.'); + winston.warn('Recommended ' + range.green + ', '.reset + version.yellow + ' provided\n'.reset); + } +} \ No newline at end of file diff --git a/package.json b/package.json index b646107d59..0d64d51ec8 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "main": "app.js", "scripts": { "start": "node loader.js", + "lint": "eslint --cache .", + "pretest": "npm run lint", "test": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- ./tests -t 10000" }, "dependencies": { @@ -57,9 +59,9 @@ "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.10", "nodebb-rewards-essentials": "0.0.9", - "nodebb-theme-lavender": "3.0.13", - "nodebb-theme-persona": "4.1.37", - "nodebb-theme-vanilla": "5.1.21", + "nodebb-theme-lavender": "3.0.14", + "nodebb-theme-persona": "4.1.42", + "nodebb-theme-vanilla": "5.1.25", "nodebb-widget-essentials": "2.0.10", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", @@ -90,6 +92,7 @@ "xregexp": "~3.1.0" }, "devDependencies": { + "eslint": "^3.4.0", "grunt": "~0.4.5", "grunt-contrib-watch": "^1.0.0", "istanbul": "^0.4.2", @@ -99,7 +102,7 @@ "url": "https://github.com/NodeBB/NodeBB/issues" }, "engines": { - "node": ">=0.10" + "node": ">=4" }, "maintainers": [ { @@ -118,4 +121,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} diff --git a/public/language/ar/category.json b/public/language/ar/category.json index 833873ea84..807b1579e3 100644 --- a/public/language/ar/category.json +++ b/public/language/ar/category.json @@ -6,7 +6,7 @@ "no_topics": "لا توجد مواضيع في هذه الفئةلم لا تحاول إنشاء موضوع؟
", "browsing": "تصفح", "no_replies": "لم يرد أحد", - "no_new_posts": "لا يوجد مشاركات جديدة.", + "no_new_posts": "لا توجد مشاركات جديدة.", "share_this_category": "انشر هذه الفئة", "watch": "تابع", "ignore": "تجاهل", diff --git a/public/language/ar/error.json b/public/language/ar/error.json index f1a81bf0c3..fdd300043b 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -14,24 +14,24 @@ "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", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "csrf-invalid": "لم تتمكن من تسجيل الدخول. هنالك أحتمال ان جلستك انتهت. رجاءًا حاول مرة اخرى.", + "invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .", "username-taken": "اسم المستخدم مأخوذ", "email-taken": "البريد الالكتروني مأخوذ", "email-not-confirmed": "عنوان بريدك الإلكتروني غير مفعل بعد. انقر هنا لتفعيله من فضلك.", "email-not-confirmed-chat": "لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email.", + "email-not-confirmed-email-sent": "بريدك الإلكتروني غير مفعل. رجاءًا تفحص صندوق البريد عن رسالة التفعيل.", "no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.", "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", "confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", "username-too-short": "اسم المستخدم قصير.", "username-too-long": "اسم المستخدم طويل", - "password-too-long": "Password too long", + "password-too-long": "كلمة السر طويلة ", "user-banned": "المستخدم محظور", "user-too-new": "عذرا, يجب أن تنتظر 1% ثواني قبل قيامك بأول مشاركة", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", - "ban-expiry-missing": "Please provide an end date for this ban", + "blacklisted-ip": "نأسف، لقد تم حظرك من استخدام وتصفح المنتدى. إذا كنت تعتقد أن هذا خطأ رجاءًا اتصل بالإدارة. ", + "ban-expiry-missing": "رجاءًا ضع تاريخ نهاية الحظر. ", "no-category": "قائمة غير موجودة", "no-topic": "موضوع غير موجود", "no-post": "رد غير موجود", @@ -41,7 +41,7 @@ "no-privileges": "لاتملك الصلاحيات اللازمة للقيام بهذه العملية", "category-disabled": "قائمة معطلة", "topic-locked": "الموضوع مقفول", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", + "post-edit-duration-expired": "مسموح لك بتعديل مشاركتك بعد %1 ثانية من نشرها.", "post-edit-duration-expired-minutes": "You are only allowed to edit posts for %1 minute(s) after posting", "post-edit-duration-expired-minutes-seconds": "You are only allowed to edit posts for %1 minute(s) %2 second(s) after posting", "post-edit-duration-expired-hours": "You are only allowed to edit posts for %1 hour(s) after posting", @@ -67,25 +67,25 @@ "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)", "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)", - "still-uploading": "الرجاء انتظار الرفع", - "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", - "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "still-uploading": "الرجاء الانتظار حتى يكتمل الرفع.", + "file-too-big": "الحد الأقصى لرفع الملفات %1 كيلو بت. رجاءًا ارفع ملف أصغر", + "guest-upload-disabled": "خاصية رفع الملفات غير مفعلة للزوار.", + "already-favourited": "سبق وفضلت هذه المشاركة.", + "already-unfavourited": "لقد ازلت هذه المشاركةمن المفضلة من قبل ألا تذكر؟", "cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.", - "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", - "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", + "cant-remove-last-admin": "رجاءًا ، أضف مدير أخر قبل حذف صلاحيات الإدارة من حسابك.", + "cant-delete-admin": "رجاءًا أزل صلاحيات الإدارة قبل حذف الحساب. ", + "invalid-image-type": "نوع الصورة غير مدعوم. الأنواع المدعومة هي : %1", + "invalid-image-extension": "امتداد الصورة غير مدعوم.", "invalid-file-type": "Invalid file type. Allowed types are: %1", "group-name-too-short": "اسم المجموعة قصير", - "group-name-too-long": "Group name too long", + "group-name-too-long": "اسم المجموعة طويل.", "group-already-exists": "المجموعة موجودة مسبقا", "group-name-change-not-allowed": "لايسمح بتغيير أسماء المجموعات", - "group-already-member": "Already part of this group", - "group-not-member": "Not a member of this group", + "group-already-member": "أنت عضو في هذه المجموعة.", + "group-not-member": "أنت لست عضو في هذه المجموعة.", "group-needs-owner": "هذه المجموعة تتطلب مالك واحد على اﻷقل", - "group-already-invited": "This user has already been invited", + "group-already-invited": "المستخدم مدعُو بالفعل.", "group-already-requested": "Your membership request has already been submitted", "post-already-deleted": "سبق وتم حذف هذا الرد", "post-already-restored": "سبق وتم إلغاء حذف هذا الرد", @@ -96,22 +96,22 @@ "invalid-file": "ملف غير مقبول", "uploads-are-disabled": "رفع الملفات غير مفعل", "signature-too-long": "عذرا، توقيعك يجب ألا يتجاوز %1 حرفًا.", - "about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).", + "about-me-too-long": "نأسف، ( عني ) لا يمكن أن يكون أكثر من %1 حرف. ", "cant-chat-with-yourself": "لايمكنك فتح محادثة مع نفسك", "chat-restricted": "هذا المستخدم عطل المحادثات الواردة عليه. يجب أن يتبعك حتى تتمكن من فتح محادثة معه.", - "chat-disabled": "Chat system disabled", + "chat-disabled": "نظام المحادثة معطل.", "too-many-messages": "لقد أرسلت الكثير من الرسائل، الرجاء اﻹنتظار قليلاً", - "invalid-chat-message": "Invalid chat message", - "chat-message-too-long": "Chat message is too long", - "cant-edit-chat-message": "You are not allowed to edit this message", - "cant-remove-last-user": "You can't remove the last user", - "cant-delete-chat-message": "You are not allowed to delete this message", - "already-voting-for-this-post": "You have already voted for this post.", + "invalid-chat-message": "الرسالة غير صالحة.", + "chat-message-too-long": "الرسالة طويلة.", + "cant-edit-chat-message": "غير مصرح لك بتعديل الرسالة.", + "cant-remove-last-user": "لأيمكنك إزالت اخر مستخدم.", + "cant-delete-chat-message": "غير مصرح لك بحذف الرسالة.", + "already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟", "reputation-system-disabled": "نظام السمعة معطل", "downvoting-disabled": "التصويتات السلبية معطلة", "not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع", "not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل", - "already-flagged": "You have already flagged this post", + "already-flagged": "لقد بلغت عن هذه المشاركة من قبل.", "reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.", "registration-error": "حدث خطأ أثناء التسجيل", "parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم", @@ -119,9 +119,11 @@ "wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room", - "no-users-in-room": "No users in this room", - "cant-kick-self": "You can't kick yourself from the group", - "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "not-in-room": "المستخدم غير موجود في الغرفة.", + "no-users-in-room": "لا يوجد مستخدمين في الغرفة.", + "cant-kick-self": "لا يمكنك طرد نفسك من المجموعة.", + "no-users-selected": "لا يوجد مستخدم محدد.", + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/ar/global.json b/public/language/ar/global.json index fc94028a36..4c86069873 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -4,13 +4,13 @@ "buttons.close": "أغلق", "403.title": "غير مسموح بالدخول", "403.message": "يبدو أنك قد تعثرت على صفحة لا تمتلك الصلاحية للدخول إليها", - "403.login": "Perhaps you should try logging in?", + "403.login": "حاول أن تسجل دخولك.", "404.title": "لم يتم العثور", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", - "500.title": "Internal Error.", + "404.message": "الصفحة غير موجودة. العودة لـ الرئيسية", + "500.title": "خطأ داخلي", "500.message": "عفوا! يبدو وكأنه شيء ذهب على نحو خاطئ!", - "400.title": "Bad Request.", - "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", + "400.title": "طلب سيئ", + "400.message": "الرابط غير صحيح. رجاءًا تأكد من الرابط أو ارجع لـ الرئيسية", "register": "تسجيل", "login": "دخول", "please_log_in": "المرجو تسجيل الدخول", @@ -35,7 +35,7 @@ "header.notifications": "التنبيهات", "header.search": "بحث", "header.profile": "ملف", - "header.navigation": "Navigation", + "header.navigation": "الاستكشاف", "notifications.loading": "تحميل التبليغات", "chats.loading": "تحميل الدردشات", "motd.welcome": "مرحبا بكم NodeBB، منصة مناقشة المستقبل", @@ -51,31 +51,31 @@ "users": "الأعضاء", "topics": "المواضيع", "posts": "المشاركات", - "best": "Best", - "upvoters": "Upvoters", - "upvoted": "Upvoted", - "downvoters": "Downvoters", - "downvoted": "Downvoted", + "best": "الأفضل", + "upvoters": "الموافقين", + "upvoted": "مصوت بالموجب", + "downvoters": "مصوتين بالسالب", + "downvoted": "مصوت بالسالب", "views": "المشاهدات", "reputation": "السمعة", "read_more": "اقرأ المزيد", "more": "المزيد", - "posted_ago_by_guest": "كتب %1 من طرف زائر", - "posted_ago_by": "كتب %1 من طرف %2", + "posted_ago_by_guest": "كتب %1 بواسطة زائر", + "posted_ago_by": "كتب %1 بواسطة %2", "posted_ago": "كتب %1", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", + "posted_in": "كتب في %1", + "posted_in_by": "كتب في 1% بواسطة %2", "posted_in_ago": "كتب في %1 %2", "posted_in_ago_by": "كتب في %1 %2 من طرف %3", "user_posted_ago": "%1 كتب %2", "guest_posted_ago": "كتب زائر %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "اخر تحرير بواسطة 1%", "norecentposts": "لاوجود لمشاركات جديدة", "norecenttopics": "لاوجود لمواضيع جديدة", "recentposts": "آخر المشاركات", "recentips": "آخر عناوين ال IP التي سجلت الدخول", "away": "غير متواجد", - "dnd": "Do not disturb", + "dnd": "عدم الإزعاج", "invisible": "مخفي", "offline": "غير متصل", "email": "عنوان البريد الإلكتروني", @@ -88,13 +88,13 @@ "follow": "متابعة", "unfollow": "إلغاء المتابعة", "delete_all": "حذف الكل", - "map": "Map", - "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", - "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." + "map": "خريطة", + "sessions": "الجلسة", + "ip_address": "عنوان الآي بي", + "enter_page_number": "ادخل رقم الصفحة", + "upload_file": "ارفع ملف", + "upload": "ارفع", + "allowed-file-types": "صيغ الملفات المدعومة هي 1%", + "unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من تغيير الصفحة؟", + "reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى." } \ No newline at end of file diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 6ffaaa75d7..0bb287eda6 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -13,7 +13,7 @@ "notify_me": "تلق تنبيهات بالردود الجديدة في هذا الموضوع", "quote": "اقتبس", "reply": "رد", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "رد بموضوع", "guest-login-reply": "يجب عليك تسجيل الدخول للرد", "edit": "تعديل", "delete": "حذف", @@ -26,9 +26,9 @@ "tools": "أدوات", "flag": "تبليغ", "locked": "مقفل", - "pinned": "Pinned", - "moved": "Moved", - "bookmark_instructions": "Click here to return to the last read post in this thread.", + "pinned": "مثبت", + "moved": "منقول", + "bookmark_instructions": "اضغط هنا للعودة لأخر مشاركة مقروءة في الموضوع", "flag_title": "إشعار بمشاركة مخلة.", "flag_success": "تم الإشعار بهذه المشاركة على أنها مخلة", "deleted_message": "هذه المشاركة محذوفة. فقط من لهم صلاحية الإشراف على ا لمشاركات يمكنهم معاينتها.", @@ -37,17 +37,17 @@ "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.", "login_to_subscribe": "المرجو إنشاء حساب أو تسجيل الدخول حتى يمكنك متابعة هذا الموضوع.", "markAsUnreadForAll.success": "تم تحديد الموضوع على أنه غير مقروء.", - "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread": "حدده كغير مقروء", + "mark_unread.success": "الموضوع حدد على أنه غير مقروء", "watch": "مراقبة", "unwatch": "الغاء المراقبة", "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.", + "watching": "مراقبة", + "not-watching": "غير مراقب", + "ignoring": "تجاهل", + "watching.description": "بلغني بالردود الجديدة
\nاظهر الموضوع في غير مقروء", "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.", "thread_tools.title": "أدوات الموضوع", @@ -60,7 +60,7 @@ "thread_tools.move_all": "نقل الكل", "thread_tools.fork": "إنشاء فرع الموضوع", "thread_tools.delete": "حذف الموضوع", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "مشاركات محذوفة", "thread_tools.delete_confirm": "هل أنت متأكد أنك تريد حذف هذا الموضوع؟", "thread_tools.restore": "استعادة الموضوع", "thread_tools.restore_confirm": "هل أنت متأكد أنك تريد استعادة هذا الموضوع؟", @@ -74,9 +74,9 @@ "disabled_categories_note": "الفئات المعطلة رمادية", "confirm_move": "انقل", "confirm_fork": "فرع", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "المفضلة", + "favourites": "المفضلات", + "favourites.has_no_favourites": "لم تقم بتفضيل اي مشاركة حتى الأن.", "loading_more_posts": "تحميل المزيد من المشاركات", "move_topic": "نقل الموضوع", "move_topics": "نقل المواضيع", @@ -86,7 +86,7 @@ "topic_will_be_moved_to": "هذا الموضوع سوف ينقل إلى فئة", "fork_topic_instruction": "إضغط على المشاركات التي تريد تفريعها", "fork_no_pids": "لم تختر أي مشاركة", - "fork_pid_count": "%1 post(s) selected", + "fork_pid_count": "1% مشاركة محددة", "fork_success": "تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.", "delete_posts_instruction": "Click the posts you want to delete/purge", "composer.title_placeholder": "أدخل عنوان موضوعك هنا...", @@ -113,10 +113,10 @@ "most_posts": "اﻷكثر رداً", "stale.title": "Create new topic instead?", "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", - "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", - "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "stale.create": "موضوع جديد", + "stale.reply_anyway": "الرد على هذا الموضوع ", + "link_back": "رد: [%1](%2)", + "spam": "سبام", + "offensive": "مسيئ", + "custom-flag-reason": "أدخل سبب التبليغ" } \ No newline at end of file diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 0654ea0a71..65b93f7a46 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -89,6 +89,10 @@ "topics_per_page": "المواضيع في كل صفحة", "posts_per_page": "الردود في كل صفحة", "notification_sounds": "تشغيل صوت عند تلقي تنبيه", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "خيارات التصفح", "open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة", "enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 48d57a8dee..42e826cb48 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Няма потребители в тази стая", "cant-kick-self": "Не можете да изритате себе си от групата", "no-users-selected": "Няма избран(и) потребител(и)", - "invalid-home-page-route": "Грешен път към началната страница" + "invalid-home-page-route": "Грешен път към началната страница", + "invalid-session": "Несъответствие в сесията", + "invalid-session-text": "Изглежда сесията Ви за вход вече е изтекла, или не съответства на сървъра. Моля, презаредете страницата." } \ No newline at end of file diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 097e272f48..624c56c91f 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Теми на страница", "posts_per_page": "Публикации на страница", "notification_sounds": "Изпълняване на звук, когато получите известие", + "notifications_and_sounds": "Известия и звуци", + "incoming-message-sound": "Звук за входящо съобщение", + "outgoing-message-sound": "Звук за изходящо съобщение", + "notification-sound": "Звук за известие", "browsing": "Настройки за страниците", "open_links_in_new_tab": "Отваряне на външните връзки в нов подпрозорец", "enable_topic_searching": "Включване на търсенето в темите", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 66e8758fcb..d55a11cb39 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/bn/user.json b/public/language/bn/user.json index c7edda527f..94430186a6 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -89,6 +89,10 @@ "topics_per_page": "প্রতি পেজে কতগুলো টপিক থাকবে", "posts_per_page": "প্রতি পেইজে কতগুলো পোষ্ট থাকবে", "notification_sounds": "নোটিফিকেশনের জন্য নোটিফিকেশন সাউন্ড এনাবল করুন", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing সেটিংস", "open_links_in_new_tab": "আউটগোয়িং লিংকগুলো নতুন ট্যাবে খুলুন", "enable_topic_searching": "In-Topic সার্চ সক্রীয় করো", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 1c27c9e522..02627687a6 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "Nemůžete vyhodit sami sebe ze kupiny", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 82809507c9..f4c5c62fd8 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Témat na stránce", "posts_per_page": "Příspěvků na stránce", "notification_sounds": "Přehrát zvuk když dostanete notifikaci", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/da/error.json b/public/language/da/error.json index 9be724b215..da3251a3f7 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Ingen brugere i rummet", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/da/user.json b/public/language/da/user.json index ddc063914a..3391eb928c 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Emner per side", "posts_per_page": "Indlæg per side", "notification_sounds": "Afspil en lyd når du modtager en notifikation", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Gennemsenings indstillinger", "open_links_in_new_tab": "Åben udgående link i en ny tab", "enable_topic_searching": "Slå In-Topic søgning til", diff --git a/public/language/de/error.json b/public/language/de/error.json index d10bf13c3e..19d65e559a 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "In diesem Raum befinden sich keine Benutzer.", "cant-kick-self": "Du kannst dich nicht selber aus der Gruppe entfernen.", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index acfe2516d6..fe75e315ae 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Themen pro Seite", "posts_per_page": "Beiträge pro Seite", "notification_sounds": "Ton abspielen, wenn du eine Benachrichtigung erhältst", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing", "open_links_in_new_tab": "Ausgehende Links in neuem Tab öffnen", "enable_topic_searching": "Suchen innerhalb von Themen aktivieren", diff --git a/public/language/el/error.json b/public/language/el/error.json index 32c609f78b..13e6988445 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/el/user.json b/public/language/el/user.json index d9b4bdbb78..5bb86d6774 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Θέματα ανά σελίδα", "posts_per_page": "Δημοσιεύσεις ανά σελίδα", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Επιλογές Περιήγησης", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index 2ec9878ee8..1d2065d115 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/en@pirate/user.json b/public/language/en@pirate/user.json index 812cc2d946..52b1802eeb 100644 --- a/public/language/en@pirate/user.json +++ b/public/language/en@pirate/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Topics per Page", "posts_per_page": "Posts per Page", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index b6ddd1a2bb..a5e7cf9cbe 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -36,6 +36,7 @@ "password-too-long": "Password too long", "user-banned": "User banned", + "user-banned-reason": "User banned (Reason: %1)", "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", "ban-expiry-missing": "Please provide an end date for this ban", diff --git a/public/language/en_GB/user.json b/public/language/en_GB/user.json index 5863d4d67c..44cc5bfa94 100644 --- a/public/language/en_GB/user.json +++ b/public/language/en_GB/user.json @@ -102,6 +102,7 @@ "incoming-message-sound": "Incoming message sound", "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", + "no-sound": "No sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", @@ -137,5 +138,7 @@ "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", - "info.banned-permanently": "Banned permanently" + "info.banned-permanently": "Banned permanently", + "info.banned-reason-label": "Reason", + "info.banned-no-reason": "No reason given." } diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index 2ec9878ee8..1d2065d115 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/en_US/user.json b/public/language/en_US/user.json index b2c183e3a2..d188d01f61 100644 --- a/public/language/en_US/user.json +++ b/public/language/en_US/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Topics per Page", "posts_per_page": "Posts per Page", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/es/error.json b/public/language/es/error.json index f49449598c..15cf9dcfec 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No hay usuarios en esta sala", "cant-kick-self": "No te puedes expulsar a ti mismo del grupo", "no-users-selected": "Ningun usuario(s) seleccionado", - "invalid-home-page-route": "Ruta de página de inicio invalida" + "invalid-home-page-route": "Ruta de página de inicio invalida", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/es/global.json b/public/language/es/global.json index 2162a64ee7..42a7109f6a 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -96,5 +96,5 @@ "upload": "Subir", "allowed-file-types": "Los tipos de archivos permitidos son: %1", "unsaved-changes": "Tienes cambios sin guardar. Seguro que quieres salir?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Has perdido la conexión. Reconectando a %1." } \ No newline at end of file diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index aaab0f7d10..b0391106db 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -15,7 +15,7 @@ "upvoted_your_post_in_dual": "%1 y %2 han votado positivamente tu respuesta en %3.", "upvoted_your_post_in_multiple": "%1 y otras %2 personas han votado positivamente tu respuesta en %3.", "moved_your_post": "%1 su tema ha sido movido a %2", - "moved_your_topic": "%1 se ha movido %2", + "moved_your_topic": "%1 ha movido %2", "user_flagged_post_in": "%1 ha reportado una respuesta en %2", "user_flagged_post_in_dual": "%1 y %2 han reportado un post en %3", "user_flagged_post_in_multiple": "%1 y otras %2 personas han reportado un post en %3", diff --git a/public/language/es/user.json b/public/language/es/user.json index 3a3a112cec..da036d0b7e 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Temas por página", "posts_per_page": "Post por página", "notification_sounds": "Reproducir un sonido al recibir una notificación", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "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 \"dentro del tema\"", diff --git a/public/language/et/error.json b/public/language/et/error.json index 20a047ab3c..9bf49634ee 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Ühtegi kasutajat ei leidu siit ruumist", "cant-kick-self": "Sa ei saa ennast ära visata gruppist", "no-users-selected": "Ühtki kasutajat pole valitud", - "invalid-home-page-route": "Vigane avalehe suunamine" + "invalid-home-page-route": "Vigane avalehe suunamine", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/et/user.json b/public/language/et/user.json index 0e94b3198d..1d63381814 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Teemasi ühe lehekülje kohta", "posts_per_page": "Postitusi ühe lehekülje kohta", "notification_sounds": "Mängi heli, kui teade saabub.", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Sirvimis sätted", "open_links_in_new_tab": "Ava väljaminevad lingid uues aknas", "enable_topic_searching": "Võimalda teemasisene otsing", diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 6063b7cfd7..5daaf16e9c 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "هیچ کاربری در این گفتگو نیست", "cant-kick-self": "شما نمی توانید خودتان را از گروه کیک کنید", "no-users-selected": "هیچ کاربر(های) انتخاب نشده", - "invalid-home-page-route": "مسیر صفحه اصلی نامعتبر است" + "invalid-home-page-route": "مسیر صفحه اصلی نامعتبر است", + "invalid-session": "عدم تطابق جلسه", + "invalid-session-text": "به نظر می‌رسد این جلسه برای ورود دیگر فعال نیست و یا با سرور هماهنگ نیست. لطفا این صفحه را رفرش کنید." } \ No newline at end of file diff --git a/public/language/fa_IR/global.json b/public/language/fa_IR/global.json index 7c7e92772d..386c069b39 100644 --- a/public/language/fa_IR/global.json +++ b/public/language/fa_IR/global.json @@ -96,5 +96,5 @@ "upload": "بارگذاری", "allowed-file-types": "فایل قابل قبول اینها هستند %1", "unsaved-changes": "تغییرات شما ذخیره نشده. شما مطمئن هستید که میخواهید از اینجا دور شوید؟", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "اتصال شما به %1 به نظر می‌رسد از دست رفته. لطفا صبر کنید ما سعی می‌کنیم که دوباره شما را متصل کنیم." } \ No newline at end of file diff --git a/public/language/fa_IR/user.json b/public/language/fa_IR/user.json index 76f9577d10..bb40b5dd73 100644 --- a/public/language/fa_IR/user.json +++ b/public/language/fa_IR/user.json @@ -89,6 +89,10 @@ "topics_per_page": "شمار موضوع ها در هر برگه", "posts_per_page": "شمار پست‌ها در هر برگه", "notification_sounds": "پخش صدا زمانی که یک اطلاعیه دریافت میکنید", + "notifications_and_sounds": "آگاه‌سازی‌ها و صدا‌ها", + "incoming-message-sound": "صدای پیام دریافتی", + "outgoing-message-sound": "صدای پیام ارسال شده", + "notification-sound": "آگاه‌سازی‌ از طریق صدا", "browsing": "تنظیمات مرور", "open_links_in_new_tab": "پیوندهای به بیرون را در برگ جدید باز کن", "enable_topic_searching": "فعال کردن جستجوی داخل-موضوع", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 536a3854a8..de8e27a50d 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Ei käyttäjiä tässä huoneessa", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 37eb67c338..66ca174258 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Aihetta per sivu", "posts_per_page": "Viestiä per sivu", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Selataan asetuksia", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Salli aiheen sisäiset haut", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index f240a77009..e6e70bad78 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Aucun utilisateur dans cette salle", "cant-kick-self": "Vous ne pouvez pas vous exclure vous-même du groupe", "no-users-selected": "Aucun utilisateur sélectionné", - "invalid-home-page-route": "Route de page d'accueil invalide" + "invalid-home-page-route": "Route de page d'accueil invalide", + "invalid-session": "Session Interrompue", + "invalid-session-text": "Il semble que votre session ne soit plus active, ou que le serveur ne la reconnaisse plus. Merci de rafraichir cette page." } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 418bc35dcc..076e154971 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Sujets par page", "posts_per_page": "Messages par page", "notification_sounds": "Émettre un son lors de la réception de notifications", + "notifications_and_sounds": "Notifications & Sons", + "incoming-message-sound": "Son pour les messages entrants", + "outgoing-message-sound": "Son pour les messages sortants", + "notification-sound": "Son de notification", "browsing": "Paramètres de navigation", "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet", "enable_topic_searching": "Activer la recherche dans les sujets", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index d372ec2b2e..acbab0cc58 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Non hai usuarios nesta sala", "cant-kick-self": "Non te podes expulsar a ti mesmo do grupo", "no-users-selected": "Ningún usuario seleccionado", - "invalid-home-page-route": "Ruta de páxina de inicio inválida" + "invalid-home-page-route": "Ruta de páxina de inicio inválida", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/gl/user.json b/public/language/gl/user.json index 09726a9119..9cdea0f306 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Temas por páxina", "posts_per_page": "Mensaxes por páxina", "notification_sounds": "Reproducir un son cando recibes unha notificación.", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Opcións de busca", "open_links_in_new_tab": "Abrir ligazóns externos nunca nova pestaña", "enable_topic_searching": "Permitir buscar dentro dun tema", diff --git a/public/language/he/category.json b/public/language/he/category.json index 5a5a8365b3..394ea4f57f 100644 --- a/public/language/he/category.json +++ b/public/language/he/category.json @@ -12,8 +12,8 @@ "ignore": "התעלם", "watching": "Watching", "ignoring": "Ignoring", - "watching.description": "Show topics in unread", - "ignoring.description": "Do not show topics in unread", + "watching.description": "צפה בנושאים שלא נקראו", + "ignoring.description": "אל תציג נושאים שאינם נקראו", "watch.message": "אתה עכשיו עוקב אחרי עדכונים מקטגוריה זו", "ignore.message": "אתה עכשיו מתעלם מעדכונים מקטגוריה זו", "watched-categories": "קטגוריות נעקבות" diff --git a/public/language/he/error.json b/public/language/he/error.json index 52ee6b7549..c2a970ee36 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -14,13 +14,13 @@ "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-chat": "אין באפשרותך לשוחח עד שהדוא\"ל שלך יאושר, אנא לחץ כאן כדי לאשר את הדוא\"ל שלך.", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email.", + "email-not-confirmed-email-sent": "האימייל עדין לא אושר. אנא בדוק בתיבת הדואר בנוגע לאישור האימייל שנשלח לך על ידנו.", "no-email-to-confirm": "פורום זה דורש אישור בדוא\"ל, אנא לחץ כאן כדי להכניס לדואר אלקטרוני", "email-confirm-failed": "לא הצלחנו לאשר את הדוא\"ל שלך, תנסה שוב אחר כך", "confirm-email-already-sent": "מייל האישור כבר נשלח, אנא המתן %1 דקות כדי לשלוח מייל נוסף.", @@ -30,8 +30,8 @@ "password-too-long": "הסיסמה ארוכה מדי", "user-banned": "המשתמש מושעה", "user-too-new": "אנא המתן %1 שניות לפני פרסום ההודעה", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", - "ban-expiry-missing": "Please provide an end date for this ban", + "blacklisted-ip": "מצטערים, אך הורחקת מקהילה זו. אם הנך סבור שמדובר בטעות, אנא צור קשר עם מנהלי הקהילה.", + "ban-expiry-missing": "אנא ספק תאריך סיום להרחקה זו.", "no-category": "קטגוריה אינה קיימת", "no-topic": "נושא אינו קיים", "no-post": "פוסט אינו קיים", @@ -42,8 +42,8 @@ "category-disabled": "קטגוריה לא פעילה", "topic-locked": "נושא נעול", "post-edit-duration-expired": "אתה רשאי לערוך פוסטים רק ל-%1 שניות לאחר הפרסום", - "post-edit-duration-expired-minutes": "You are only allowed to edit posts for %1 minute(s) after posting", - "post-edit-duration-expired-minutes-seconds": "You are only allowed to edit posts for %1 minute(s) %2 second(s) after posting", + "post-edit-duration-expired-minutes": "הנך רשאי לערוך תגובה עד %1 דקות מרגע פרסום התגובה.", + "post-edit-duration-expired-minutes-seconds": "הנך רשאי לערוך תגובה עד %1 דקות %2 ושניות מרגע פרסום התגובה.", "post-edit-duration-expired-hours": "You are only allowed to edit posts for %1 hour(s) after posting", "post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting", "post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting", @@ -55,7 +55,7 @@ "post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting", "post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting", "post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting", - "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", + "cant-delete-topic-has-reply": "אינך יכול למחוק נושא אחרי שכבר הגיבו בו.", "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", "content-too-short": "אנא הכנס פוסט ארוך יותר. פוסטים חייבים להכיל לפחות %1 תווים.", "content-too-long": "אנא הכנס פוסט קצר יותר. פוסטים חייבים להיות קצרים יותר מ-%1 תווים.", @@ -74,12 +74,12 @@ "already-unfavourited": "כבר הסרת את הסימון מפוסט זה", "cant-ban-other-admins": "אינך יכול לחסום מנהלים אחרים!", "cant-remove-last-admin": "אתה המנהל היחיד. הוסף משתמש אחר לניהול לפני שאתה מוריד את עצמך מניהול", - "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", + "cant-delete-admin": "משתמש זה מוגדר כמנהל. על מנת למחוק את המשתמש, עליך להסיר קודם את גישותיו.", "invalid-image-type": "פורמט תמונה לא תקין. הפורמטים המורשים הם: %1", "invalid-image-extension": "פורמט תמונה לא תקין", "invalid-file-type": "פורמט הקובץ לא תקין. הפורמטים המורשים הם: %1", "group-name-too-short": "שם הקבוצה קצר מדי", - "group-name-too-long": "Group name too long", + "group-name-too-long": "שם הקבוצה ארוך מידי", "group-already-exists": "הקבוצה כבר קיימת", "group-name-change-not-allowed": "לא ניתן לשנות את שם הקבוצה", "group-already-member": "כבר חבר בקבוצה זו", @@ -106,7 +106,7 @@ "cant-edit-chat-message": "אתה לא רשאי לערוך הודעה זו", "cant-remove-last-user": "אינך יכול למחוק את המשתמש האחרון", "cant-delete-chat-message": "אתה לא רשאי למחוק הודעה זו", - "already-voting-for-this-post": "You have already voted for this post.", + "already-voting-for-this-post": "הצבעת כבר בנושא זה", "reputation-system-disabled": "מערכת המוניטין לא פעילה.", "downvoting-disabled": "היכולת להצביע נגד לא פעילה", "not-enough-reputation-to-downvote": "אין לך מספיק מוניטין כדי להוריד את הדירוג של פוסט זה", @@ -121,7 +121,9 @@ "no-session-found": "לא נמצאו סשני התחברות!", "not-in-room": "משתמש זה לא בצ'אט", "no-users-in-room": "אין משתמש בחדר הזה", - "cant-kick-self": "You can't kick yourself from the group", - "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "cant-kick-self": "אינך יכול להסיר את עצמך מהקבוצה", + "no-users-selected": "לא נבחרו משתמשים", + "invalid-home-page-route": "כתובת דף הבית הינה שגויה", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/he/global.json b/public/language/he/global.json index e6b0d8e31b..8f2c2347b2 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -7,9 +7,9 @@ "403.login": "נסה להתחבר.", "404.title": "לא נמצא", "404.message": "נראה שהגעת לעמוד שלא קיים. חזור לעמוד הבית", - "500.title": "Internal Error.", + "500.title": "שגיאה פנימית.", "500.message": "אופס! נראה שמשהו השתבש!", - "400.title": "Bad Request.", + "400.title": "בקשה שגויה", "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", "register": "הרשמה", "login": "התחברות", @@ -95,6 +95,6 @@ "upload_file": "העלה קובץ", "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." + "unsaved-changes": "יש לך שינויים שאינם נשמרו. האם הנך בטוח שברצונך להמשיך?", + "reconnecting-message": "נראה שההתחברות שלך אל %1 אבדה, אנא המתן בזמן שהמערכת מנסה לחבר אותך מחדש" } \ No newline at end of file diff --git a/public/language/he/groups.json b/public/language/he/groups.json index fe0bb93380..94f76a2ffd 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -41,7 +41,7 @@ "details.hidden": "מוסתר", "details.hidden_help": "אם מאופשר, הקבוצה לא תופיע ברשימת הקבוצות, ומשתמשים יצטרכו להיות מוזמנים ידנית", "details.delete_group": "מחק קבוצה", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "קבוצות פרטיות מבוטלות על ידי המערכת. אופציה זו אינה עושה דבר.", "event.updated": "פרטי הקבוצה עודכנו", "event.deleted": "קבוצת \"%1\" נמחקה", "membership.accept-invitation": "קבל הזמנה", diff --git a/public/language/he/user.json b/public/language/he/user.json index 7311867da8..7287d5c1f0 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -89,6 +89,10 @@ "topics_per_page": "כמות נושאים בעמוד", "posts_per_page": "כמות פוסטים בעמוד", "notification_sounds": "נגן סאונד כשמתקבלת התראה", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "הגדרות צפייה", "open_links_in_new_tab": "פתח קישורים חיצוניים בכרטיסייה חדשה", "enable_topic_searching": "הפעל חיפוש בתוך נושא", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 1718b8f115..dc2bc327f7 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 86e8a6a79f..19bd8c3154 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Téma oldalanként", "posts_per_page": "Hozzászólás oldalanként", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Témán belüli keresés bekapcsolása", diff --git a/public/language/id/error.json b/public/language/id/error.json index cac1d43532..11d0c9a830 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/id/user.json b/public/language/id/user.json index 4a93ced3ed..715648a4bd 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Topik per Halaman", "posts_per_page": "Posting per Halaman", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Pengaturan Penelusuran", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Gunakan Pencarian Di dalam Topik", diff --git a/public/language/it/error.json b/public/language/it/error.json index 4412fbc484..2971a8e20c 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Nessun utente in questa stanza", "cant-kick-self": "Non puoi espellerti dal gruppo", "no-users-selected": "Nessun utente selezionato", - "invalid-home-page-route": "Percorso della pagina iniziale non valido" + "invalid-home-page-route": "Percorso della pagina iniziale non valido", + "invalid-session": "Discrepanza della sessione", + "invalid-session-text": "Sembra che la tua sessione non sia più attiva, oppure non corrisponde con il server. Per favore ricarica la pagina." } \ No newline at end of file diff --git a/public/language/it/global.json b/public/language/it/global.json index f35e9b5791..8aa3659f7d 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -9,7 +9,7 @@ "404.message": "Sembra tu sia arrivato ad una pagina che non esiste. Torna alla home page.", "500.title": "Errore interno.", "500.message": "Oops! Qualcosa non funziona come si deve!", - "400.title": "Bad Request.", + "400.title": "Richiesta non valida.", "400.message": "Sembra che questo link sia stato mal formulato, per favore ricontrolla e riprova. Altrimenti ritorna alla home page.", "register": "Registrazione", "login": "Login", @@ -52,10 +52,10 @@ "topics": "Discussioni", "posts": "Post", "best": "Migliore", - "upvoters": "Upvoters", + "upvoters": "Hanno votato positivamente", "upvoted": "Apprezzati", - "downvoters": "Downvoters", - "downvoted": "Downvoted", + "downvoters": "Hanno negato negativamente", + "downvoted": "Votato negativamente", "views": "Visualizzazioni", "reputation": "Reputazione", "read_more": "per saperne di più", @@ -96,5 +96,5 @@ "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": "Looks like your connection to %1 was lost, please wait while we try to reconnect." + "reconnecting-message": "Sembra che la tua connessione a %1 sia stata persa, per favore attenti mentre proviamo a riconnetterti." } \ No newline at end of file diff --git a/public/language/it/modules.json b/public/language/it/modules.json index 2eaf84aba9..5688dd9976 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -32,7 +32,7 @@ "composer.formatting.bold": "Grassetto", "composer.formatting.italic": "Corsivo", "composer.formatting.list": "Lista", - "composer.formatting.strikethrough": "Strikethrough", + "composer.formatting.strikethrough": "Barrato", "composer.formatting.link": "Collegamento", "composer.formatting.picture": "Immagine", "composer.upload-picture": "Carica immagine", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index b0920945fc..f42d53aceb 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -39,7 +39,7 @@ "account/settings": "Impostazioni Utente", "account/watched": "Discussioni osservate da %1", "account/upvoted": "Post apprezzati da %1", - "account/downvoted": "Posts downvoted by %1", + "account/downvoted": "Post votati negativamente da %1", "account/best": "I migliori post di %1", "confirm": "Email Confermata", "maintenance.text": "%1 è attualmente in manutenzione. Per favore ritorna più tardi.", diff --git a/public/language/it/user.json b/public/language/it/user.json index 303a2cbe6b..d1f1edafa7 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -81,7 +81,7 @@ "has_no_topics": "Questo utente non ha ancora avviato discussioni.", "has_no_watched_topics": "Questo utente non sta osservando discussioni.", "has_no_upvoted_posts": "Questo utente non ha ancora apprezzato nessun post.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", + "has_no_downvoted_posts": "Questo utente non ha ancora votato negativamente alcun post", "has_no_voted_posts": "Questo utente non ha post votati", "email_hidden": "Email Nascosta", "hidden": "nascosta", @@ -89,6 +89,10 @@ "topics_per_page": "Discussioni per Pagina", "posts_per_page": "Post per Pagina", "notification_sounds": "Riproduci un suono quando si riceve una notifica", + "notifications_and_sounds": "Notifiche e Suoni", + "incoming-message-sound": "Suono messaggio in entrata", + "outgoing-message-sound": "Suono messaggio in uscita", + "notification-sound": "Suono di notifica", "browsing": "Impostazioni di Navigazione", "open_links_in_new_tab": "Apri i link web in una nuova pagina", "enable_topic_searching": "Abilita la ricerca negli argomenti", diff --git a/public/language/it/users.json b/public/language/it/users.json index c88f786172..3ca0056679 100644 --- a/public/language/it/users.json +++ b/public/language/it/users.json @@ -2,7 +2,7 @@ "latest_users": "Ultimi Utenti", "top_posters": "Maggiori contributori", "most_reputation": "Reputazione più alta", - "most_flags": "Most Flags", + "most_flags": "Più segnalati", "search": "Cerca", "enter_username": "Inserisci il nome utente da cercare", "load_more": "Carica altri", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 848d308257..cbe33de039 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 20ad10041f..16cd6a8811 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -89,6 +89,10 @@ "topics_per_page": "ページ毎のスレッド数", "posts_per_page": "ページ毎のポスト数", "notification_sounds": "通知の時に音を鳴らします", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "ブラウジングの設定", "open_links_in_new_tab": "外リンクを新しいタブに開きます", "enable_topic_searching": "インートピックの検索を有効にします", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index e4e3686ae8..383a9405a5 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "사용자가 없습니다.", "cant-kick-self": "스스로 이 그룹을 탈퇴할 수 없습니다.", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index fa6b28d31b..bd8404161d 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -89,6 +89,10 @@ "topics_per_page": "페이지 당 주제 수", "posts_per_page": "페이지 당 게시물 수", "notification_sounds": "알림 수신시 소리로 알려주기", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "페이지 열기", "open_links_in_new_tab": "외부 링크를 새로운 탭을 사용하여 열람", "enable_topic_searching": "주제 내 검색 허용", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 33a845a2f3..2d5b6ecf02 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 3fbd891809..31f55b8307 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Temų puslapyje", "posts_per_page": "Pranešimų puslapyje", "notification_sounds": "Paleisti garsą kai jūs gaunate pranešimą", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Naršymo nustatymai", "open_links_in_new_tab": "Atidaryti išeinančias nuorodas naujam skirtuke", "enable_topic_searching": "Įjungti Temų Ieškojimą ", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 64e13cdc36..826b75b19a 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Tiada pengguna dalam bilik ini", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/ms/user.json b/public/language/ms/user.json index a1940e57cf..4e89cfb478 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Topik setiap muka", "posts_per_page": "Kiriman setiap muka", "notification_sounds": "Mainkan bunyi apabila anda mendapat pemberitahuan", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Melihat-lihat Tetapan", "open_links_in_new_tab": "Buka pautan luar di tab yang baru", "enable_topic_searching": "Aktifkan Pencarian Dalam-Topik", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index b9756632e9..b9aa7192cb 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 238f6da595..056afeb82f 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Tråd per side", "posts_per_page": "Innlegg per side", "notification_sounds": "Spill en lyd når du mottar et varsel", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Surfeinnstillinger", "open_links_in_new_tab": "Åpne utgående lenker i en ny fane", "enable_topic_searching": "Aktiver søk-i-emne", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 541de4e1ea..c0423cb7d4 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Er zijn geen gebruikers in deze chat", "cant-kick-self": "Je kunt jezelf niet uit een groep schoppen", "no-users-selected": "Geen gebruiker(s) geselecteerd", - "invalid-home-page-route": "Onbekende homepage route" + "invalid-home-page-route": "Onbekende homepage route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 129383dd5b..7d56f88b4a 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Onderwerpen per pagina", "posts_per_page": "Berichten per pagina", "notification_sounds": "Speel een geluid af wanneer ik een notificatie ontvang", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Instellingen voor bladeren", "open_links_in_new_tab": "Open uitgaande links naar een externe site in een nieuw tabblad", "enable_topic_searching": "Inschakelen mogelijkheid op onderwerp te kunnen zoeken", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index c6618a2f59..82d6fb5d78 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -55,8 +55,8 @@ "post-delete-duration-expired-hours-minutes": "Możesz kasować posty przez %1 godzin(-y) i %2 minut(-y) po napisaniu", "post-delete-duration-expired-days": "Możesz kasować posty przez %1 dni po napisaniu", "post-delete-duration-expired-days-hours": "Możesz kasować posty przez %1 dni i %2 godzin(-y) po napisaniu", - "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", - "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", + "cant-delete-topic-has-reply": "Nie możesz usunąć tematu zawierającego odpowiedź", + "cant-delete-topic-has-replies": "Nie możesz usunąć tematu zawierającego %1 odpowiedzi", "content-too-short": "Prosimy wpisać dłuższy post. Posty powinny zawierać co najmniej %1 znaków.", "content-too-long": "Prosimy wpisać krótszy post. Posty nie mogą zawierać więcej niż %1 znaków.", "title-too-short": "Prosimy podać dłuższy tytuł. Tytuły powinny zawierać co najmniej %1 znaków.", @@ -123,5 +123,7 @@ "no-users-in-room": "Brak użytkowników w pokoju", "cant-kick-self": "Nie możesz wyrzucić samego siebie z grupy", "no-users-selected": "Nie wybrano żadnych użytkowników", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Niepoprawny odnośnik strony domowej", + "invalid-session": "Niewłaściwa sesja", + "invalid-session-text": "Wygląda na to, że twoja sesja jest nieaktywna, lub nie zgadza się z serwerem. Proszę odświeżyć tę stronę." } \ No newline at end of file diff --git a/public/language/pl/global.json b/public/language/pl/global.json index 0a88d05532..b3e8819172 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -7,10 +7,10 @@ "403.login": "Może powinieneś się zalogować?", "404.title": "Nie znaleziono", "404.message": "Wygląda na to, że trafiłeś na stronę, która nie istnieje. Wróć do strony głównej.", - "500.title": "Internal Error.", + "500.title": "Wewnętrzny błąd.", "500.message": "Ups! Coś poszło nie tak.", - "400.title": "Bad Request.", - "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", + "400.title": "Złe zapytanie.", + "400.message": "Wygląda na to, że ten link jest niepoprawny, proszę go sprawdzić i spróbować ponownie. W przeciwnym wypadku wróć do strona domowa.", "register": "Zarejestruj się", "login": "Zaloguj się", "please_log_in": "Proszę się zalogować", @@ -95,6 +95,6 @@ "upload_file": "Załaduj plik", "upload": "Załaduj", "allowed-file-types": "Dozwolone typy plików %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." + "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ć." } \ No newline at end of file diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index 5461f81b39..c405a728ef 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -37,7 +37,7 @@ "composer.formatting.picture": "Obraz", "composer.upload-picture": "Wyślij obraz", "composer.upload-file": "Wyślij plik", - "composer.zen_mode": "Zen Mode", + "composer.zen_mode": "Tryb Zen", "bootbox.ok": "OK", "bootbox.cancel": "Anuluj", "bootbox.confirm": "Potwierdź", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 5bc57dafba..0a359430c6 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Tematów na Stronę", "posts_per_page": "Postów na stronę", "notification_sounds": "Odtwarzaj dźwięk, gdy otrzymujesz powiadomienie", + "notifications_and_sounds": "Powiadomienia i dźwięki", + "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", "browsing": "Ustawienia szukania", "open_links_in_new_tab": "Otwieraj linki wychodzące w nowej karcie", "enable_topic_searching": "Odblokuj szukanie w temacie", @@ -109,10 +113,10 @@ "sso.title": "Usługi Pojedynczego Logowania", "sso.associated": "Powiązane z", "sso.not-associated": "Kliknij tutaj, aby powiązać z", - "info.latest-flags": "Latest Flags", - "info.no-flags": "No Flagged Posts Found", - "info.ban-history": "Recent Ban History", - "info.no-ban-history": "This user has never been banned", - "info.banned-until": "Banned until %1", - "info.banned-permanently": "Banned permanently" + "info.latest-flags": "Ostatnie flagi", + "info.no-flags": "Brak oflagowanych postów", + "info.ban-history": "Historia ostatnich banów", + "info.no-ban-history": "Ten użytkownik nigdy nie był zbanowany", + "info.banned-until": "Zbanowany do %1", + "info.banned-permanently": "Zbanowany permanentnie" } \ No newline at end of file diff --git a/public/language/pl/users.json b/public/language/pl/users.json index 59c58c8df7..fbe4957dbe 100644 --- a/public/language/pl/users.json +++ b/public/language/pl/users.json @@ -2,7 +2,7 @@ "latest_users": "Nowi użytkownicy", "top_posters": "Najwięcej postów", "most_reputation": "Największa reputacja", - "most_flags": "Most Flags", + "most_flags": "Najwięcej flag", "search": "Szukaj", "enter_username": "Wpisz wyszukiwaną nazwę użytkownika", "load_more": "Wczytaj Więcej", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index 780e0b5ec0..adec9bbf06 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Nenhum usuário nesta sala", "cant-kick-self": "Você não pode kickar a si mesmo do grupo", "no-users-selected": "Nenhuma escolha de usuário(s) foi feita", - "invalid-home-page-route": "Rota de página inicial inválida" + "invalid-home-page-route": "Rota de página inicial inválida", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index b6ee0c97c4..1deb677bd6 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Tópicos por Página", "posts_per_page": "Posts por Página", "notification_sounds": "Tocar um som quando você receber uma notificação.", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "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", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index c0dc6a64a1..ee38cdc1c6 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/ro/user.json b/public/language/ro/user.json index ed81fcea63..31cd396f7f 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Subiecte pe pagină", "posts_per_page": "Mesaje pe pagină", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Setări navigare", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index ba5f39bd70..5c3b5f35c4 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "В этой комнате нет пользователей", "cant-kick-self": "Вы не можете удалить себя сами из группы.", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 0912a92c32..8a50361144 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -117,6 +117,6 @@ "stale.reply_anyway": "Всё равно ответить в этой теме", "link_back": "Ответ: [%1](%2)", "spam": "Спам", - "offensive": "Наступление", + "offensive": "Оскорбление", "custom-flag-reason": "Введите другую причину" } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 98d1bb1b8f..33c31e3b43 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Тем на Странице", "posts_per_page": "Постов на Странице", "notification_sounds": "Воспроизводить звук во время получения уведомления", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Настройки просмотра", "open_links_in_new_tab": "Открывать внешние ссылки в новых вкладках", "enable_topic_searching": "Активировать поиск внутри тем", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 3a24f2dd50..d2b97f8f0c 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Nta muntu uri muri iki gikari", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/rw/user.json b/public/language/rw/user.json index 415be0e49c..a598704593 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Ibiganiro kuri Buri Paji", "posts_per_page": "Ibyashyizweho kuri Buri Paji", "notification_sounds": "Hajye humvikana ijwi rikumenyesha ko haje itangazo rishya", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Gutunganya Uburyo Usoma", "open_links_in_new_tab": "Fungurira imirongo ijya hanze mu idirishya rishya", "enable_topic_searching": "Emerera Ugushakira mu Kiganiro", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 2ec9878ee8..1d2065d115 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 580e37ad0d..acdd61fe69 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Arresonadas pro Pàgina", "posts_per_page": "Arresonos pro Pàgina", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 9788c91cbe..4e9fb7cfb1 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 0395219cb8..017be26335 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Témy na stranu", "posts_per_page": "Príspevkov na stranu", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Hľadaj v nadstaveniach", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index d9a7b503af..16561b4c63 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 330d37b7ee..9a778e442c 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -89,6 +89,10 @@ "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", "browsing": "Preglej nastavitve", "open_links_in_new_tab": "Zunanje povezave odpri v novem zavihku", "enable_topic_searching": "Omogoči iskanje znotraj teme", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index d32aa4364b..f2e1f37f8a 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 19dae33163..1016a9feb4 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Topics per Page", "posts_per_page": "Posts per Page", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index aecff9870f..b283278f61 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Inga användare i det här rummet", "cant-kick-self": "Du kan inte sparka ut dig själv från gruppen", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index b8d8a1a2bb..ba150f3294 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Ämnen per sida", "posts_per_page": "Inlägg per sida", "notification_sounds": "Spela ett ljud när du får en notis", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Inställning för bläddring", "open_links_in_new_tab": "Öppna utgående länkar i ny flik", "enable_topic_searching": "Aktivera sökning inom ämne", diff --git a/public/language/th/error.json b/public/language/th/error.json index 45d5070642..08a09e83e5 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "No users in this room", "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "invalid-home-page-route": "Invalid home page route", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index 1819833562..a59c28d7b5 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -89,6 +89,10 @@ "topics_per_page": "จำนวนกระทู้ต่อหน้า", "posts_per_page": "จำนวนโพสต์ต่อหน้า", "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "เปิดดูการตั้งค่า", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "เปิดใช้การค้นหาแบบ In-Topic", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 5e8619faf2..b3f6216519 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Bu odada kullanıcı yok", "cant-kick-self": "Kendinizi gruptan atamazsınız.", "no-users-selected": "Seçili kullanıcı(s) bulunamadı", - "invalid-home-page-route": "Geçersiz anasayfa yolu" + "invalid-home-page-route": "Geçersiz anasayfa yolu", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 9f9e5a1377..59c01ab819 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -7,7 +7,7 @@ "403.login": "Belki de tekrar giriş yapmayı denersiniz?", "404.title": "Bulunamadı", "404.message": "Erişim izniniz olmayan bir sayfaya denk gelmiş gibisiniz. Anasayfa'ya geri dönün.", - "500.title": "Internal Error.", + "500.title": "Dahili hata.", "500.message": "Ups! Bir şeyler ters gitti sanki!", "400.title": "Geçersiz istek.", "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index ed9f9ed759..22d9fdaa00 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Sayfa başına Konular", "posts_per_page": "Sayfa başına İletiler", "notification_sounds": "Uyarı alındığında ses çal", + "notifications_and_sounds": "Bildiriler & Sesler", + "incoming-message-sound": "Gelen mesaj sesi", + "outgoing-message-sound": "Giden ileti sesi", + "notification-sound": "Bildiri sesi", "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", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 54f4e7d5c2..542b9d00f3 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "Không có ai trong phòng này", "cant-kick-self": "Bạn không thể kick chính bạn ra khỏi nhóm", "no-users-selected": "Chưa có người dùng(s) nào", - "invalid-home-page-route": "Đường dẫn trang chủ không hợp lệ" + "invalid-home-page-route": "Đường dẫn trang chủ không hợp lệ", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 6af0f62719..3c746b87ca 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -89,6 +89,10 @@ "topics_per_page": "Số chủ đề trong một trang", "posts_per_page": "Số bài viết trong một trang", "notification_sounds": "Phát âm thanh khi bạn nhận được thông báo mới", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "Đang xem cài đặt", "open_links_in_new_tab": "Mở link trong tab mới.", "enable_topic_searching": "Bật In-topic Searching", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index e3d3aa55d4..4d5ee16393 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -123,5 +123,7 @@ "no-users-in-room": "这个聊天室中没有用户", "cant-kick-self": "你不能把自己踢出群组", "no-users-selected": "尚未选择用户", - "invalid-home-page-route": "无效的首页路径" + "invalid-home-page-route": "无效的首页路径", + "invalid-session": "Session Mismatch", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index d00aaae266..766b80c570 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -89,6 +89,10 @@ "topics_per_page": "每页主题数", "posts_per_page": "每页帖子数", "notification_sounds": "收到通知时播放提示音", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", "browsing": "浏览设置", "open_links_in_new_tab": "在新标签打开外部链接", "enable_topic_searching": "启用主题内搜索", diff --git a/public/language/zh_TW/category.json b/public/language/zh_TW/category.json index 5e83953d6c..eb4526fd67 100644 --- a/public/language/zh_TW/category.json +++ b/public/language/zh_TW/category.json @@ -10,10 +10,10 @@ "share_this_category": "分享這類別", "watch": "關注", "ignore": "忽略", - "watching": "Watching", - "ignoring": "Ignoring", - "watching.description": "Show topics in unread", - "ignoring.description": "Do not show topics in unread", + "watching": "關注", + "ignoring": "忽略", + "watching.description": "顯示未讀的主題", + "ignoring.description": "不要顯示未讀的主題", "watch.message": "你正關注此類別的更新", "ignore.message": "你已忽略此類別的更新", "watched-categories": "關注的類別" diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 3beacd4374..954492cdb6 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -31,7 +31,7 @@ "user-banned": "該使用者已被停用", "user-too-new": "抱歉,發表你第一篇文章須要等待 %1 秒", "blacklisted-ip": "抱歉,你的IP位置已經被這個社群禁用了。如果你覺得這是一個失誤,請連絡管理員。", - "ban-expiry-missing": "Please provide an end date for this ban", + "ban-expiry-missing": "請提供這個禁用的到期時間", "no-category": "類別並不存在", "no-topic": "主題並不存在", "no-post": "文章並不存在", @@ -42,7 +42,7 @@ "category-disabled": "該類別已被關閉", "topic-locked": "該主題已被鎖定", "post-edit-duration-expired": "在張貼 %1 秒後,你才能編輯張貼文章", - "post-edit-duration-expired-minutes": "You are only allowed to edit posts for %1 minute(s) after posting", + "post-edit-duration-expired-minutes": "在張貼 %1 秒後,你才能編輯張貼文章", "post-edit-duration-expired-minutes-seconds": "You are only allowed to edit posts for %1 minute(s) %2 second(s) after posting", "post-edit-duration-expired-hours": "You are only allowed to edit posts for %1 hour(s) after posting", "post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting", @@ -55,8 +55,8 @@ "post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting", "post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting", "post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting", - "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", - "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", + "cant-delete-topic-has-reply": "你不能刪除你的主題,在它已經有一筆回覆時", + "cant-delete-topic-has-replies": "你不能刪除你的主題,在它已經有 %1 筆回覆時", "content-too-short": "請輸入一個長一點的張貼內容。張貼內容長度不能少於 %1 字元。", "content-too-long": "請輸入一個短一點的張貼內容。張貼內容長度不能超過 %1 字元。", "title-too-short": "請輸入一個長一點的標題。標題長度不能少於 %1 字元。", @@ -79,7 +79,7 @@ "invalid-image-extension": "無效的圖像擴充元件", "invalid-file-type": "無效的檔案類型。允許的類型:%1", "group-name-too-short": "群組名稱太短了", - "group-name-too-long": "Group name too long", + "group-name-too-long": "群組名稱太長", "group-already-exists": "群組名稱已存在", "group-name-change-not-allowed": "變更群組名稱不被允許", "group-already-member": "已經加入這個群組", @@ -122,6 +122,8 @@ "not-in-room": "使用者沒有在聊天室中", "no-users-in-room": "沒有使用者在聊天室中", "cant-kick-self": "你不能把自己從群組中踢出", - "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route" + "no-users-selected": "沒有選定使用者", + "invalid-home-page-route": "無效的首頁路由", + "invalid-session": "會話階段錯誤", + "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." } \ No newline at end of file diff --git a/public/language/zh_TW/global.json b/public/language/zh_TW/global.json index 02e6ba741d..54a8ce2248 100644 --- a/public/language/zh_TW/global.json +++ b/public/language/zh_TW/global.json @@ -7,10 +7,10 @@ "403.login": "或許是你應該 試著登入?", "404.title": "無法找到該頁", "404.message": "你所查找的頁面並不存在。返回首頁。", - "500.title": "Internal Error.", + "500.title": "內部錯誤", "500.message": "糟糕! 看來是不知道哪裡出錯了!", - "400.title": "Bad Request.", - "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", + "400.title": "錯誤要求", + "400.message": "看起來這個連結是有問題的,請點擊兩次然後重新嘗試。要不然,回到首頁。", "register": "註冊", "login": "登入", "please_log_in": "請先登入", @@ -52,9 +52,9 @@ "topics": "主題", "posts": "張貼", "best": "最棒", - "upvoters": "Upvoters", + "upvoters": "正向投票", "upvoted": "正向投票", - "downvoters": "Downvoters", + "downvoters": "負向投票", "downvoted": "負向投票", "views": "瀏覽", "reputation": "聲望", @@ -95,6 +95,6 @@ "upload_file": "上傳檔案", "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." + "unsaved-changes": "你還沒有儲存更動。你確定想要離開這個頁面?", + "reconnecting-message": "看起來你的連線到 %1 已經遺失,請稍等一下我們嘗試重新連線。" } \ No newline at end of file diff --git a/public/language/zh_TW/login.json b/public/language/zh_TW/login.json index 91526421a3..bd3cf262d9 100644 --- a/public/language/zh_TW/login.json +++ b/public/language/zh_TW/login.json @@ -8,5 +8,5 @@ "failed_login_attempt": "登入失敗", "login_successful": "你已成功登入!", "dont_have_account": "還沒有帳號?", - "logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity" + "logged-out-due-to-inactivity": "你已登出管理控制台,因為一段時間沒有任何動作。" } \ No newline at end of file diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index 7c73caae1f..a2b1e523ac 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -12,7 +12,7 @@ "users/sort-posts": "最多張貼的使用者", "users/sort-reputation": "最多聲譽的使用者", "users/banned": "已封鎖用戶", - "users/most-flags": "Most flagged users", + "users/most-flags": "最多標註的使用者", "users/search": "用戶搜尋", "notifications": "新訊息通知", "tags": "標籤", @@ -29,7 +29,7 @@ "account/edit/password": "編輯 \"%1\" 的密碼", "account/edit/username": "編輯\"%1\"的帳號", "account/edit/email": "編輯\"%1\"的電子郵件", - "account/info": "Account Info", + "account/info": "帳戶資訊", "account/following": "使用者 %1 跟隨", "account/followers": "跟隨 %1 的使用者", "account/posts": "由 %1 發表的張貼", diff --git a/public/language/zh_TW/register.json b/public/language/zh_TW/register.json index 9a85faff98..8ab8daca33 100644 --- a/public/language/zh_TW/register.json +++ b/public/language/zh_TW/register.json @@ -1,6 +1,6 @@ { "register": "註冊", - "cancel_registration": "Cancel Registration", + "cancel_registration": "取消註冊", "help.email": "默認情況下,你的郵箱不會公開。", "help.username_restrictions": "獨立的帳號由 %1 到 %2 個字元組成。其他人可以通過 @帳號 提及你。", "help.minimum_password_length": "密碼必須至少包含 %1 個字元。", @@ -16,8 +16,8 @@ "alternative_registration": "其他註冊方式", "terms_of_use": "使用條款", "agree_to_terms_of_use": "同意遵守使用條款", - "terms_of_use_error": "You must agree to the Terms of Use", + "terms_of_use_error": "你需要同意使用條款", "registration-added-to-queue": "你的註冊已經被加入到審核序列中。你將會在管理者批準後收到一封電子郵件。", - "interstitial.intro": "We require some additional information before we can create your account.", - "interstitial.errors-found": "We could not complete your registration:" + "interstitial.intro": "我們要求一些額外的資訊,在我們建立你的帳戶之前。", + "interstitial.errors-found": "我們無法完成你的註冊" } \ No newline at end of file diff --git a/public/language/zh_TW/topic.json b/public/language/zh_TW/topic.json index 30d46b9419..de06ca59c4 100644 --- a/public/language/zh_TW/topic.json +++ b/public/language/zh_TW/topic.json @@ -26,14 +26,14 @@ "tools": "工具", "flag": "檢舉", "locked": "已鎖定", - "pinned": "Pinned", - "moved": "Moved", + "pinned": "釘住", + "moved": "移動", "bookmark_instructions": "點擊這裡返回到這個討論串的最後一篇張貼文", "flag_title": "檢舉這篇文章, 交給仲裁者來審閱.", "flag_success": "這文章已經被檢舉要求仲裁.", "deleted_message": "此主題已被刪除。只有具有主題管理權限的用戶才能看到它。", "following_topic.message": "有人貼文回覆主題時, 你將會收到新通知.", - "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", + "not_following_topic.message": "你將會看到這個主題在未讀主題列表中出現,但你將不會在其他人張貼到這個主題時接收到通知。", "ignoring_topic.message": "你將不會再未讀主題列表中看到這個主題。當你被提及或你的張貼被正向投票時,你會被通知。", "login_to_subscribe": "請先註冊或登錄, 才可訂閱此主題.", "markAsUnreadForAll.success": "將全部的主題設為未讀.", @@ -86,7 +86,7 @@ "topic_will_be_moved_to": "這個主題將會被移動到類別", "fork_topic_instruction": "點擊要作為主題的文章", "fork_no_pids": "尚未選擇文章!", - "fork_pid_count": "%1 post(s) selected", + "fork_pid_count": "%1 張貼已選定", "fork_success": "成功分叉成新的主題!點擊這裡進入新的主題。", "delete_posts_instruction": "點擊你想要刪除/清除的張貼", "composer.title_placeholder": "輸入標題...", diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index 053ec41d09..4832a248a5 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -6,7 +6,7 @@ "postcount": "文章數量", "email": "電子郵件", "confirm_email": "確認電子郵件", - "account_info": "Account Info", + "account_info": "帳戶資訊", "ban_account": "禁用帳號", "ban_account_confirm": "你確定要禁用這個使用者?", "unban_account": "取消禁用帳號", @@ -89,6 +89,10 @@ "topics_per_page": "每頁的主題數", "posts_per_page": "每頁的文章數", "notification_sounds": "當你接收到通知時撥放音效", + "notifications_and_sounds": "通知&音效", + "incoming-message-sound": "收到訊息音效", + "outgoing-message-sound": "發出訊息音效", + "notification-sound": "通知音效", "browsing": "瀏覽設定", "open_links_in_new_tab": "在新的資料標籤裡打開外部的連結", "enable_topic_searching": "啟用在主題中的搜尋", @@ -96,8 +100,8 @@ "delay_image_loading": "延遲圖片載入", "image_load_delay_help": "如果啟用的話,在主題中的圖片直到它們被捲到到可視範圍時才會載入。", "scroll_to_my_post": "在張貼回覆後,顯示新的張貼", - "follow_topics_you_reply_to": "Watch topics that you reply to", - "follow_topics_you_create": "Watch topics you create", + "follow_topics_you_reply_to": "關注你有回覆的主題", + "follow_topics_you_create": "關注你建立的主題", "grouptitle": "群組標題", "no-group-title": "無此群組標題", "select-skin": "選擇外觀", @@ -109,10 +113,10 @@ "sso.title": "單一簽入SSO服務", "sso.associated": "關連於", "sso.not-associated": "點擊這裡進行關連於", - "info.latest-flags": "Latest Flags", - "info.no-flags": "No Flagged Posts Found", - "info.ban-history": "Recent Ban History", - "info.no-ban-history": "This user has never been banned", - "info.banned-until": "Banned until %1", - "info.banned-permanently": "Banned permanently" + "info.latest-flags": "最近標註", + "info.no-flags": "沒有找到標註的張貼", + "info.ban-history": "最近禁用歷史", + "info.no-ban-history": "這個使用者永遠不會被禁用", + "info.banned-until": "禁用至 %1", + "info.banned-permanently": "永久禁用" } \ No newline at end of file diff --git a/public/language/zh_TW/users.json b/public/language/zh_TW/users.json index 91822886e1..e53abef233 100644 --- a/public/language/zh_TW/users.json +++ b/public/language/zh_TW/users.json @@ -2,7 +2,7 @@ "latest_users": "最近用戶", "top_posters": "發文數最多", "most_reputation": "聲望最高", - "most_flags": "Most Flags", + "most_flags": "最多標註", "search": "搜尋", "enter_username": "輸入想找的使用者帳號", "load_more": "載入更多", diff --git a/public/less/admin/general/navigation.less b/public/less/admin/general/navigation.less index 86fd3cae62..3e10639b89 100644 --- a/public/less/admin/general/navigation.less +++ b/public/less/admin/general/navigation.less @@ -3,6 +3,8 @@ width: 100%; min-height: 50px; border: 1px solid #eee; + overflow: auto; + .active { background-color: #eee; } diff --git a/public/less/generics.less b/public/less/generics.less index d2be83d01e..f94118b299 100644 --- a/public/less/generics.less +++ b/public/less/generics.less @@ -112,13 +112,15 @@ } .ban-modal { - input[type="number"] { - width: 7rem; - text-align: center; - margin-left: 1rem; - } - .form-inline, .form-group { width: 100%; } + + .units { + line-height: 5rem; + } +} + +.admin .ban-modal .units { + line-height: 1.846; } \ No newline at end of file diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index eccb94f527..3e12074e3a 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -249,6 +249,8 @@ define('admin/extend/plugins', function() { $('#installed ul li').each(function() { if ($(this).hasClass('active')) { $('#active ul').append($(this).clone(true)); + } else { + $('#deactive ul').append($(this).clone(true)); } }); } diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 4ac3fdeaf0..91e05beb04 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -1,10 +1,10 @@ "use strict"; /* global define, app, socket */ -define('admin/extend/widgets', function() { +define('admin/extend/widgets', ['jqueryui'], function(jqueryui) { var Widgets = {}; - Widgets.init = function() { + Widgets.init = function() { $('#widgets .nav-pills a').on('click', function(ev) { var $this = $(this); $('#widgets .nav-pills li').removeClass('active'); @@ -21,7 +21,7 @@ define('admin/extend/widgets', function() { $('.available-widgets [data-widget]').addClass('hide'); $('.available-widgets [data-widget="' + $(this).val() + '"]').removeClass('hide'); }); - + $('#widget-selector').trigger('change'); loadWidgetData(); @@ -32,7 +32,7 @@ define('admin/extend/widgets', function() { $('#widgets .available-widgets .widget-panel').draggable({ helper: function(e) { - return $(e.target).parents('.widget-panel').clone().addClass('block').width($(e.target.parentNode).width()); + return $(e.target).parents('.widget-panel').clone(); }, distance: 10, connectToSortable: ".widget-area" @@ -156,7 +156,7 @@ define('admin/extend/widgets', function() { function appendToggle(el) { if (!el.hasClass('block')) { - el.addClass('block') + el.addClass('block').css('width', '').css('height', '') .droppable({ accept: '[data-container-html]', drop: function(event, ui) { diff --git a/public/src/admin/general/navigation.js b/public/src/admin/general/navigation.js index 9ebdce555a..1837fc590f 100644 --- a/public/src/admin/general/navigation.js +++ b/public/src/admin/general/navigation.js @@ -1,7 +1,7 @@ "use strict"; /* global define, app, ajaxify, socket, templates */ -define('admin/general/navigation', ['translator', 'iconSelect'], function(translator, iconSelect) { +define('admin/general/navigation', ['translator', 'iconSelect', 'jqueryui'], function(translator, iconSelect, jqueryui) { var navigation = {}, available; @@ -21,7 +21,7 @@ define('admin/general/navigation', ['translator', 'iconSelect'], function(transl stop: drop }); }); - + $('#active-navigation').sortable().droppable({ accept: $('#available li .drag-item') }); diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index d570941940..45abb0e254 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -60,7 +60,7 @@ define('admin/manage/users', ['admin/modules/selectable', 'translator'], functio bootbox.confirm('Do you really want to ban ' + (uids.length > 1 ? 'these users' : 'this user') + ' permanently?', function(confirm) { if (confirm) { - socket.emit('user.banUsers', { uids: uids }, done('User(s) banned!', '.ban', true)); + socket.emit('user.banUsers', { uids: uids, reason: '' }, done('User(s) banned!', '.ban', true)); } }); }); @@ -91,7 +91,7 @@ define('admin/manage/users', ['admin/modules/selectable', 'translator'], functio return data; }, {}); var until = formData.length ? (Date.now() + formData.length * 1000*60*60 * (parseInt(formData.unit, 10) ? 24 : 1)) : 0; - socket.emit('user.banUsers', { uids: uids, until: until }, done('User(s) banned!', '.ban', true)); + socket.emit('user.banUsers', { uids: uids, until: until, reason: formData.reason }, done('User(s) banned!', '.ban', true)); } } } diff --git a/public/src/admin/modules/selectable.js b/public/src/admin/modules/selectable.js index 815fa26d0f..5e4bb5725f 100644 --- a/public/src/admin/modules/selectable.js +++ b/public/src/admin/modules/selectable.js @@ -2,14 +2,12 @@ /*globals define*/ -define('admin/modules/selectable', function() { +define('admin/modules/selectable', ['jqueryui'], function(jqueryui) { var selectable = {}; selectable.enable = function(containerEl, targets) { - app.loadJQueryUI(function() { - $(containerEl).selectable({ - filter: targets - }); + $(containerEl).selectable({ + filter: targets }); }; diff --git a/public/src/admin/settings/email.js b/public/src/admin/settings/email.js index 78a058e19d..e404099800 100644 --- a/public/src/admin/settings/email.js +++ b/public/src/admin/settings/email.js @@ -34,16 +34,23 @@ define('admin/settings/email', ['admin/settings'], function(settings) { emailEditor.setTheme("ace/theme/twilight"); emailEditor.getSession().setMode("ace/mode/html"); - emailEditor.on('change', function(event) { - $('#email-editor-holder').val(emailEditor.getValue()); + emailEditor.on('change', function() { + var emailPath = $('#email-editor-selector').val(); + var original; + ajaxify.data.emails.forEach(function(email) { + if (email.path === emailPath) { + original = email.original; + } + }); + var newEmail = emailEditor.getValue(); + $('#email-editor-holder').val(newEmail !== original ? newEmail : ''); }); $('button[data-action="email.revert"]').off('click').on('click', function() { ajaxify.data.emails.forEach(function(email) { if (email.path === $('#email-editor-selector').val()) { emailEditor.getSession().setValue(email.original); - $('#email-editor-holder') - .val(email.original); + $('#email-editor-holder').val(''); } }); }); @@ -56,7 +63,7 @@ define('admin/settings/email', ['admin/settings'], function(settings) { if (email.path === $('#email-editor-selector').val()) { emailEditor.getSession().setValue(email.text); $('#email-editor-holder') - .val(email.text) + .val(email.text !== email.original ? email.text : '') .attr('data-field', 'email:custom:' + email.path); } }); @@ -72,6 +79,10 @@ define('admin/settings/email', ['admin/settings'], function(settings) { } socket.emit('meta.getServerTime', {}, function(err, now) { + if (err) { + return app.alertError(err.message); + } + now = new Date(now); $('#serverTime').text(now.toString()); diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 87122bf78c..b4ad44e51b 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -304,6 +304,8 @@ $(document).ready(function() { return href === undefined || href === '' || href === 'javascript:;'; } + var contentEl = document.getElementById('content'); + // Enhancing all anchors to ajaxify... $(document.body).on('click', 'a', function (e) { var _self = this; @@ -321,7 +323,7 @@ $(document).ready(function() { } } } else if (window.location.pathname !== '/outgoing') { - if (config.openOutgoingLinksInNewTab) { + if (config.openOutgoingLinksInNewTab && $.contains(contentEl, this)) { window.open(this.href, '_blank'); e.preventDefault(); } else if (config.useOutgoingLinksPage) { @@ -380,7 +382,7 @@ $(document).ready(function() { app.load(); - $('[data-template]').each(function() { + $('[type="text/tpl"][data-template]').each(function() { templates.cache[$(this).attr('data-template')] = $('
').html($(this).html()).text(); $(this).parent().remove(); }); diff --git a/public/src/app.js b/public/src/app.js index e086787215..0e357dc50e 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -33,7 +33,7 @@ app.cacheBuster = null; app.handleSearch(); } - $('#content').on('click', '#new_topic', function(){ + $('body').on('click', '#new_topic', function(){ app.newTopic(); }); diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index 97f062de11..2a6641b152 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -126,7 +126,7 @@ define('forum/account/header', [ }, {}); var until = formData.length ? (Date.now() + formData.length * 1000*60*60 * (parseInt(formData.unit, 10) ? 24 : 1)) : 0; - socket.emit('user.banUsers', { uids: [ajaxify.data.theirid], until: until }, function(err) { + socket.emit('user.banUsers', { uids: [ajaxify.data.theirid], until: until, reason: formData.reason || '' }, function(err) { if (err) { return app.alertError(err.message); } diff --git a/public/src/client/category.js b/public/src/client/category.js index af0d26b980..80d8d10539 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -277,7 +277,8 @@ define('forum/category', [ cid: ajaxify.data.cid, after: after, direction: direction, - author: utils.params().author + author: utils.params().author, + categoryTopicSort: config.categoryTopicSort }, function (data, done) { if (data.topics && data.topics.length) { Category.onTopicsLoaded(data, direction, done); diff --git a/public/src/client/infinitescroll.js b/public/src/client/infinitescroll.js index ed21602b01..1823b15ca3 100644 --- a/public/src/client/infinitescroll.js +++ b/public/src/client/infinitescroll.js @@ -13,10 +13,10 @@ define('forum/infinitescroll', function() { scroll.init = function(el, cb) { if (typeof el === 'function') { callback = el; - container = $(document); + container = $('body'); } else { callback = cb; - container = el || $(document); + container = el || $('body'); } $(window).off('scroll', onScroll).on('scroll', onScroll); diff --git a/public/src/client/topic.js b/public/src/client/topic.js index dcff9d3fe1..be41d85ac7 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -63,7 +63,7 @@ define('forum/topic', [ handleKeys(); - navigator.init('[component="post/anchor"]', ajaxify.data.postcount, Topic.toTop, Topic.toBottom, Topic.navigatorCallback, Topic.calculateIndex); + navigator.init('[component="post"]', ajaxify.data.postcount, Topic.toTop, Topic.toBottom, Topic.navigatorCallback, Topic.calculateIndex); handleBookmark(tid); diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 3c70c09712..6aae064794 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -222,7 +222,8 @@ define('forum/topic/posts', [ infinitescroll.loadMore('topics.loadMore', { tid: tid, after: after, - direction: direction + direction: direction, + topicPostSort: config.topicPostSort }, function (data, done) { indicatorEl.fadeOut(); diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 93dc81ff06..5f162dc10f 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -9,6 +9,8 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com var navigator = {}; var index = 1; var count = 0; + var navigatorUpdateTimeoutId = 0; + navigator.scrollActive = false; navigator.init = function(selector, count, toTop, toBottom, callback, calculateIndex) { @@ -17,15 +19,8 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com navigator.callback = callback; toTop = toTop || function() {}; toBottom = toBottom || function() {}; - var navigatorUpdateTimeoutId = 0; - $(window).off('scroll', navigator.update).on('scroll', function() { - if (navigatorUpdateTimeoutId) { - clearTimeout(navigatorUpdateTimeoutId); - navigatorUpdateTimeoutId = 0; - } - navigatorUpdateTimeoutId = setTimeout(navigator.update, 100); - }); + $(window).off('scroll', navigator.delayedUpdate).on('scroll', navigator.delayedUpdate); $('.pagination-block .dropdown-menu').off('click').on('click', function(e) { e.stopPropagation(); @@ -98,6 +93,14 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com $('.pagination-block').toggleClass('ready', flag); } + navigator.delayedUpdate = function() { + if (navigatorUpdateTimeoutId) { + clearTimeout(navigatorUpdateTimeoutId); + navigatorUpdateTimeoutId = 0; + } + navigatorUpdateTimeoutId = setTimeout(navigator.update, 100); + }; + navigator.update = function(threshold) { /* The "threshold" is defined as the distance from the top of the page to @@ -128,8 +131,8 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com } }); - var atTop = scrollTop === 0 && parseInt(els.first().attr('data-index'), 10) === 0, - nearBottom = scrollTop + windowHeight > documentHeight - 100 && parseInt(els.last().attr('data-index'), 10) === count - 1; + var atTop = scrollTop === 0 && parseInt(els.first().attr('data-index'), 10) === 0; + var nearBottom = scrollTop + windowHeight > documentHeight - 100 && parseInt(els.last().attr('data-index'), 10) === count - 1; if (atTop) { index = 1; @@ -210,7 +213,11 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com } if (config.usePagination) { - var page = Math.max(1, Math.ceil(postIndex / config.postsPerPage)); + var index = postIndex; + if (config.topicPostSort === 'most_votes' || config.topicPostSort === 'newest_to_oldest') { + index = ajaxify.data.postcount - index; + } + var page = Math.max(1, Math.ceil(index / config.postsPerPage)); if (parseInt(page, 10) !== ajaxify.data.pagination.currentPage) { pagination.loadPage(page, function() { @@ -227,12 +234,10 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com }; navigator.scrollToPostIndex = function(postIndex, highlight, duration) { - var scrollTo = components.get('post/anchor', postIndex), - postEl = components.get('post', 'index', postIndex), - postHeight = postEl.height(), - viewportHeight = $(window).height(), - navbarHeight = components.get('navbar').height(); - + var scrollTo = components.get('post', 'index', postIndex); + var postHeight = scrollTo.height(); + var viewportHeight = $(window).height(); + var navbarHeight = components.get('navbar').height(); if (!scrollTo.length) { navigator.scrollActive = false; @@ -275,9 +280,9 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com function highlightPost() { if (highlight) { - scrollTo.parents('[component="post"]').addClass('highlight'); + scrollTo.addClass('highlight'); setTimeout(function() { - scrollTo.parents('[component="post"]').removeClass('highlight'); + scrollTo.removeClass('highlight'); }, 10000); } } diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index 00a9126448..70eaad8d8e 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -283,10 +283,13 @@ var fs = require('fs'), path = require('path'), winston = require('winston'), + _ = require('underscore'), file = require('../../../src/file'), plugins = require('../../../src/plugins'), meta = require('../../../src/meta'); + var hash = language + '/' + filename + '.json'; + language = language || meta.config.defaultLang || 'en_GB'; if (!file.existsSync(path.join(__dirname, '../../language', language))) { @@ -294,33 +297,27 @@ language = 'en_GB'; } - fs.readFile(path.join(__dirname, '../../language', language, filename + '.json'), function(err, data) { + fs.readFile(path.join(__dirname, '../../language', hash), function(err, data) { var onData = function(data) { try { data = JSON.parse(data.toString()); + + if (plugins.customLanguages.hasOwnProperty(hash)) { + _.extendOwn(data, plugins.customLanguages[hash]); + } } catch (e) { winston.error('Could not parse `' + filename + '.json`, syntax error? Skipping...'); data = {}; } + callback(data); }; - if (err) { - if (err.code === 'ENOENT' && plugins.customLanguageFallbacks.hasOwnProperty(filename)) { - // Resource non-existant but fallback exists - return fs.readFile(plugins.customLanguageFallbacks[filename], { - encoding: 'utf-8' - }, function(err, data) { - if (err) { - return winston.error('[translator] Could not load fallback language file for resource ' + filename); - } - - onData(data); - }); - } else { - winston.error('[translator] Could not load `' + filename + '`: ' + err.message + '. Skipping...'); - return callback({}); - } + if (err && err.code === 'ENOENT') { + data = '{}'; + } else if (err) { + winston.error('[translator] Error while loading language file: ' + err.message); + return callback({}); } onData(data); diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 11ea490d6f..e491d67efd 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -39,6 +39,9 @@ settingsController.get = function(req, res, callback) { }, sounds: function(next) { meta.sounds.getFiles(next); + }, + soundsMapping: function(next) { + meta.sounds.getMapping(userData.uid, next); } }, next); }, @@ -47,10 +50,15 @@ settingsController.get = function(req, res, callback) { userData.languages = results.languages; userData.homePageRoutes = results.homePageRoutes; - var soundSettings = ['notificationSound', 'incomingChatSound', 'outgoingChatSound']; - soundSettings.forEach(function(setting) { + var soundSettings = { + 'notificationSound': 'notification', + 'incomingChatSound': 'chat-incoming', + 'outgoingChatSound': 'chat-outgoing' + }; + + Object.keys(soundSettings).forEach(function(setting) { userData[setting] = Object.keys(results.sounds).map(function(name) { - return {name: name, selected: name === userData.settings[setting]}; + return {name: name, selected: name === results.soundsMapping[soundSettings[setting]]}; }); }); diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index 00a5694937..80b0829487 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -62,9 +62,8 @@ function getNodeInfo(callback) { }; async.parallel({ - pubsub: function(next) { - pubsub.publish('sync:stats:start'); - next(); + stats: function(next) { + rooms.getLocalStats(next); }, gitInfo: function(next) { getGitInfo(next); @@ -74,7 +73,7 @@ function getNodeInfo(callback) { return callback(err); } data.git = results.gitInfo; - data.stats = rooms.stats[data.os.hostname + ':' + data.process.port]; + data.stats = results.stats; callback(null, data); }); } diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index 50c44ef1b7..13e7b42722 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -19,9 +19,9 @@ settingsController.get = function(req, res, next) { function renderEmail(req, res, next) { - var fs = require('fs'), - path = require('path'), - utils = require('../../../public/src/utils'); + var fs = require('fs'); + var path = require('path'); + var utils = require('../../../public/src/utils'); var emailsPath = path.join(__dirname, '../../../public/templates/emails'); utils.walk(emailsPath, function(err, emails) { diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 0f74827be2..ce2c652b6a 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -379,7 +379,16 @@ authenticationController.localLogin = function(req, username, password, next) { return next(new Error('[[error:invalid-user-data]]')); } if (result.banned) { - return next(new Error('[[error:user-banned]]')); + // Retrieve ban reason and show error + return user.getLatestBanInfo(uid, function(err, banInfo) { + if (err) { + next(err); + } else if (banInfo.reason) { + next(new Error('[[error:user-banned-reason, ' + banInfo.reason + ']]')); + } else { + next(new Error('[[error:user-banned]]')); + } + }); } Password.compare(password, userData.password, next); diff --git a/src/controllers/groups.js b/src/controllers/groups.js index bd866dedfc..294e9ac1fc 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -82,7 +82,12 @@ groupsController.details = function(req, res, callback) { posts: function(next) { groups.getLatestMemberPosts(res.locals.groupName, 10, req.uid, next); }, - isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, req.uid) + isAdmin:function(next) { + user.isAdministrator(req.uid, next); + }, + isGlobalMod: function(next) { + user.isGlobalModerator(req.uid, next); + } }, next); } ], function(err, results) { @@ -93,7 +98,7 @@ groupsController.details = function(req, res, callback) { if (!results.group) { return callback(); } - results.group.isOwner = results.group.isOwner || results.isAdminOrGlobalMod; + results.group.isOwner = results.group.isOwner || results.isAdmin || (results.isGlobalMod && !results.group.system); results.title = '[[pages:group, ' + results.group.displayName + ']]'; results.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[pages:groups]]', url: '/groups' }, {text: results.group.displayName}]); results.allowPrivateGroups = parseInt(meta.config.allowPrivateGroups, 10) === 1; diff --git a/src/controllers/index.js b/src/controllers/index.js index d39352e6d0..6142c48240 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -109,7 +109,7 @@ Controllers.login = function(req, res, next) { if (req.query.error === 'csrf-invalid') { errorText = '[[error:csrf-invalid]]'; } else if (req.query.error) { - errorText = req.query.error; + errorText = validator.escape(String(req.query.error)); } data.alternate_logins = loginStrategies.length > 0; @@ -318,9 +318,9 @@ Controllers.manifest = function(req, res) { }; Controllers.outgoing = function(req, res) { - var url = req.query.url; + var url = req.query.url || ''; var data = { - url: validator.escape(String(url)), + outgoing: validator.escape(String(url)), title: meta.config.title, breadcrumbs: helpers.buildBreadcrumbs([{text: '[[notifications:outgoing_link]]'}]) }; diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 5cc06eab42..33e6d4e79b 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -141,8 +141,13 @@ module.exports = function(db, module) { key = {$in: key}; } + var limit = stop - start + 1; + if (limit <= 0) { + limit = 0; + } + db.collection('objects').find({_key: key}, {fields: fields}) - .limit(stop - start + 1) + .limit(limit) .skip(start) .sort({score: sort}) .toArray(function(err, data) { diff --git a/src/file.js b/src/file.js index 3920b3c271..a9d3ad207f 100644 --- a/src/file.js +++ b/src/file.js @@ -22,14 +22,13 @@ file.saveFileToLocal = function(filename, folder, tempPath, callback) { var uploadPath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), folder, filename); - winston.verbose('Saving file '+ filename +' to : ' + uploadPath); + winston.verbose('Saving file '+ filename + ' to : ' + uploadPath); var is = fs.createReadStream(tempPath); var os = fs.createWriteStream(uploadPath); - is.on('end', function () { callback(null, { - url: path.join(nconf.get('upload_url'), folder, filename), + url: nconf.get('upload_url') + '/' + folder + '/' + filename, path: uploadPath }); }); diff --git a/src/image.js b/src/image.js index fca120d1e5..f1e12c81d5 100644 --- a/src/image.js +++ b/src/image.js @@ -1,11 +1,11 @@ 'use strict'; -var fs = require('fs'), - Jimp = require('jimp'), - async = require('async'), - plugins = require('./plugins'); +var fs = require('fs'); +var Jimp = require('jimp'); +var async = require('async'); +var plugins = require('./plugins'); -var image = {}; +var image = module.exports; image.resizeImage = function(data, callback) { if (plugins.hasListeners('filter:image.resize')) { @@ -106,12 +106,10 @@ image.size = function(path, callback) { callback(err, data ? data.bitmap : null); }); } -} +}; image.convertImageToBase64 = function(path, callback) { fs.readFile(path, function(err, data) { callback(err, data ? data.toString('base64') : null); }); }; - -module.exports = image; diff --git a/src/meta/js.js b/src/meta/js.js index 3367734019..3d85c7efb1 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -80,7 +80,7 @@ module.exports = function(Meta) { modules: { "Chart.js": './node_modules/chart.js/dist/Chart.min.js', "mousetrap.js": './node_modules/mousetrap/mousetrap.js', - + "jqueryui.js": 'public/vendor/jquery/js/jquery-ui.js', "buzz.js": 'public/vendor/buzz/buzz.js' } } diff --git a/src/meta/sounds.js b/src/meta/sounds.js index c413def9e3..9a73942773 100644 --- a/src/meta/sounds.js +++ b/src/meta/sounds.js @@ -75,13 +75,13 @@ module.exports = function(Meta) { var defaultMapping = results.defaultMapping || {}; var soundMapping = {}; soundMapping.notification = (userSettings.notificationSound || userSettings.notificationSound === '') ? - userSettings.notificationSound : defaultMapping.notification || 'notification.mp3'; + userSettings.notificationSound : defaultMapping.notification || ''; soundMapping['chat-incoming'] = (userSettings.incomingChatSound || userSettings.incomingChatSound === '') ? - userSettings.incomingChatSound : defaultMapping['chat-incoming'] || 'waterdrop-high.mp3'; + userSettings.incomingChatSound : defaultMapping['chat-incoming'] || ''; soundMapping['chat-outgoing'] = (userSettings.outgoingChatSound || userSettings.outgoingChatSound === '') ? - userSettings.outgoingChatSound : defaultMapping['chat-outgoing'] || undefined; + userSettings.outgoingChatSound : defaultMapping['chat-outgoing'] || ''; callback(null, soundMapping); }); diff --git a/src/plugins/load.js b/src/plugins/load.js index 8eac293829..04c0c84bba 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -253,7 +253,6 @@ module.exports = function(Plugins) { }).filter(Boolean).forEach(function(key) { Plugins.customLanguages[key] = _.defaults(Plugins.customLanguages[key] || {}, data); }); - fallbackMap[path.basename(pathToLang, '.json')] = path.join(pathToFolder, pluginData.defaultLang, path.basename(pathToLang)); } next(); @@ -263,9 +262,6 @@ module.exports = function(Plugins) { return callback(err); } - // do I need this either? - _.extendOwn(Plugins.customLanguageFallbacks, fallbackMap); - callback(); }); }); diff --git a/src/posts/edit.js b/src/posts/edit.js index 333901c1fa..5bb76ec019 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -68,8 +68,8 @@ module.exports = function(Posts) { plugins.fireHook('action:post.edit', _.clone(postData)); - cache.del(postData.pid); - pubsub.publish('post:edit', postData.pid); + cache.del(String(postData.pid)); + pubsub.publish('post:edit', String(postData.pid)); Posts.parsePost(postData, next); }, diff --git a/src/posts/parse.js b/src/posts/parse.js index 19e6430681..88fa5f8c22 100644 --- a/src/posts/parse.js +++ b/src/posts/parse.js @@ -15,8 +15,8 @@ module.exports = function(Posts) { Posts.parsePost = function(postData, callback) { postData.content = postData.content || ''; - if (postData.pid && cache.has(postData.pid)) { - postData.content = cache.get(postData.pid); + if (postData.pid && cache.has(String(postData.pid))) { + postData.content = cache.get(String(postData.pid)); return callback(null, postData); } @@ -33,7 +33,7 @@ module.exports = function(Posts) { data.postData.content = translator.escape(data.postData.content); if (global.env === 'production' && data.postData.pid) { - cache.set(data.postData.pid, data.postData.content); + cache.set(String(data.postData.pid), data.postData.content); } callback(null, data.postData); diff --git a/src/routes/debug.js b/src/routes/debug.js index a24a159e18..a2191d8ffa 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -1,12 +1,12 @@ "use strict"; -var express = require('express'), - nconf = require('nconf'), - winston = require('winston'), - user = require('./../user'), - categories = require('./../categories'), - topics = require('./../topics'), - posts = require('./../posts'); +var express = require('express'); +var nconf = require('nconf'); +var winston = require('winston'); +var user = require('./../user'); +var categories = require('./../categories'); +var topics = require('./../topics'); +var posts = require('./../posts'); module.exports = function(app, middleware, controllers) { var router = express.Router(); diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js index b5f4ffb501..fcb52debe1 100644 --- a/src/socket.io/admin/rooms.js +++ b/src/socket.io/admin/rooms.js @@ -17,7 +17,7 @@ var SocketRooms = { pubsub.on('sync:stats:start', function() { - getLocalStats(function(err, stats) { + SocketRooms.getLocalStats(function(err, stats) { if (err) { return winston.error(err); } @@ -50,7 +50,7 @@ SocketRooms.getTotalGuestCount = function(callback) { pubsub.removeAllListeners('sync:stats:guests:end'); callback(null, count); }, 100); -} +}; SocketRooms.getAll = function(socket, data, callback) { @@ -129,7 +129,7 @@ SocketRooms.getOnlineUserCount = function(io) { return count; }; -function getLocalStats(callback) { +SocketRooms.getLocalStats = function(callback) { var io = require('../index').server; if (!io) { @@ -172,7 +172,7 @@ function getLocalStats(callback) { socketData.topics = topTenTopics; callback(null, socketData); -} +}; module.exports = SocketRooms; \ No newline at end of file diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index 1c13adebea..a8957a10dc 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -80,12 +80,12 @@ SocketCategories.loadMore = function(socket, data, callback) { } var infScrollTopicsPerPage = 20; - var set = 'cid:' + data.cid + ':tids', - reverse = false; + var set = 'cid:' + data.cid + ':tids'; + var reverse = false; - if (results.settings.categoryTopicSort === 'newest_to_oldest') { + if (data.categoryTopicSort === 'newest_to_oldest') { reverse = true; - } else if (results.settings.categoryTopicSort === 'most_posts') { + } else if (data.categoryTopicSort === 'most_posts') { reverse = true; set = 'cid:' + data.cid + ':tids:posts'; } diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 3ec75ecd0d..5ee6050571 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -133,10 +133,10 @@ var ratelimit = require('../middleware/ratelimit'); function validateSession(socket, callback) { var req = socket.request; - if (!req.signedCookies || !req.signedCookies['express.sid']) { + if (!req.signedCookies || !req.signedCookies[nconf.get('sessionKey')]) { return callback(new Error('[[error:invalid-session]]')); } - db.sessionStore.get(req.signedCookies['express.sid'], function (err, sessionData) { + db.sessionStore.get(req.signedCookies[nconf.get('sessionKey')], function (err, sessionData) { if (err || !sessionData) { return callback(err || new Error('[[error:invalid-session]]')); } @@ -157,7 +157,7 @@ var ratelimit = require('../middleware/ratelimit'); cookieParser(request, {}, next); }, function (next) { - db.sessionStore.get(request.signedCookies['express.sid'], function (err, sessionData) { + db.sessionStore.get(request.signedCookies[nconf.get('sessionKey')], function (err, sessionData) { if (err) { return next(err); } diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js index 5f089bd52e..7401c60e1f 100644 --- a/src/socket.io/topics/infinitescroll.js +++ b/src/socket.io/topics/infinitescroll.js @@ -1,7 +1,7 @@ 'use strict'; var async = require('async'); -var user = require('../../user'); + var topics = require('../../topics'); var privileges = require('../../privileges'); var meta = require('../../meta'); @@ -19,9 +19,6 @@ module.exports = function(SocketTopics) { privileges: function(next) { privileges.topics.get(data.tid, socket.uid, next); }, - settings: function(next) { - user.getSettings(socket.uid, next); - }, topic: function(next) { topics.getTopicFields(data.tid, ['postcount', 'deleted'], next); } @@ -35,10 +32,10 @@ module.exports = function(SocketTopics) { } var set = 'tid:' + data.tid + ':posts'; - if (results.settings.topicPostSort === 'most_votes') { + if (data.topicPostSort === 'most_votes') { set = 'tid:' + data.tid + ':posts:votes'; } - var reverse = results.settings.topicPostSort === 'newest_to_oldest' || results.settings.topicPostSort === 'most_votes'; + var reverse = data.topicPostSort === 'newest_to_oldest' || data.topicPostSort === 'most_votes'; var start = Math.max(0, parseInt(data.after, 10)); var infScrollPostsPerPage = 10; diff --git a/src/socket.io/user/ban.js b/src/socket.io/user/ban.js index 41c60411e0..80f701c1a2 100644 --- a/src/socket.io/user/ban.js +++ b/src/socket.io/user/ban.js @@ -12,12 +12,13 @@ module.exports = function(SocketUser) { if (Array.isArray(data)) { data = { uids: data, - until: 0 + until: 0, + reason: '' }; } toggleBan(socket.uid, data.uids, function(uid, next) { - banUser(data.until || 0, uid, next); + banUser(uid, data.until || 0, data.reason || '', next); }, function(err) { if (err) { return callback(err); @@ -68,7 +69,7 @@ module.exports = function(SocketUser) { ], callback); } - function banUser(until, uid, callback) { + function banUser(uid, until, reason, callback) { async.waterfall([ function (next) { user.isAdministrator(uid, next); @@ -77,7 +78,7 @@ module.exports = function(SocketUser) { if (isAdmin) { return next(new Error('[[error:cant-ban-other-admins]]')); } - user.ban(uid, until, next); + user.ban(uid, until, reason, next); }, function (next) { websockets.in('uid_' + uid).emit('event:banned'); diff --git a/src/topics.js b/src/topics.js index 4cb795b2c3..7d9938987a 100644 --- a/src/topics.js +++ b/src/topics.js @@ -14,7 +14,6 @@ var social = require('./social'); (function(Topics) { - require('./topics/data')(Topics); require('./topics/create')(Topics); require('./topics/delete')(Topics); @@ -29,6 +28,7 @@ var social = require('./social'); require('./topics/teaser')(Topics); require('./topics/suggested')(Topics); require('./topics/tools')(Topics); + require('./topics/thumb')(Topics); Topics.exists = function(tid, callback) { db.isSortedSetMember('topics:tid', tid, callback); diff --git a/src/topics/create.js b/src/topics/create.js index de55045ed8..db4976678c 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -21,6 +21,9 @@ module.exports = function(Topics) { var topicData; async.waterfall([ + function(next) { + Topics.resizeAndUploadThumb(data, next); + }, function(next) { db.incrObjectField('global', 'nextTid', next); }, diff --git a/src/topics/thumb.js b/src/topics/thumb.js new file mode 100644 index 0000000000..5829e080c4 --- /dev/null +++ b/src/topics/thumb.js @@ -0,0 +1,91 @@ + +'use strict'; + +var async = require('async'); +var nconf = require('nconf'); +var winston = require('winston'); +var path = require('path'); +var fs = require('fs'); +var request = require('request'); +var mime = require('mime'); +var validator = require('validator'); + +var meta = require('../meta'); +var image = require('../image'); +var file = require('../file'); +var plugins = require('../plugins'); + +module.exports = function(Topics) { + + Topics.resizeAndUploadThumb = function(data, callback) { + if (!data.thumb || !validator.isURL(data.thumb)) { + return callback(); + } + + var pathToUpload; + var filename; + + async.waterfall([ + function(next) { + request.head(data.thumb, next); + }, + function(res, body, next) { + + var type = res.headers['content-type']; + if (!type.match(/image./)) { + return next(new Error('[[error:invalid-file]]')); + } + + var extension = path.extname(data.thumb); + if (!extension) { + extension = '.' + mime.extension(type); + } + filename = Date.now() + '-topic-thumb' + extension; + pathToUpload = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'files', filename); + + request(data.thumb).pipe(fs.createWriteStream(pathToUpload)).on('close', next); + }, + function(next) { + file.isFileTypeAllowed(pathToUpload, next); + }, + function(next) { + var size = parseInt(meta.config.topicThumbSize, 10) || 120; + image.resizeImage({ + path: pathToUpload, + extension: path.extname(pathToUpload), + width: size, + height: size + }, next); + }, + function(next) { + if (!plugins.hasListeners('filter:uploadImage')) { + data.thumb = path.join(nconf.get('upload_url'), 'files', filename); + return callback(); + } + + plugins.fireHook('filter:uploadImage', {image: {path: pathToUpload, name: ''}, uid: data.uid}, next); + }, + function(uploadedFile, next) { + deleteFile(pathToUpload); + data.thumb = uploadedFile.url; + next(); + } + ], function(err) { + if (err) { + deleteFile(pathToUpload); + } + callback(err); + }); + }; + + function deleteFile(path) { + if (path) { + fs.unlink(path, function(err) { + if (err) { + winston.error(err); + } + }); + } + } + +}; diff --git a/src/user/admin.js b/src/user/admin.js index dd3134e442..2509028b55 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -53,13 +53,20 @@ module.exports = function(User) { ], callback); }; - User.ban = function(uid, until, callback) { + User.ban = function(uid, until, reason, callback) { // "until" (optional) is unix timestamp in milliseconds + // "reason" (optional) is a string if (!callback && typeof until === 'function') { callback = until; until = 0; + reason = ''; + } else if (!callback && typeof reason === 'function') { + callback = reason; + reason = ''; } + var now = Date.now(); + until = parseInt(until, 10); if (isNaN(until)) { return callback(new Error('[[error:ban-expiry-missing]]')); @@ -67,17 +74,21 @@ module.exports = function(User) { var tasks = [ async.apply(User.setUserField, uid, 'banned', 1), - async.apply(db.sortedSetAdd, 'users:banned', Date.now(), uid), - async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans', Date.now(), until) + async.apply(db.sortedSetAdd, 'users:banned', now, uid), + async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans', now, until) ]; - if (until > 0 && Date.now() < until) { + if (until > 0 && now < until) { tasks.push(async.apply(db.sortedSetAdd, 'users:banned:expire', until, uid)); tasks.push(async.apply(User.setUserField, uid, 'banned:expire', until)); } else { until = 0; } + if (reason) { + tasks.push(async.apply(db.sortedSetAdd, 'banned:' + uid + ':reasons', now, reason)); + } + async.series(tasks, function (err) { if (err) { return callback(err); diff --git a/src/user/data.js b/src/user/data.js index 6f2a2dd4b7..d0c70ce80c 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -50,6 +50,10 @@ module.exports = function(User) { addField('uploadedpicture'); } + if (fields.indexOf('status') !== -1) { + addField('lastonline'); + } + db.getObjectsFields(keys, fields, function(err, users) { if (err) { return callback(err); @@ -117,6 +121,10 @@ module.exports = function(User) { user.uploadedpicture = user.uploadedpicture.startsWith('http') ? user.uploadedpicture : nconf.get('relative_path') + user.uploadedpicture; } + if (user.hasOwnProperty('status') && parseInt(user.lastonline, 10)) { + user.status = User.getStatus(user); + } + for(var i=0; i
  • Installed
  • Active
  • +
  • Inactive
  • Out of Date {upgradeCount} @@ -22,6 +23,9 @@
      +
      +
        +
          diff --git a/src/views/admin/general/sounds.tpl b/src/views/admin/general/sounds.tpl index f32e81191b..1154f4ec75 100644 --- a/src/views/admin/general/sounds.tpl +++ b/src/views/admin/general/sounds.tpl @@ -8,7 +8,7 @@
          - + @@ -43,7 +43,7 @@
          diff --git a/src/views/admin/partials/temporary-ban.tpl b/src/views/admin/partials/temporary-ban.tpl index a3f032a3b6..da8d02c79f 100644 --- a/src/views/admin/partials/temporary-ban.tpl +++ b/src/views/admin/partials/temporary-ban.tpl @@ -1,13 +1,32 @@ -
          -
          - -
          - - - - + +
          +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +    + + +
          +
          +
          +

          + Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban. +

          +
          -

          - Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban. -

          \ No newline at end of file diff --git a/src/webserver.js b/src/webserver.js index 94e44cc248..d7457e1b95 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -108,7 +108,7 @@ function setupExpressApp(app) { app.use(session({ store: db.sessionStore, secret: nconf.get('secret'), - key: 'express.sid', + key: nconf.get('sessionKey'), cookie: setupCookie(), resave: true, saveUninitialized: true