diff --git a/install/package.json b/install/package.json index 7622c2f576..fed7f7fc44 100644 --- a/install/package.json +++ b/install/package.json @@ -18,10 +18,10 @@ }, "dependencies": { "ace-builds": "^1.2.9", - "async": "2.5.0", + "async": "2.6.0", "autoprefixer": "7.1.6", "bcryptjs": "2.4.3", - "benchpressjs": "^1.1.2", + "benchpressjs": "^1.2.0", "body-parser": "^1.18.2", "bootstrap": "^3.3.7", "chart.js": "^2.7.0", @@ -58,10 +58,10 @@ "mongodb": "2.2.33", "morgan": "^1.9.0", "mousetrap": "^1.6.1", - "nconf": "^0.8.5", - "nodebb-plugin-composer-default": "6.0.6", + "nconf": "^0.9.1", + "nodebb-plugin-composer-default": "6.0.7", "nodebb-plugin-dbsearch": "2.0.9", - "nodebb-plugin-emoji": "2.0.5", + "nodebb-plugin-emoji": "2.0.7", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.2.0", "nodebb-plugin-mentions": "2.2.2", @@ -69,14 +69,14 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.2.1", + "nodebb-theme-persona": "7.2.4", "nodebb-theme-slick": "1.1.2", - "nodebb-theme-vanilla": "8.1.1", + "nodebb-theme-vanilla": "8.1.2", "nodebb-widget-essentials": "4.0.1", - "nodemailer": "4.3.0", + "nodemailer": "4.4.0", "passport": "^0.4.0", "passport-local": "1.0.0", - "postcss": "6.0.13", + "postcss": "6.0.14", "postcss-clean": "1.1.0", "promise-polyfill": "^6.0.2", "prompt": "^1.0.0", @@ -95,7 +95,7 @@ "spdx-license-list": "^3.0.1", "toobusy-js": "^0.5.1", "uglify-js": "^3.1.5", - "validator": "9.0.0", + "validator": "9.1.2", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "3.2.0", diff --git a/public/language/ar/admin/admin.json b/public/language/ar/admin/admin.json index 9c01f56006..a307bc8d28 100644 --- a/public/language/ar/admin/admin.json +++ b/public/language/ar/admin/admin.json @@ -1,7 +1,7 @@ { - "alert.confirm-reload": "Are you sure you wish to reload NodeBB?", - "alert.confirm-restart": "Are you sure you wish to restart NodeBB?", + "alert.confirm-reload": "هل تريد بالتأكيد إعادة تحميل NodeBB؟", + "alert.confirm-restart": "هل تريد بالتأكيد إعادة تشغيل NodeBB؟", - "acp-title": "%1 | NodeBB Admin Control Panel", - "settings-header-contents": "Contents" + "acp-title": "لوحة تحكم إدارة NodeBB | %1", + "settings-header-contents": "محتويات" } \ No newline at end of file diff --git a/public/language/ar/admin/advanced/cache.json b/public/language/ar/admin/advanced/cache.json index 5a954f1232..e459eea6d5 100644 --- a/public/language/ar/admin/advanced/cache.json +++ b/public/language/ar/admin/advanced/cache.json @@ -1,11 +1,11 @@ { - "post-cache": "Post Cache", - "posts-in-cache": "Posts in Cache", - "average-post-size": "Average Post Size", - "length-to-max": "Length / Max", + "post-cache": "التخزين المؤقت للمشاركات", + "posts-in-cache": "المشاركات المخزنة مؤقتاً", + "average-post-size": "متوسط ​​حجم المشاركة", + "length-to-max": "الطول / أقصى حد", "percent-full": "%1% Full", - "post-cache-size": "Post Cache Size", - "items-in-cache": "Items in Cache", - "control-panel": "Control Panel", - "update-settings": "Update Cache Settings" + "post-cache-size": "حجم التخزين المؤقت للمشاركات", + "items-in-cache": "العناصر في التخزين المؤقت", + "control-panel": "لوحة التحكم", + "update-settings": "تحديث إعدادات التخزين المؤقت" } \ No newline at end of file diff --git a/public/language/ar/admin/advanced/database.json b/public/language/ar/admin/advanced/database.json index b88ca6fc82..8a8fc25a79 100644 --- a/public/language/ar/admin/advanced/database.json +++ b/public/language/ar/admin/advanced/database.json @@ -16,7 +16,7 @@ "mongo.index-size": "Index Size", "mongo.file-size": "File Size", "mongo.resident-memory": "Resident Memory", - "mongo.virtual-memory": "Virtual Memory", + "mongo.virtual-memory": "الذاكرة الإفتراضية", "mongo.mapped-memory": "Mapped Memory", "mongo.raw-info": "MongoDB Raw Info", @@ -25,10 +25,10 @@ "redis.connected-clients": "Connected Clients", "redis.connected-slaves": "Connected Slaves", "redis.blocked-clients": "Blocked Clients", - "redis.used-memory": "Used Memory", + "redis.used-memory": "الذاكرة المستخدمة", "redis.memory-frag-ratio": "Memory Fragmentation Ratio", - "redis.total-connections-recieved": "Total Connections Received", - "redis.total-commands-processed": "Total Commands Processed", + "redis.total-connections-recieved": "إجمالي الاتصالات المستلمة", + "redis.total-commands-processed": "إجمالي الأوامر التي تمت معالجتها", "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", diff --git a/public/language/ar/admin/advanced/errors.json b/public/language/ar/admin/advanced/errors.json index 546f0f1508..bf9bc97443 100644 --- a/public/language/ar/admin/advanced/errors.json +++ b/public/language/ar/admin/advanced/errors.json @@ -1,14 +1,14 @@ { - "figure-x": "Figure %1", - "error-events-per-day": "%1 events per day", - "error.404": "404 Not Found", - "error.503": "503 Service Unavailable", - "manage-error-log": "Manage Error Log", - "export-error-log": "Export Error Log (CSV)", - "clear-error-log": "Clear Error Log", - "route": "Route", - "count": "Count", - "no-routes-not-found": "Hooray! No 404 errors!", - "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", - "clear404-success": "\"404 Not Found\" errors cleared" + "figure-x": "شكل %1", + "error-events-per-day": "%1 حدث كل يوم ", + "error.404": "404 لم يتم العثور", + "error.503": "503 الخدمة غير متوفرة", + "manage-error-log": "إدارة سجل الأخطاء", + "export-error-log": "تصدير سجل الأخطاء (CSV)", + "clear-error-log": "محو سجل الأخطاء", + "route": "مسار", + "count": "عدد", + "no-routes-not-found": "لا توجد اخطاء 404!", + "clear404-confirm": "هل تريد بالتأكيد محو سجلات الخطأ 404؟", + "clear404-success": "أخطاء \"404 لم يتم العثور\" تم محوها بنجاح" } \ No newline at end of file diff --git a/public/language/ar/admin/advanced/events.json b/public/language/ar/admin/advanced/events.json index 766eb5e951..662c3f9061 100644 --- a/public/language/ar/admin/advanced/events.json +++ b/public/language/ar/admin/advanced/events.json @@ -1,6 +1,6 @@ { - "events": "Events", - "no-events": "There are no events", - "control-panel": "Events Control Panel", - "delete-events": "Delete Events" + "events": "أحداث", + "no-events": "لا توجد أحداث", + "control-panel": "لوحة تحكم الأحداث", + "delete-events": "حذف الأحداث" } \ No newline at end of file diff --git a/public/language/ar/admin/advanced/logs.json b/public/language/ar/admin/advanced/logs.json index b9de400e1c..cb6a87021b 100644 --- a/public/language/ar/admin/advanced/logs.json +++ b/public/language/ar/admin/advanced/logs.json @@ -1,7 +1,7 @@ { - "logs": "Logs", - "control-panel": "Logs Control Panel", - "reload": "Reload Logs", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "logs": "السجلات", + "control-panel": "لوحة تحكم السجلات", + "reload": "إعادة تحميل السجلات", + "clear": "محو السجلات", + "clear-success": "تم محو السجلات!" } \ No newline at end of file diff --git a/public/language/ar/admin/appearance/customise.json b/public/language/ar/admin/appearance/customise.json index a1220ec96d..94280603a6 100644 --- a/public/language/ar/admin/appearance/customise.json +++ b/public/language/ar/admin/appearance/customise.json @@ -1,16 +1,16 @@ { - "custom-css": "Custom CSS", - "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", - "custom-css.enable": "Enable Custom CSS", + "custom-css": "CSS مخصص", + "custom-css.description": "أدخل CSS الخاصة بك هنا، والتي سيتم تطبيقها بعد كل القوالب الأخرى.", + "custom-css.enable": "تفعيل CSS المخصص", - "custom-js": "Custom Javascript", - "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", - "custom-js.enable": "Enable Custom Javascript", + "custom-js": "Javascript مخصصة", + "custom-js.description": "أدخل Javascript الخاص بك هنا. سيتم تنفيذها بعد تحميل الصفحة بالكامل.", + "custom-js.enable": "تفعيل Javascript المخصصة", - "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", - "custom-header.enable": "Enable Custom Header", + "custom-header": "ترويسة مخصصة", + "custom-header.description": "أدخل HTML الخاصة بك هنا (مثل العلامات الوصفية، وما إلى ذلك)، والتي سيتم إلحاقها الى<head> في تصميم المنتدى. يسمح باستخدام علامات النص البرمجي، ولكن سيتم تعطيلها؛ لتوفر تبويبة\nJavascript المخصصة", + "custom-header.enable": "تفعيل الترويسة المخصصة", - "custom-css.livereload": "Enable Live Reload", - "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" + "custom-css.livereload": "تفعيل إعادة التحميل المباشرة", + "custom-css.livereload.description": "فعل هذا الخيار لإجبار جميع الجلسات في الأجهزة التي قمت بتسجيل الدخول فيها بحسابك على التحديث عند النقر على زر الحفظ" } \ No newline at end of file diff --git a/public/language/ar/admin/appearance/skins.json b/public/language/ar/admin/appearance/skins.json index 4db6fbdd8a..7c97d46cc6 100644 --- a/public/language/ar/admin/appearance/skins.json +++ b/public/language/ar/admin/appearance/skins.json @@ -1,9 +1,9 @@ { - "loading": "Loading Skins...", - "homepage": "Homepage", - "select-skin": "Select Skin", - "current-skin": "Current Skin", - "skin-updated": "Skin Updated", - "applied-success": "%1 skin was succesfully applied", - "revert-success": "Skin reverted to base colours" + "loading": "جاري تحميل السمات...", + "homepage": "الصفحة الرئيسية", + "select-skin": "إختيار السمة", + "current-skin": "السمة الحالية", + "skin-updated": "تم تحديث السمة", + "applied-success": "تم تطبيق السمة %1 بنجاح", + "revert-success": "تم إستعادة الألوان الاساسية للسمة" } \ No newline at end of file diff --git a/public/language/ar/admin/appearance/themes.json b/public/language/ar/admin/appearance/themes.json index 3148a01337..6ca23eaf0e 100644 --- a/public/language/ar/admin/appearance/themes.json +++ b/public/language/ar/admin/appearance/themes.json @@ -1,11 +1,11 @@ { - "checking-for-installed": "Checking for installed themes...", - "homepage": "Homepage", - "select-theme": "Select Theme", - "current-theme": "Current Theme", - "no-themes": "No installed themes found", - "revert-confirm": "Are you sure you wish to restore the default NodeBB theme?", - "theme-changed": "Theme Changed", - "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", - "restart-to-activate": "Please restart your NodeBB to fully activate this theme" + "checking-for-installed": "جاري التحقق من القوالب المثبتة...", + "homepage": "الصفحة الرئيسية", + "select-theme": "إختيار القالب", + "current-theme": "القالب المستخدم حالياً", + "no-themes": "لم يتم العثور على قوالب مثبتة", + "revert-confirm": "هل أنت متأكد من أنك ترغب في استعادة قااب NodeBB الافتراضي؟", + "theme-changed": "تم تغيير القالب", + "revert-success": "لقد قمت بنجاح بإستعادة القالب الأساسي لـNodeBB", + "restart-to-activate": "الرجاء إعادة تشغيل NodeBB لتنشيط هذا القالب بشكل كامل" } \ No newline at end of file diff --git a/public/language/ar/admin/extend/plugins.json b/public/language/ar/admin/extend/plugins.json index 7515f72590..a9082be614 100644 --- a/public/language/ar/admin/extend/plugins.json +++ b/public/language/ar/admin/extend/plugins.json @@ -1,51 +1,51 @@ { - "installed": "Installed", - "active": "Active", - "inactive": "Inactive", - "out-of-date": "Out of Date", - "none-found": "No plugins found.", - "none-active": "No Active Plugins", - "find-plugins": "Find Plugins", + "installed": "منصبة", + "active": "مفعلة", + "inactive": "معطلة", + "out-of-date": "غير محدثة", + "none-found": "لم يتم العثور على إضافات", + "none-active": "لا توجد إضافات مفعلة", + "find-plugins": "العثور على الإضافات", - "plugin-search": "Plugin Search", - "plugin-search-placeholder": "Search for plugin...", - "reorder-plugins": "Re-order Plugins", - "order-active": "Order Active Plugins", - "dev-interested": "Interested in writing plugins for NodeBB?", - "docs-info": "Full documentation regarding plugin authoring can be found in the NodeBB Docs Portal.", + "plugin-search": "البحث عن الإضافات", + "plugin-search-placeholder": "جاري البحث عن الإضافات...", + "reorder-plugins": "إعادة ترتيب الإضافات", + "order-active": "ترتيب الإضافات المفعلة", + "dev-interested": "هل انته مهتم ببرمجة إضافات لـNodeBB؟", + "docs-info": "دليل كامل حول برمجة الإضافات بالإمكان العثور عليه في NodeBB Docs Portal.", - "order.description": "Certain plugins work ideally when they are initialised before/after other plugins.", - "order.explanation": "Plugins load in the order specified here, from top to bottom", + "order.description": "بعض الإضافات تعمل بشكل مثالي عندما يتم تفعيلها قبل أو بعد الإضافات الأخرى.", + "order.explanation": "يتم تحميل الإضافات حسب الترتيب المحدد هنا، من الأعلى إلى الأسفل", - "plugin-item.themes": "Themes", - "plugin-item.deactivate": "Deactivate", - "plugin-item.activate": "Activate", - "plugin-item.install": "Install", - "plugin-item.uninstall": "Uninstall", - "plugin-item.settings": "Settings", - "plugin-item.installed": "Installed", - "plugin-item.latest": "Latest", - "plugin-item.upgrade": "Upgrade", - "plugin-item.more-info": "For more information:", - "plugin-item.unknown": "Unknown", - "plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.", + "plugin-item.themes": "القوالب", + "plugin-item.deactivate": "تعطيل", + "plugin-item.activate": "تفعيل", + "plugin-item.install": "تنصيب", + "plugin-item.uninstall": "إلغاء التنصيب", + "plugin-item.settings": "الإعدادات", + "plugin-item.installed": "المنصبة", + "plugin-item.latest": "الأحدث", + "plugin-item.upgrade": "ترقية", + "plugin-item.more-info": "لمزيد من المعلومات:", + "plugin-item.unknown": "غير معروف", + "plugin-item.unknown-explanation": "تعذر تحديد حالة هذه الإضافة، ربما بسبب خطأ في الإعدادات.", - "alert.enabled": "Plugin Enabled", - "alert.disabled": "Plugin Disabled", - "alert.upgraded": "Plugin Upgraded", - "alert.installed": "Plugin Installed", - "alert.uninstalled": "Plugin Uninstalled", - "alert.activate-success": "Please restart your NodeBB to fully activate this plugin", - "alert.deactivate-success": "Plugin successfully deactivated", - "alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin", - "alert.install-success": "Plugin successfully installed, please activate the plugin.", - "alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.", + "alert.enabled": "الإضافة مفعلة", + "alert.disabled": "الإضافة معطلة", + "alert.upgraded": "الإضافة مرقاة", + "alert.installed": "الإضافة منصبة", + "alert.uninstalled": "تم إلغاء تنصيب الإضافة", + "alert.activate-success": "يرجى إعادة تشغيل NodeBB لتنشيط الإضافة بشكل بالكامل", + "alert.deactivate-success": "تم تعطيل الإضافة بنجاح", + "alert.upgrade-success": "يرجى إعادة تحميل NodeBB لترقية هذه الإضافة بشكل كامل", + "alert.install-success": "تم تثبيت الإضافة بنجاح، يرجى تفعيلها.", + "alert.uninstall-success": "تم تعطيل الإضافة وإلغاء تنصيبها بنجاح.", "alert.suggest-error": "

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (%1): %2
", "alert.package-manager-unreachable": "

NodeBB could not reach the package manager, an upgrade is not suggested at this time.

", "alert.incompatible": "

Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.

", "alert.possibly-incompatible": "

No Compatibility Information Found

This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.

In the event that NodeBB cannot boot properly:

$ ./nodebb reset plugin=\"%1\"

Continue installation of latest version of this plugin?

", - "license.title": "Plugin License Information", + "license.title": "معلومات ترخيص الإضافة", "license.intro": "The plugin %1 is licensed under the %2. Please read and understand the license terms prior to activating this plugin.", - "license.cta": "Do you wish to continue with activating this plugin?" + "license.cta": "هل ترغب بالاستمرار في تفعيل هذه الإضافة؟" } diff --git a/public/language/ar/admin/general/dashboard.json b/public/language/ar/admin/general/dashboard.json index 9f1c6d8a4e..e9fd0fddec 100644 --- a/public/language/ar/admin/general/dashboard.json +++ b/public/language/ar/admin/general/dashboard.json @@ -1,69 +1,69 @@ { "forum-traffic": "Forum Traffic", - "page-views": "Page Views", - "unique-visitors": "Unique Visitors", - "users": "Users", - "posts": "Posts", - "topics": "Topics", - "page-views-seven": "Last 7 Days", - "page-views-thirty": "Last 30 Days", - "page-views-last-day": "Last 24 hours", - "page-views-custom": "Custom Date Range", - "page-views-custom-start": "Range Start", - "page-views-custom-end": "Range End", - "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", - "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", + "page-views": "مشاهدات الصفحات", + "unique-visitors": "زائرين فريدين", + "users": "أعضاء", + "posts": "مشاركات", + "topics": "مواضيع", + "page-views-seven": "آخر 7 ايام", + "page-views-thirty": "آخر 30 يوماً", + "page-views-last-day": "آخر 24 ساعة", + "page-views-custom": "مدة زمنية مخصصة", + "page-views-custom-start": "بداية المدة", + "page-views-custom-end": "نهاية المده", + "page-views-custom-help": "أدخل نطاقا زمنيا لمرات مشاهدة الصفحات التي ترغب في عرضها. إذا لم يظهر منتقي التاريخ، فإن التنسيق المقبول هو YYYY-MM-DD", + "page-views-custom-error": "الرجاء إدخال نطاق تاريخ صالح بالتنسيق YYYY-MM-DD", - "stats.day": "Day", - "stats.week": "Week", - "stats.month": "Month", - "stats.all": "All Time", + "stats.day": "يوم", + "stats.week": "إسبوع", + "stats.month": "شهر", + "stats.all": "كل الوقت", - "updates": "Updates", - "running-version": "You are running NodeBB v%1.", - "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", - "up-to-date": "

You are up-to-date

", - "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", - "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", - "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", - "running-in-development": "Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.", + "updates": "تحديثات", + "running-version": "المنتدى يعمل حاليا على NodeBB الإصدار%1.", + "keep-updated": "تأكد دائما من أن NodeBB يعمل على احدث إصدار للحصول على أحدث التصحيحات الأمنية وإصلاحات الأخطاء.", + "up-to-date": "

المنتدى يعمل على أحدث إصدار

", + "upgrade-available": "

نسخة جديدة (الإصدار %1) تم إصدارها. خذ بعين الاعتبار ترقية NodeBB الخاص بك.

", + "prerelease-upgrade-available": "

نسخة ما قبل الإصدار من NodeBB هذه قديمة. إصدار أحدث (الإصدار %1) تم إصداره. خذ بعين الاعتبار ترقية NodeBB الخاص بك.

", + "prerelease-warning": "

هذه نسخة ماقبل الإصدار من NodeBB. قد تحدث أخطاء غير مقصودة.

", + "running-in-development": "المنتدى قيد التشغيل في وضع \"المطورين\". وقد تكون هناك ثغرات أمنية مفتوحة؛ من فضلك تواصل مع مسؤول نظامك.", - "notices": "Notices", - "restart-not-required": "Restart not required", - "restart-required": "Restart required", - "search-plugin-installed": "Search Plugin installed", - "search-plugin-not-installed": "Search Plugin not installed", - "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", + "notices": "إشعارات", + "restart-not-required": "إعادة التشغيل غير مطلوب", + "restart-required": "إعادة التشغيل مطلوبة", + "search-plugin-installed": "إضافة البحث منصبة", + "search-plugin-not-installed": "إضافة البحث غير منصبة", + "search-plugin-tooltip": "نصب إضافة البحث من صفحة الإضافات البرمجية لتنشيط وظيفة البحث", - "control-panel": "System Control", - "reload": "Reload", - "restart": "Restart", - "restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.", - "maintenance-mode": "Maintenance Mode", - "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", - "realtime-chart-updates": "Realtime Chart Updates", + "control-panel": "التحكم بالنظام", + "reload": "إعادة تحمبل", + "restart": "إعادة تشغيل", + "restart-warning": "إعادة تحميل او تشغيل NodeBB سوف يؤدي لقطع جميع الإتصالات لبضع ثواني.", + "maintenance-mode": "وضع الصيانة", + "maintenance-mode-title": "انقر هنا لإعداد وضع الصيانة لـNodeBB", + "realtime-chart-updates": "التحديث الفوري للرسم البياني", - "active-users": "Active Users", - "active-users.users": "Users", - "active-users.guests": "Guests", - "active-users.total": "Total", + "active-users": "المستخدمين النشطين", + "active-users.users": "الأعضاء", + "active-users.guests": "الزوار", + "active-users.total": "المجموع", "active-users.connections": "Connections", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "المجهولين مقابل المستخدمين المسجلين", + "anonymous": "مجهول", + "registered": "مسجل", - "user-presence": "User Presence", - "on-categories": "On categories list", - "reading-posts": "Reading posts", - "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "user-presence": "تواجد المستخدمين", + "on-categories": "في قائمة الأقسام", + "reading-posts": "قراءة المشاركات", + "browsing-topics": "تصفح المواضيع", + "recent": "الأخيرة", + "unread": "غير مقروء", - "high-presence-topics": "High Presence Topics", + "high-presence-topics": "مواضيع ذات حضور قوي", - "graphs.page-views": "Page Views", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users" + "graphs.page-views": "مشاهدات الصفحة", + "graphs.unique-visitors": "زوار فريدين", + "graphs.registered-users": "مستخدمين مسجلين", + "graphs.anonymous-users": "مستخدمين مجهولين" } diff --git a/public/language/ar/admin/general/languages.json b/public/language/ar/admin/general/languages.json index bdd57849b3..581e028ade 100644 --- a/public/language/ar/admin/general/languages.json +++ b/public/language/ar/admin/general/languages.json @@ -1,6 +1,6 @@ { - "language-settings": "Language Settings", - "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language", - "auto-detect": "Auto Detect Language Setting for Guests" + "language-settings": "اعدادات اللغة", + "description": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى.
يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.", + "default-language": "اللغة الافتراضية", + "auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي" } \ No newline at end of file diff --git a/public/language/ar/admin/settings/uploads.json b/public/language/ar/admin/settings/uploads.json index a458870354..50fc299283 100644 --- a/public/language/ar/admin/settings/uploads.json +++ b/public/language/ar/admin/settings/uploads.json @@ -1,28 +1,28 @@ { - "posts": "Posts", - "allow-files": "Allow users to upload regular files", - "private": "Make uploaded files private", - "max-image-width": "Resize images down to specified width (in pixels)", - "max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", - "max-file-size": "Maximum File Size (in KiB)", - "max-file-size-help": "(in kibibytes, default: 2048 KiB)", - "allow-topic-thumbnails": "Allow users to upload topic thumbnails", - "topic-thumb-size": "Topic Thumb Size", - "allowed-file-extensions": "Allowed File Extensions", - "allowed-file-extensions-help": "Enter comma-separated list of file extensions here (e.g. pdf,xls,doc). An empty list means all extensions are allowed.", - "profile-avatars": "Profile Avatars", - "allow-profile-image-uploads": "Allow users to upload profile images", - "convert-profile-image-png": "Convert profile image uploads to PNG", - "default-avatar": "Custom Default Avatar", - "upload": "Upload", - "profile-image-dimension": "Profile Image Dimension", - "profile-image-dimension-help": "(in pixels, default: 128 pixels)", - "max-profile-image-size": "Maximum Profile Image File Size", - "max-profile-image-size-help": "(in kibibytes, default: 256 KiB)", - "max-cover-image-size": "Maximum Cover Image File Size", - "max-cover-image-size-help": "(in kibibytes, default: 2,048 KiB)", - "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", - "profile-covers": "Profile Covers", - "default-covers": "Default Cover Images", - "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" + "posts": "المشاركات", + "allow-files": "السماح للأعضاء بتحميل الملفات الإعتيادية", + "private": "جعل الملفات التي تم رفعها خاصة", + "max-image-width": "تغيير حجم الصور إلى عرض محدد (بالبكسل)", + "max-image-width-help": "(بالبكسل، الافتراضي: 760 بكسل، ضع إلى 0 لتعطيل الخاصية)", + "max-file-size": "الحد الأقصى لحجم الملف (بالكيبيبايت)", + "max-file-size-help": "(بالكيبيبايت، الافتراضي: 2048)", + "allow-topic-thumbnails": "السماح للاعضاء برفع الصور المصغرة للموضوع", + "topic-thumb-size": "حجم الصورة المصغرة للموضوع", + "allowed-file-extensions": "إمتدادات الملفات المسموح بها", + "allowed-file-extensions-help": "أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: pdf,xls,doc). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.", + "profile-avatars": "الصورة الرمزية للملف الشخصي", + "allow-profile-image-uploads": "السماح للأعضاء برفع الصور الرمزية", + "convert-profile-image-png": "تحويل إمتداد الصور الرمزية المرفوعه الى PNG", + "default-avatar": "الصورة الرمزية الافتراضية", + "upload": "رفع", + "profile-image-dimension": "أبعاد الصورة الرمزية", + "profile-image-dimension-help": "(بالبكسل، الافتراضي: 128 بكسل)", + "max-profile-image-size": "الحد الأقصى لحجم الصورة الرمزية", + "max-profile-image-size-help": "(بالكيبيبايت، الافتراضي: 256)", + "max-cover-image-size": "الحد الأقصى لحجم صورة الغلاف", + "max-cover-image-size-help": "(بالكيبيبايت، الافتراضي: 2,048)", + "keep-all-user-images": "الاحتفاظ بالنسخ القديمة من الصور الرمزية وصور الغلاف في السيرفر", + "profile-covers": "غلاف الملف الشخصي", + "default-covers": "صورة الغلاف الافتراضية", + "default-covers-help": "اضف صور الغلاف الافتراضية متبوعة بفواصل لاستخدامها في الحسابات التي لا تحتوي على صور غلاف مرفوعة" } diff --git a/public/language/ar/admin/settings/user.json b/public/language/ar/admin/settings/user.json index cbdd4ee91c..3d53253014 100644 --- a/public/language/ar/admin/settings/user.json +++ b/public/language/ar/admin/settings/user.json @@ -1,57 +1,57 @@ { - "authentication": "Authentication", - "allow-local-login": "Allow local login", - "require-email-confirmation": "Require Email Confirmation", - "email-confirm-interval": "User may not resend a confirmation email until", - "email-confirm-email2": "minutes have elapsed", - "allow-login-with": "Allow login with", - "allow-login-with.username-email": "Username or Email", - "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", - "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", - "hide-fullname": "Hide fullname from users", - "hide-email": "Hide email from users", - "themes": "Themes", - "disable-user-skins": "Prevent users from choosing a custom skin", - "account-protection": "Account Protection", - "admin-relogin-duration": "Admin relogin duration (minutes)", - "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", - "login-attempts": "Login attempts per hour", - "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", - "lockout-duration": "Account Lockout Duration (minutes)", - "login-days": "Days to remember user login sessions", - "password-expiry-days": "Force password reset after a set number of days", - "registration": "User Registration", - "registration-type": "Registration Type", - "registration-type.normal": "Normal", - "registration-type.admin-approval": "Admin Approval", - "registration-type.admin-approval-ip": "Admin Approval for IPs", - "registration-type.invite-only": "Invite Only", - "registration-type.admin-invite-only": "Admin Invite Only", - "registration-type.disabled": "No registration", - "registration-type.help": "Normal - Users can register from the /register page.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", - "registration.max-invites": "Maximum Invitations per User", - "max-invites": "Maximum Invitations per User", - "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", - "invite-expiration": "Invite expiration", - "invite-expiration-help": "# of days invitations expire in.", - "min-username-length": "Minimum Username Length", - "max-username-length": "Maximum Username Length", - "min-password-length": "Minimum Password Length", - "min-password-strength": "Minimum Password Strength", - "max-about-me-length": "Maximum About Me Length", - "terms-of-use": "Forum Terms of Use (Leave blank to disable)", - "user-search": "User Search", - "user-search-results-per-page": "Number of results to display", - "default-user-settings": "Default User Settings", - "show-email": "Show email", - "show-fullname": "Show fullname", - "restrict-chat": "Only allow chat messages from users I follow", + "authentication": "المصادقة", + "allow-local-login": "السماح بتسجيل الدخول المحلي", + "require-email-confirmation": "يطلب تأكيد البريد الإلكتروني", + "email-confirm-interval": "لا يمكن للمستخدم إعادة إرسال رسالة تأكيد البريد الالكتروني حتى مرور", + "email-confirm-email2": "دقائق", + "allow-login-with": "السماح بتسجيل الدخول باستخدام", + "allow-login-with.username-email": "اسم المستخدم أو البريد الالكتروني", + "allow-login-with.username": "اسم المستخدم فقط", + "allow-login-with.email": "البريد الالكتروني فقط", + "account-settings": "إعدادت الحساب", + "disable-username-changes": "عدم السماح بتغيير اسم المستخدم", + "disable-email-changes": "عدم السماح بتغيير البريد الالكتروني", + "disable-password-changes": "عدم السماح بتغيير كلمة المرور", + "allow-account-deletion": "السماح بحذف الحساب", + "user-info-private": "إخفاء قائمة المستخدم والبيانات عن الزوار", + "hide-fullname": "إخفاء الإسم الكامل عن المستخدمين", + "hide-email": "إخفاء البريد الإلكتروني عن المستخدمين", + "themes": "القوالب", + "disable-user-skins": "منع المستخدمين من اختيار سمة مخصص", + "account-protection": "حماية الحساب", + "admin-relogin-duration": "المدة حتى طلب إعادة تسجيل الدخول للإدارة (دقائق)", + "admin-relogin-duration-help": "بعد مرور وقت معين، يتوجب إعادة تسجيل الدخول للوصول إلى قسم الإدارة، قم بتعيين القيمة الى 0 لتعطيل الخيار", + "login-attempts": "عدد محاولات تسجيل الدخول في الساعة", + "login-attempts-help": "إذا تجاوزت محاولات تسجيل الدخول لمستخدم معين العدد المحدد، فسوف يتم تأمين الحساب ومنعه من الدخول لمدة من الوقت", + "lockout-duration": "مدة تأمين الحساب (دقائق)", + "login-days": "عدد الأيام لتذكر جلسات تسجيل دخول المستخدم", + "password-expiry-days": "فرض عملية تغيير كلمة المرور بعد مرور عدد محدد من الأيام", + "registration": "تسجيل المستخدم", + "registration-type": "نوع التسجيل", + "registration-type.normal": "عادي", + "registration-type.admin-approval": "بموافقة الإدارة", + "registration-type.admin-approval-ip": "بموافقة الإدارة لعناوين IP", + "registration-type.invite-only": "بالدعوات فقط", + "registration-type.admin-invite-only": "بالدعوات من قبل الإدارة فقط", + "registration-type.disabled": "لا يوجد تسجيل", + "registration-type.help": "عادي - بإمكان المستخدمين التسجيل من خلال صفحة /التسجيل.
\nبموافقة الإدارة - يتم وضع قائمة تسجيلات المستخدمين في قائمة إنتظار موافقة الإدارة.
\nبموافقة الإدارة لعناوين IP - عادي بالنسبة للمستخدمين الجدد، ويتطلب موافقة الإدارة للتسجيل من عناوين IP تم التسجيل بإستخدامها مسبقاً.
\nبالدعوات فقط - بإمكان المستخدمين إرسال دعوات من خلال صفحة الأعضاء.
\nبالدعوات من قبل الإدارة فقط - فقط المراء بإمكانهم إرسال الدعوات من خلال صفحة الأعضاء و صفحات الإدارة/المشرفين/الأعضاء.
\nلا يوجد تسجيل - إغلاق خيار التسجيل بالكامل.
", + "registration.max-invites": "الحد الأقصى للدعوات لكل عضو", + "max-invites": "الحد الأقصى للدعوات لكل عضو", + "max-invites-help": "0 لعدم تحديد قيود، الإدارة تحصل على دعوات لامحدودة
هذا الخيار يعمل فقط عند تحديد خيار \"بالدعوات فقط\"", + "invite-expiration": "مدة صلاحية الدعوة", + "invite-expiration-help": "عدد الأيام حتى انتهاء صلاحية الدعوة.", + "min-username-length": "الحد الأدنى لطول اسم المستخدم", + "max-username-length": "الحد الأقصى لطول اسم المستخدم", + "min-password-length": "الحد الأدنى لطول كلمة المرور", + "min-password-strength": "الحد الأدنى لقوة كلمة المرور", + "max-about-me-length": "الحد الأعلى من الأحرف في حقل \"عني\"", + "terms-of-use": "شروط استخدام المنتدى (تترك فارغة لتعطيلها)", + "user-search": "بحث الأعضاء", + "user-search-results-per-page": "عدد النتائج المراد عرضها", + "default-user-settings": "إعدادات الأعضاء الافتراضية", + "show-email": "عرض البريد الإلكتروني", + "show-fullname": "عرض الاسم الكامل", + "restrict-chat": "السماح فقط برسائل الدردشة من المستخدمين الذين أتبعهم", "outgoing-new-tab": "Open outgoing links in new tab", "topic-search": "Enable In-Topic Searching", "digest-freq": "Subscribe to Digest", diff --git a/public/language/ar/category.json b/public/language/ar/category.json index 6f61d752c6..6c86d47b03 100644 --- a/public/language/ar/category.json +++ b/public/language/ar/category.json @@ -1,20 +1,20 @@ { - "category": "فئة", - "subcategories": "فئة فرعية", + "category": "قسم", + "subcategories": "قسم فرعي", "new_topic_button": "موضوع جديد", - "guest-login-post": "سجل بالدخول للرد", - "no_topics": "لا توجد مواضيع في هذه الفئةلم لا تحاول إنشاء موضوع؟
", + "guest-login-post": "سجل الدخول للمشاركة", + "no_topics": "لا توجد مواضيع في هذه القسملم لا تحاول إنشاء موضوع؟
", "browsing": "تصفح", "no_replies": "لم يرد أحد", "no_new_posts": "لا توجد مشاركات جديدة.", - "share_this_category": "انشر هذه الفئة", + "share_this_category": "شارك هذا القسم", "watch": "تابع", "ignore": "تجاهل", "watching": "متابع", "ignoring": "متجاهل", "watching.description": "أظهر المواضيع في غير مقروء", "ignoring.description": "لا تظهر المواضيع في غير مقروء", - "watch.message": "You are now watching updates from this category and all subcategories", - "ignore.message": "You are now ignoring updates from this category and all subcategories", - "watched-categories": "الفئات المتابعة" + "watch.message": "أنت الآن تتابع التحديثات من هذا القسم وجميع الأقسام الفرعية", + "ignore.message": "أنت الآن تتجاهل التحديثات من هذا القسم وجميع الأقسام الفرعية", + "watched-categories": "الأقسام المُتابعة" } \ No newline at end of file diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 43db636e38..56700c46ef 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -125,6 +125,7 @@ "parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم", "wrong-login-type-email": "الرجاء استعمال بريدك اﻹلكتروني للدخول", "wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "لقد قمت بدعوة الحد الأقصى من الأشخاص (%1 من %2)", "no-session-found": "لم دخول مسجل!", "not-in-room": "المستخدم غير موجود في الغرفة.", @@ -133,5 +134,6 @@ "no-users-selected": "لا يوجد مستخدم محدد.", "invalid-home-page-route": "Invalid home page route", "invalid-session": "Session Mismatch", - "invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة." + "invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/ar/global.json b/public/language/ar/global.json index 73e23bfb28..97f55f0500 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -4,7 +4,7 @@ "buttons.close": "أغلق", "403.title": "غير مسموح بالدخول", "403.message": "يبدو أنك قد تعثرت على صفحة لا تمتلك الصلاحية للدخول إليها", - "403.login": "حاول أن تسجل دخولك.", + "403.login": "ربما يجب عليك تسجل دخولك.", "404.title": "لم يتم العثور", "404.message": "الصفحة غير موجودة. العودة لـ الرئيسية", "500.title": "خطأ داخلي", @@ -13,19 +13,19 @@ "400.message": "الرابط غير صحيح. رجاءًا تأكد من الرابط أو ارجع لـ الرئيسية", "register": "تسجيل", "login": "دخول", - "please_log_in": "المرجو تسجيل الدخول", + "please_log_in": "الرجاء تسجيل الدخول", "logout": "تسجيل الخروج", "posting_restriction_info": "إضافة مشاركات جديد حكر على الأعضاء المسجلين، انقر هنا لتسجيل الدخول.", "welcome_back": "مرحبًا بعودتك", "you_have_successfully_logged_in": "تم سجيل الدخول بنجاح", "save_changes": "حفظ التغييرات", - "save": "Save", + "save": "حفظ", "close": "أغلق", "pagination": "الصفحات", "pagination.out_of": "%1 من %2", "pagination.enter_index": "أدخل الرقم التسلسلي", - "header.admin": "مدبر نظام", - "header.categories": "الفئات", + "header.admin": "مدير النظام", + "header.categories": "الأقسام", "header.recent": "حديث", "header.unread": "غير مقروء", "header.tags": "وسم", @@ -37,9 +37,9 @@ "header.search": "بحث", "header.profile": "ملف", "header.navigation": "الاستكشاف", - "notifications.loading": "تحميل التبليغات", + "notifications.loading": "تحميل التنبيهات", "chats.loading": "تحميل الدردشات", - "motd.welcome": "مرحبا بكم NodeBB، منصة مناقشة المستقبل", + "motd.welcome": "مرحبا بكم في NodeBB، منصة المناقشة المستقبلية.", "previouspage": "الصفحة السابقة", "nextpage": "الصفحة التالية", "alert.success": "نجاح", @@ -75,7 +75,7 @@ "norecenttopics": "لاوجود لمواضيع جديدة", "recentposts": "آخر المشاركات", "recentips": "آخر عناوين ال IP التي سجلت الدخول", - "moderator_tools": "Moderator Tools", + "moderator_tools": "أدوات المشرف", "away": "غير متواجد", "dnd": "عدم الإزعاج", "invisible": "مخفي", @@ -85,7 +85,7 @@ "guest": "زائر", "guests": "الزوار", "updated.title": "تم تحديث المنتدى", - "updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. المرجو إعادة تحميل الصفحة.", + "updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. إضغط هنا لإعادة تحميل الصفحة.", "privacy": "الخصوصية", "follow": "متابعة", "unfollow": "إلغاء المتابعة", @@ -97,13 +97,13 @@ "upload_file": "ارفع ملف", "upload": "ارفع", "allowed-file-types": "صيغ الملفات المدعومة هي 1%", - "unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من تغيير الصفحة؟", + "unsaved-changes": "لديك تغييرات لم تحفظ. هل أنت متأكد من رغبتك بمغادرة الصفحة؟", "reconnecting-message": "يبدو أن اتصالك لـ %1 قد فقد. رجاءًا أنتظر ثم حاول الإتصال مرة اخرى.", - "play": "Play", - "cookies.message": "This website uses cookies to ensure you get the best experience on our website.", - "cookies.accept": "Got it!", - "cookies.learn_more": "Learn More", - "edited": "Edited", - "disabled": "Disabled", - "select": "Select" + "play": "تشغيل", + "cookies.message": "هذا الموقع يستخدم ملفات تعريف الارتباط لضمان حصولك على أفضل تجربة على موقعنا.", + "cookies.accept": "فهمت الأمر!", + "cookies.learn_more": "أعرف المزيد", + "edited": "حُرِر", + "disabled": "معطل", + "select": "تحديد" } \ No newline at end of file diff --git a/public/language/ar/login.json b/public/language/ar/login.json index 60bf2773af..5a7d602a0d 100644 --- a/public/language/ar/login.json +++ b/public/language/ar/login.json @@ -5,8 +5,8 @@ "remember_me": "تذكرني؟", "forgot_password": "نسيت كلمة المرور؟", "alternative_logins": "تسجيلات الدخول البديلة", - "failed_login_attempt": "Login Unsuccessful", + "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/ar/register.json b/public/language/ar/register.json index c6ccf2231e..9fe1af535c 100644 --- a/public/language/ar/register.json +++ b/public/language/ar/register.json @@ -2,8 +2,8 @@ "register": "تسجيل", "cancel_registration": "إلغاء التسجيل", "help.email": "افتراضيا، سيتم إخفاء بريدك الإلكتروني من العامة.", - "help.username_restrictions": "اسم مستخدم فريدة من نوعها بين1% و2% حرفا. يمكن للآخرين ذكرك @ <'span id='your-username> اسم المستخدم .", - "help.minimum_password_length": "كلمة المرور يجب أن تكون على الأقل بها 1% أحرف", + "help.username_restrictions": "اسم مستخدم فريدة من نوعها بين 1% و 2% حرفا. بإمكان الآخرين مناداتك بـ @اسم المستخدم.", + "help.minimum_password_length": "كلمة المرور يجب أن تتكون على الأقل من 1% أحرف/حروف", "email_address": "عنوان البريد الإلكتروني", "email_address_placeholder": "ادخل عنوان البريد الإلكتروني", "username": "اسم المستخدم", @@ -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", - "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", - "interstitial.intro": "We require some additional information before we can create your account.", - "interstitial.errors-found": "We could not complete your registration:" + "terms_of_use_error": "يجب عليك الموافقة على شروط الاستخدام", + "registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.", + "interstitial.intro": "نحتاج إلى بعض المعلومات الإضافية قبل أن نتمكن من إنشاء حسابك.", + "interstitial.errors-found": "تعذر علينا إتمام عملية التسجيل:" } \ No newline at end of file diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 4a5c8789b0..851e10c292 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "هل أنت متأكد أنك تريد استعادة هذا الموضوع؟", "thread_tools.purge": "تطهير الموضوع", "thread_tools.purge_confirm": "هل أنت متأكد أنك تريد تطهير هذا الموضوع؟", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "تم نقل هذا الموضوع إلى %1 بنجاح", "post_delete_confirm": "هل أنت متأكد أنك تريد حذف هذه المشاركة؟", "post_restore_confirm": "هل أنت متأكد أنك تريد استعادة هذه المشاركة؟", @@ -89,6 +91,7 @@ "fork_pid_count": "1% مشاركة محددة", "fork_success": "تم إنشاء فرع للموضوع بنجاح! إضغط هنا لمعاينة الفرع.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "أدخل عنوان موضوعك هنا...", "composer.handle_placeholder": "اﻹسم", "composer.discard": "نبذ التغييرات", diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 22372e4733..76b908b909 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -7,13 +7,13 @@ "email": "البريد الإلكتروني", "confirm_email": "تأكيد عنوان البريد الإلكتروني", "account_info": "معلومات الحساب", - "ban_account": "Ban Account", + "ban_account": "حظر الحساب", "ban_account_confirm": "هل تريد حقاً حظر هاذا العضو؟", - "unban_account": "Unban Account", + "unban_account": "إزالة حظر الحساب", "delete_account": "حذف الحساب", "delete_account_confirm": "هل أن متأكد أنك تريد حذف حسابك؟
هذه العملية غير قابلة للإلغاء ولن يكون بالإمكان استعادة بياناتك

أدخل اسم المستخدم الخاص بك لتأكيد عملية الحذف", - "delete_this_account_confirm": "Are you sure you want to delete this account?
This action is irreversible and you will not be able to recover any data

", - "account-deleted": "Account deleted", + "delete_this_account_confirm": "هل انت متأكد من رغبتك بحذف هذا الحساب؟
هذا الإجراء لا رجعة فيه ولن تتمكن من استرداد أي بيانات

", + "account-deleted": "تم حذف الحساب", "fullname": "الاسم الكامل", "website": "الموقع الإلكتروني", "location": "الموقع", @@ -25,15 +25,15 @@ "reputation": "السمعة", "bookmarks": "Bookmarks", "watched": "متابع", - "ignored": "Ignored", + "ignored": "تم تجاهله", "followers": "المتابعون", "following": "يتابع", "aboutme": "معلومة عنك او السيرة الذاتية", "signature": "توقيع", "birthday": "عيد ميلاد", "chat": "محادثة", - "chat_with": "Continue chat with %1", - "new_chat_with": "Start new chat with %1", + "chat_with": "متابعة الدردشة مع %1", + "new_chat_with": "بدء دردشة جديدة مع %1", "flag-profile": "Flag Profile", "follow": "تابع", "unfollow": "إلغاء المتابعة", @@ -44,7 +44,7 @@ "change_email": "تغيير البريد اﻹلكتروني", "edit": "تعديل", "edit-profile": "تعديل الملف الشخصي", - "default_picture": "Default Icon", + "default_picture": "أيقونة افتراضية", "uploaded_picture": "الصورة المرفوعة", "upload_new_picture": "رفع صورة جديدة", "upload_new_picture_from_url": "رفع صورة جديدة من رابط", @@ -58,17 +58,17 @@ "change_password_success": "تم تحديث كلمة السر خاصتك.", "confirm_password": "تأكيد كلمة السر", "password": "كلمة السر", - "username_taken_workaround": "اسم المستخدم الذي اخترته سبق أخذه، لذا تم تغييره قليلا. أن الآن مسجل تحت الاسم %1", - "password_same_as_username": "Your password is the same as your username, please select another password.", - "password_same_as_email": "Your password is the same as your email, please select another password.", - "weak_password": "Weak password.", + "username_taken_workaround": "اسم المستخدم الذي اخترته مستخدم سابقا، لذلك قمنا بتغييره لك قليلا. أنت الآن مسجل بالاسم %1", + "password_same_as_username": "كلمة المرور مطابقة لاسم المستخدم الخاص بك، يرجى تحديد كلمة مرور أخرى.", + "password_same_as_email": "كلمة المرور مطابقة لبريدك الإلكتروني، يرجى تحديد كلمة مرور أخرى.", + "weak_password": "كلمة مرور ضعيفة.", "upload_picture": "ارفع الصورة", "upload_a_picture": "رفع صورة", - "remove_uploaded_picture": "Remove Uploaded Picture", - "upload_cover_picture": "Upload cover picture", - "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", - "crop_picture": "Crop picture", - "upload_cropped_picture": "Crop and upload", + "remove_uploaded_picture": "إزالة الصورة المرفوعة", + "upload_cover_picture": "رفع صورة الغلاف", + "remove_cover_picture_confirm": "هل تريد بالتأكيد إزالة صورة الغلاف؟", + "crop_picture": "إقتصاص الصورة", + "upload_cropped_picture": "إقتصاص ورفع", "settings": "خيارات", "show_email": "أظهر بريدي الإلكتروني", "show_fullname": "أظهر اسمي الكامل", @@ -80,66 +80,66 @@ "digest_weekly": "أسبوعيًّا", "digest_monthly": "شهريًّا", "settings-require-reload": "تغيير بعض اﻹعدادات يتطلب تحديث الصفحة. إضغط هنا لتحديث الصفحة", - "has_no_follower": "هذا المستخدم ليس لديه أي متابع :(", + "has_no_follower": "هذا المستخدم ليس لديه أية متابعين :(", "follows_no_one": "هذا المستخدم لا يتابع أحد :(", - "has_no_posts": "This user hasn't posted anything yet.", - "has_no_topics": "This user hasn't posted any topics yet.", - "has_no_watched_topics": "This user hasn't watched any topics yet.", - "has_no_ignored_topics": "This user hasn't ignored any topics yet.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_posts": "هذا المستخدم لم يشارك حتى الآن.", + "has_no_topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.", + "has_no_watched_topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.", + "has_no_ignored_topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.", + "has_no_upvoted_posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.", + "has_no_downvoted_posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.", + "has_no_voted_posts": "هذا المستخدم لا يمتلك اية مشاركات تم التصويت عليها", "email_hidden": "البريد الإلكتروني مخفي", "hidden": "مخفي", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "عرض المواضيع والردود موزعة على صفحات عوضاً عن التمرير اللانهائي.", "topics_per_page": "المواضيع في كل صفحة", "posts_per_page": "الردود في كل صفحة", - "max_items_per_page": "Maximum %1", + "max_items_per_page": "أقصى %1", "notification_sounds": "تشغيل صوت عند تلقي تنبيه", - "notifications_and_sounds": "Notifications & Sounds", - "incoming-message-sound": "Incoming message sound", - "outgoing-message-sound": "Outgoing message sound", - "notification-sound": "Notification sound", - "no-sound": "No sound", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "notifications_and_sounds": "التنبيهات والأصوات", + "incoming-message-sound": "صوت الرسالة الواردة", + "outgoing-message-sound": "صوت الرسائل الصادرة", + "notification-sound": "صوت التنبيهات", + "no-sound": "بدون صوت", + "upvote-notif-freq": "معدل تكرار تنبيهات التصويت للأعلى", + "upvote-notif-freq.all": "كل التصويتات للأعلى", + "upvote-notif-freq.everyTen": "كل عشر تصويتات للأعلى", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq.disabled": "معطل", "browsing": "خيارات التصفح", "open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة", "enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "delay_image_loading": "Delay Image Loading", - "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", + "topic_search_help": "إذا قمت بتفعيل ميزة البحث في-الموضوع، سيتم تجاوز الخيار الافتراضي للمتصفح مما يؤدي للبحث بكامل الموضوع بدلا عن البحث في الجزء الظاهر في الشاشة.", + "delay_image_loading": "تأخير عرض الصور", + "image_load_delay_help": "إذا تم تمكينه، فلن يتم تحميل الصور في المواضيع حتى يتم تمريرها في الشاشة", "scroll_to_my_post": "After posting a reply, show the new 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": "Select a Skin", - "select-homepage": "Select a Homepage", + "select-skin": "إختر سمة", + "select-homepage": "إختر الصفحة الرئيسية", "homepage": "الصفحة الرئيسية", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", - "sso.not-associated": "Click here to associate with", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", - "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.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given.", - "info.username-history": "Username History", - "info.email-history": "Email History", - "info.moderation-note": "Moderation Note", - "info.moderation-note.success": "Moderation note saved", - "info.moderation-note.add": "Add note" + "homepage_description": "حدد صفحة لاستخدامها كصفحة رئيسية للمنتدى أو \"لا شيء\" لاستخدام الصفحة الرئيسية الافتراضية.", + "custom_route": "مسار الصفحة الرئيسية المخصصة", + "custom_route_help": "أدخل اسم مسار هنا، بدون أي شرطة مائلة (على سبيل المثال \"حديثة\" أو \"شائعة\")", + "sso.title": "خدمات تسجيل الدخول الموحد", + "sso.associated": "مرتبط مع", + "sso.not-associated": "انقر هنا لربط مع", + "sso.dissociate": "فصل", + "sso.dissociate-confirm-title": "تأكيد الفصل", + "sso.dissociate-confirm": "هل تريد بالتأكيد فصل حسابك عن %1؟", + "info.latest-flags": "أحدث العلامات", + "info.no-flags": "لم يتم العثور على مشاركات معلمة", + "info.ban-history": "سجل الحظر الأحدث", + "info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا", + "info.banned-until": "محظور حتى %1", + "info.banned-permanently": "محظور بشكل دائم", + "info.banned-reason-label": "سبب", + "info.banned-no-reason": "لم يتم إعطاء سبب.", + "info.username-history": "سجل اسم المستخدم", + "info.email-history": "سجل البريد الإلكتروني", + "info.moderation-note": "ملاحظة الإشراف", + "info.moderation-note.success": "تم حفظ ملاحظة الإشراف", + "info.moderation-note.add": "إضافة ملاحظة" } \ No newline at end of file diff --git a/public/language/ar/users.json b/public/language/ar/users.json index 11a71a9341..eff3badb2a 100644 --- a/public/language/ar/users.json +++ b/public/language/ar/users.json @@ -10,12 +10,12 @@ "filter-by": "Filter By", "online-only": "المتصلون فقط", "invite": "دعوة", - "invitation-email-sent": "An invitation email has been sent to %1", + "invitation-email-sent": "تم إرسال دعوة بالبريد الإلكتروني إلى %1", "user_list": "قائمة اﻷعضاء", "recent_topics": "أحدث المواضيع", - "popular_topics": "Popular Topics", + "popular_topics": "المواضيع الأكثر شهرة", "unread_topics": "المواضيع الغير مقروءة", - "categories": "الفئات", - "tags": "الكلمات الدلالية", - "no-users-found": "No users found!" + "categories": "الأقسام", + "tags": "الوسوم", + "no-users-found": "لم يتم العثور على مستخدمين!" } \ No newline at end of file diff --git a/public/language/bg/error.json b/public/language/bg/error.json index f6a63b01c7..7612b0677a 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -125,6 +125,7 @@ "parse-error": "Нещо се обърка при прочитането на отговора на сървъра", "wrong-login-type-email": "Моля, използвайте е-пощата си, за да се впишете", "wrong-login-type-username": "Моля, използвайте потребителското си име, за да се впишете", + "sso-registration-disabled": "Регистрацията за акаунти от %1 беше забранена, моля, регистрирайте се първо с е-поща", "invite-maximum-met": "Вие сте поканили максимално позволения брой хора (%1 от %2).", "no-session-found": "Няма намерена сесия на вписване!", "not-in-room": "Потребителят не е в стаята", @@ -133,5 +134,6 @@ "no-users-selected": "Няма избран(и) потребител(и)", "invalid-home-page-route": "Грешен път към началната страница", "invalid-session": "Несъответствие в сесията", - "invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла или не съответства на сървъра. Моля, опреснете страницата." + "invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла или не съответства на сървъра. Моля, опреснете страницата.", + "no-topics-selected": "Няма избрани теми!" } \ No newline at end of file diff --git a/public/language/bg/topic.json b/public/language/bg/topic.json index fb7faaea2f..3e83e70b12 100644 --- a/public/language/bg/topic.json +++ b/public/language/bg/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Наистина ли искате да възстановите тази тема?", "thread_tools.purge": "Изчистване на темата", "thread_tools.purge_confirm": "Наистина ли искате да изчистите тази тема?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Темата беше преместена успешно в %1", "post_delete_confirm": "Наистина ли искате да изтриете тази публикация?", "post_restore_confirm": "Наистина ли искате да възстановите тази публикация?", @@ -89,6 +91,7 @@ "fork_pid_count": "Избрани публикации: %1", "fork_success": "Темата е разделена успешно! Натиснете тук, за да преминете към отделената тема.", "delete_posts_instruction": "Натиснете публикациите, които искате да изтриете/изчистите", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Въведете заглавието на темата си тук...", "composer.handle_placeholder": "Име", "composer.discard": "Отхвърляне", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index c3f8e6e12d..072039ee7c 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/bn/topic.json b/public/language/bn/topic.json index 46b6c48e0f..537b8a7200 100644 --- a/public/language/bn/topic.json +++ b/public/language/bn/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "আপনি নিশ্চিত যে আপনি টপিকটি পুনরূদ্ধার করতে চান?", "thread_tools.purge": "টপিক পার্জ করুন", "thread_tools.purge_confirm": "আপনি নিশ্চিত যে আপনি টপিকটি পার্জ করতে চাচ্ছেন ? ", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "টপিকটি %1 এ সরিয়ে নেয়া হয়েছে", "post_delete_confirm": "আপনি নিশ্চিত যে আপনি এই পোষ্টটি মুছে ফেলতে চান ?", "post_restore_confirm": "আপনি নিশ্চিত যে আপনি এই পোষ্টটি পুনরূূদ্ধার করতে চান ? ", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "টপিক ফর্ক করা হয়েছে। ফর্ক করা টপিকে যেতে এখানে ক্লিক করুন", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "আপনার টপিকের শিরোনাম দিন", "composer.handle_placeholder": "Name", "composer.discard": "বাতিল", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index eaf4f9e1ee..43ea641999 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -125,6 +125,7 @@ "parse-error": "Při analýze odpovědi serveru nastala chyba", "wrong-login-type-email": "Pro přihlášení použijte vaši e-mailovou adresu", "wrong-login-type-username": "Pro přihlášení použijte vaše uživatelské jméno", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Již jste pozval/a maximálně možný počet lidí (%1 z %2).", "no-session-found": "Nebyla nalezena relace s přihlášením.", "not-in-room": "Uživatel není přítomen v místnosti", @@ -133,5 +134,6 @@ "no-users-selected": "Žádný uživatel/é nebyl/y vybrán/i", "invalid-home-page-route": "Neplatná cesta k domovské stránkce", "invalid-session": "Nesoulad v relacích", - "invalid-session-text": "Zdá se, že vše relace s přihlášením již není aktivní nebo již neodpovídá s relací na serveru. Obnovte prosím tuto stránku." + "invalid-session-text": "Zdá se, že vše relace s přihlášením již není aktivní nebo již neodpovídá s relací na serveru. Obnovte prosím tuto stránku.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index c5ce32c134..7cedca5e24 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Jste si jist/a, že chcete toto téma obnovit?", "thread_tools.purge": "Vyčistit téma", "thread_tools.purge_confirm": "Jste si jist/a, že chcete vyčistit toto téma?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Toto téma bylo úspěšně přesunuto do %1", "post_delete_confirm": "Jste si jist/a, že chcete odstranit tento příspěvek?", "post_restore_confirm": "Jste si jist/a, že chcete obnovit tento příspěvek?", @@ -89,6 +91,7 @@ "fork_pid_count": "Vybráno %1 příspěvek/ů", "fork_success": "Téma úspěšně rozděleno. Pro přejití na rozdělené téma, zde klikněte.", "delete_posts_instruction": "Klikněte na příspěvek, který chcete odstranit/vyčistit", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Zadejte název tématu…", "composer.handle_placeholder": "Jméno", "composer.discard": "Zrušit", diff --git a/public/language/da/error.json b/public/language/da/error.json index 15b862fa43..889c7fbd99 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -125,6 +125,7 @@ "parse-error": "Noget gik galt under fortolknings er serverens respons", "wrong-login-type-email": "Brug venligt din email til login", "wrong-login-type-username": "Brug venligt dit brugernavn til login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Du har inviteret det maksimale antal personer (%1 ud af %2)", "no-session-found": "Ingen login session kan findes!", "not-in-room": "Bruger er ikke i rummet", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/da/topic.json b/public/language/da/topic.json index de6b087b5d..e1c7cf0501 100644 --- a/public/language/da/topic.json +++ b/public/language/da/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Er du sikker på at du ønsker at genoprette denne tråd?", "thread_tools.purge": "Udrader tråd", "thread_tools.purge_confirm": "Er du sikker på at du vil udrense denne tråd?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Denne tråd blev flyttet til %1", "post_delete_confirm": "Er du sikker på at du vil slette dette indlæg?", "post_restore_confirm": "Er du sikker på at du vil gendanne dette indlæg?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Tråden blev fraskilt! Klik her for at gå til den fraskilte tråd.", "delete_posts_instruction": "Klik på de indlæg du vil slette/rense", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Angiv din trådtittel her ...", "composer.handle_placeholder": "Navn", "composer.discard": "Fortryd", diff --git a/public/language/de/error.json b/public/language/de/error.json index 05b944a09b..36ab2d796f 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -125,6 +125,7 @@ "parse-error": "Beim auswerten der Serverantwort ist etwas schiefgegangen", "wrong-login-type-email": "Bitte nutze deine E-Mail-Adresse zum einloggen", "wrong-login-type-username": "Bitte nutze deinen Benutzernamen zum einloggen", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Du hast bereits die maximale Anzahl an Personen eingeladen (%1 von %2).", "no-session-found": "Keine Login-Sitzung gefunden!", "not-in-room": "Benutzer nicht im Raum", @@ -133,5 +134,6 @@ "no-users-selected": "Kein(e) Benutzer ausgewählt", "invalid-home-page-route": "Ungültiger Startseitenpfad", "invalid-session": "Sitzungsdiskrepanz", - "invalid-session-text": "Es scheint als wäre deine Login-Sitzung nicht mehr aktiv oder sie passt nicht mehr mit der des Servers. Bitte aktualisiere diese Seite." + "invalid-session-text": "Es scheint als wäre deine Login-Sitzung nicht mehr aktiv oder sie passt nicht mehr mit der des Servers. Bitte aktualisiere diese Seite.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 7793082abb..1505a77485 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Bist du sicher, dass du dieses Thema wiederherstellen möchtest?", "thread_tools.purge": "Thema endgültig löschen", "thread_tools.purge_confirm": "Bist du sicher, dass du dieses Thema endgültig löschen möchtest?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Thema wurde erfolgreich nach %1 verschoben.", "post_delete_confirm": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten?", "post_restore_confirm": "Sind Sie sicher, dass Sie diesen Beitrag wiederherstellen möchten?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 Beiträge ausgewählt", "fork_success": "Thema erfolgreich aufgespalten! Klicke hier, um zum abgespaltenen Thema zu gelangen.", "delete_posts_instruction": "Wähle die zu löschenden Beiträge aus", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Hier den Titel des Themas eingeben...", "composer.handle_placeholder": "Name", "composer.discard": "Verwerfen", diff --git a/public/language/el/error.json b/public/language/el/error.json index 270e782a28..f98812eeac 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/el/topic.json b/public/language/el/topic.json index b2e35c7484..61f1988f50 100644 --- a/public/language/el/topic.json +++ b/public/language/el/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Είσαι σίγουρος/η πως θέλεις να επαναφέρεις αυτό το θέμα;", "thread_tools.purge": "Εκκαθάριση Θέματος", "thread_tools.purge_confirm": "Είσαι σίγουρος/η πως θέλεις να εκκαθαρίσεις αυτό το θέμα;", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Το θέμα μετακινήθηκε στο %1 με επιτυχία", "post_delete_confirm": "Είσαι σίγουρος/η πως θέλεις να διαγράψεις αυτή την δημοσίευση;", "post_restore_confirm": "Είσαι σίγουρος/η πως θέλεις να επαναφέρεις αυτή την δημοσίευση;", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Εισαγωγή του τίτλου του θέματος εδώ...", "composer.handle_placeholder": "Name", "composer.discard": "Πέταγμα", diff --git a/public/language/en-GB/admin/general/homepage.json b/public/language/en-GB/admin/general/homepage.json index 4866b8baf6..7428d59eeb 100644 --- a/public/language/en-GB/admin/general/homepage.json +++ b/public/language/en-GB/admin/general/homepage.json @@ -3,5 +3,6 @@ "description": "Choose what page is shown when users navigate to the root URL of your forum.", "home-page-route": "Home Page Route", "custom-route": "Custom Route", - "allow-user-home-pages": "Allow User Home Pages" + "allow-user-home-pages": "Allow User Home Pages", + "home-page-title": "Title of the home page (default \"Home\")" } \ No newline at end of file diff --git a/public/language/en-GB/admin/settings/post.json b/public/language/en-GB/admin/settings/post.json index 7cef2f34a0..6a1ab9a2a5 100644 --- a/public/language/en-GB/admin/settings/post.json +++ b/public/language/en-GB/admin/settings/post.json @@ -6,21 +6,25 @@ "sorting.most-votes": "Most Votes", "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", + "length": "Post Length", "restrictions": "Posting Restrictions", + "restrictions-new": "New User Restrictions", "restrictions.post-queue": "Enable post queue", + "restrictions-new.post-queue": "Enable new user restrictions", "restrictions.post-queue-help": "Enabling post queue will put the posts of new users in a queue for approval.", - "restrictions.seconds-between": "Seconds between Posts", - "restrictions.seconds-between-new": "Seconds between Posts for New Users", - "restrictions.rep-threshold": "Reputation threshold before this restriction is lifted", + "restrictions-new.post-queue-help": "Enabling new user restrictions will set restrictions on posts created by new users.", + "restrictions.seconds-between": "Seconds between posts", + "restrictions.seconds-between-new": "Seconds between posts for new users", + "restrictions.rep-threshold": "Reputation threshold before these restrictions are lifted", "restrictions.seconds-defore-new": "Seconds before new user can post", - "restrictions.seconds-edit-after": "Number of seconds users are allowed to edit posts after posting. (0 disabled)", - "restrictions.seconds-delete-after": "Number of seconds users are allowed to delete posts after posting. (0 disabled)", + "restrictions.seconds-edit-after": "Number of seconds before users are allowed to edit posts after posting. (0 disabled)", + "restrictions.seconds-delete-after": "Number of seconds before users are allowed to delete posts after posting. (0 disabled)", "restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics. (0 disabled)", "restrictions.min-title-length": "Minimum Title Length", "restrictions.max-title-length": "Maximum Title Length", "restrictions.min-post-length": "Minimum Post Length", "restrictions.max-post-length": "Maximum Post Length", - "restrictions.days-until-stale": "Days until Topic is considered stale", + "restrictions.days-until-stale": "Days until topic is considered stale", "restrictions.stale-help": "If a topic is considered \"stale\", then a warning will be shown to users who attempt to reply to that topic.", "timestamp": "Timestamp", "timestamp.cut-off": "Date cut-off (in days)", diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index c336b8129e..66516bd3c5 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -152,6 +152,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", @@ -163,5 +164,7 @@ "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." + "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-topics-selected": "No topics selected!" } diff --git a/public/language/en-GB/topic.json b/public/language/en-GB/topic.json index d206960156..39d2811931 100644 --- a/public/language/en-GB/topic.json +++ b/public/language/en-GB/topic.json @@ -79,6 +79,8 @@ "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm" : "Are you sure you want to purge this topic?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "This topic has been successfully moved to %1", @@ -105,6 +107,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Enter your topic title here...", "composer.handle_placeholder": "Name", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index 904416d3fd..a986e97f0f 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/en-US/topic.json b/public/language/en-US/topic.json index 9c41963d50..2ba819ecdf 100644 --- a/public/language/en-US/topic.json +++ b/public/language/en-US/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Enter your topic title here...", "composer.handle_placeholder": "Name", "composer.discard": "Discard", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index 904416d3fd..a986e97f0f 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/en-x-pirate/topic.json b/public/language/en-x-pirate/topic.json index 9c41963d50..2ba819ecdf 100644 --- a/public/language/en-x-pirate/topic.json +++ b/public/language/en-x-pirate/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Enter your topic title here...", "composer.handle_placeholder": "Name", "composer.discard": "Discard", diff --git a/public/language/es/error.json b/public/language/es/error.json index 4736caa77e..2bb7f77001 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -125,6 +125,7 @@ "parse-error": "Algo ha ido mal mientras se parseaba la respuesta del servidor", "wrong-login-type-email": "Por favor emplea tu email para acceder", "wrong-login-type-username": "Por favor introduce tu nombre de usuario para acceder", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Has alcanzado el número máximo de personas invitadas (%1 de %2).", "no-session-found": "¡No se ha encontrado ningún inicio de sesión!", "not-in-room": "El usuario no está en la sala", @@ -133,5 +134,6 @@ "no-users-selected": "Ningun usuario(s) seleccionado", "invalid-home-page-route": "Ruta de página de inicio invalida", "invalid-session": "No concuerdan los datos de sesión", - "invalid-session-text": "Parece que su sesión ha expirado o no concuerda con el servidor. Por favor vuelva a cargar la página." + "invalid-session-text": "Parece que su sesión ha expirado o no concuerda con el servidor. Por favor vuelva a cargar la página.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/es/topic.json b/public/language/es/topic.json index 50496a6106..7d3c75de23 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "¿Estás seguro que deseas restaurar este tema?", "thread_tools.purge": "Purgar tema", "thread_tools.purge_confirm": "¿Está seguro que desea eliminar definitivamente (purgar) este tema?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "El tema ha sido movido correctamente a %1", "post_delete_confirm": "¿Estás seguro de que quieres eliminar esta respuesta?", "post_restore_confirm": "¿Estás seguro de que quieres restaurar esta respuesta?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 mensaje(s) seleccionados", "fork_success": "¡Se ha creado un nuevo tema a partir del original! Haz click aquí para ir al nuevo tema.", "delete_posts_instruction": "Haz click en los mensajes que quieres eliminar/limpiar", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Ingresa el título de tu tema...", "composer.handle_placeholder": "Nombre", "composer.discard": "Descartar", diff --git a/public/language/et/error.json b/public/language/et/error.json index 8896f3d278..f3f6aee255 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -125,6 +125,7 @@ "parse-error": "Midagi läks valesti...", "wrong-login-type-email": "Sisse logimiseks kasuta oma emaili", "wrong-login-type-username": "Sisse logimiseks kasuta oma kasutajanime", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Sa oled kutsunud maksimaalse lubatud inimeste arvu (%1 %2 'st).", "no-session-found": "Sisse logimis sessiooni ei leitud!", "not-in-room": "Kasutaja pole ruumis", @@ -133,5 +134,6 @@ "no-users-selected": "Ühtki kasutajat pole valitud", "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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/et/topic.json b/public/language/et/topic.json index ce17ec70e0..90f8a84493 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Oled kindel, et soovid selle teema taastada?", "thread_tools.purge": "Kustuta teema täielikult", "thread_tools.purge_confirm": "Oled kindel, et soovid puhastada selle teema?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Teema liigutatud kategooriasse %1", "post_delete_confirm": "Oled kindel, et soovid kustutada selle postituse?", "post_restore_confirm": "Oled kindel, et soovid taastada antud postituse?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 postitus(t) valitud", "fork_success": "Edukalt ''forkisid'' teema! Vajuta siia, et vaadata loodud teemat.", "delete_posts_instruction": "Klikka postitustel, mida tahad kustutada/puhastada", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Sisesta teema pealkiri siia...", "composer.handle_placeholder": "Nimi", "composer.discard": "Katkesta", diff --git a/public/language/fa-IR/email.json b/public/language/fa-IR/email.json index e878af6684..bb32850ecb 100644 --- a/public/language/fa-IR/email.json +++ b/public/language/fa-IR/email.json @@ -30,7 +30,7 @@ "notif.chat.unsub.info": "این اطلاعیه ی چتیی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", "notif.post.cta": "برای مشاهده کامل موضوع اینجا کلیک کنید", "notif.post.unsub.info": "این اطلاعیه ی پستی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", - "notif.cta": "Click here to go to forum", + "notif.cta": "برای رفتن به انجمن اینجا کلیک کنید", "test.text1": "این یک ایمیل امتحانی جهت تایید اینکه فرستنده ایمیل برای انجمن NodeBB شما به درستی تنظیم و نصب شده است", "unsub.cta": "برای ویرایش آن تنظیمات اینجا کلیک کنید", "banned.subject": "You have been banned from %1", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index b3ed9bf571..29b36ecae9 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -125,6 +125,7 @@ "parse-error": "هنگام تجزیه پاسخ سرور اشتباهی پیش امد", "wrong-login-type-email": "لطفا از ایمیل خود برای ورود استفاده کنید", "wrong-login-type-username": "لطفا از نام کاربری خود برای ورود استفاده کنید", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "ظرفیت دعوت شما تکمیل شده است (%1 از %2)", "no-session-found": "هیچ session ورودی یافت نشد!", "not-in-room": "هیچ کاربری در این گفتگو نیست", @@ -133,5 +134,6 @@ "no-users-selected": "هیچ کاربر(های) انتخاب نشده", "invalid-home-page-route": "مسیر صفحه اصلی نامعتبر است", "invalid-session": "عدم تطابق جلسه", - "invalid-session-text": "به نظر می‌رسد این جلسه برای ورود دیگر فعال نیست و یا با سرور هماهنگ نیست. لطفا این صفحه را رفرش کنید." + "invalid-session-text": "به نظر می‌رسد این جلسه برای ورود دیگر فعال نیست و یا با سرور هماهنگ نیست. لطفا این صفحه را رفرش کنید.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index 7fc91aa517..b80e40669c 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -9,7 +9,7 @@ "continue_to": "ادامه به %1", "return_to": "بازگشت به %1", "new_notification": "آگاه‌سازی‌ تازه", - "new_notification_from": "You have a new Notification from %1", + "new_notification_from": "شما یک اعلان جدید از طرف %1 دارید", "you_have_unread_notifications": "شما آگاه‌سازی‌‌های نخوانده دارید.", "all": "همه", "topics": "موضوع ها", @@ -47,18 +47,18 @@ "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", "email-confirm-error-message": "خطایی در تایید آدرس ایمیل شما پیش آمده است. ممکن است کد نا‌معتبر و یا منقضی شده باشد.", "email-confirm-sent": "ایمیل تایید ارسال شد.", - "none": "None", - "notification_only": "Notification Only", - "email_only": "Email Only", - "notification_and_email": "Notification & Email", - "notificationType_upvote": "When someone upvotes your post", - "notificationType_new-topic": "When someone you follow posts a topic", - "notificationType_new-reply": "When a new reply is posted in a topic you are watching", - "notificationType_follow": "When someone starts following you", - "notificationType_new-chat": "When you receive a chat message", - "notificationType_group-invite": "When you receive a group invite", + "none": "هیچکدام", + "notification_only": "فقط اعلان", + "email_only": "فقط ایمیل", + "notification_and_email": "اعلان و ایمیل", + "notificationType_upvote": "هنگامی که شخصی به پست شما رای مثبت می دهد", + "notificationType_new-topic": "هنگامی که شخصی که شما فالو می کنید موضوعی ایجاد نماید", + "notificationType_new-reply": "هنگامی که پاسخ جدید در تاپیکی که شما پیگیری می کنید فرستاده می شود", + "notificationType_follow": "هنگامی که کسی شما را دنبال می کند", + "notificationType_new-chat": "هنگامی که شما پیام چتی دریافت می کنید", + "notificationType_group-invite": "هنگامی که شما دعوتنامه گروه دریافت می کنید", "notificationType_new-register": "When someone gets added to registration queue", - "notificationType_post-queue": "When a new post is queued", - "notificationType_new-post-flag": "When a post is flagged", - "notificationType_new-user-flag": "When a user is flagged" + "notificationType_post-queue": "هنگامی که یک پست جدید در صف قرار می گیرد", + "notificationType_new-post-flag": "هنگامی که پستی گزارش می شود", + "notificationType_new-user-flag": "هنگامی که کاربری گزارش می شود" } \ No newline at end of file diff --git a/public/language/fa-IR/pages.json b/public/language/fa-IR/pages.json index 015e37b1e6..6abf1de1bc 100644 --- a/public/language/fa-IR/pages.json +++ b/public/language/fa-IR/pages.json @@ -30,7 +30,7 @@ "chats": "چتها", "chat": "چت با %1", "flags": "گزارش ها", - "flag-details": "Flag %1 Details", + "flag-details": "جزئیات گزارش %1", "account/edit": "ویرایش \"%1\"", "account/edit/password": "ویرایش کلمه ی عبورِ \"%1\"", "account/edit/username": "ویرایش نام کاربریِ \"%1\"", @@ -44,7 +44,7 @@ "account/bookmarks": "%1 پست نشانک گذاری شده است", "account/settings": "تنظیمات کاربر", "account/watched": "موضوع های دیده شده توسط \"%1\"", - "account/ignored": "Topics ignored by %1", + "account/ignored": "تاپیک های نادیده گرفته شده توسط %1", "account/upvoted": "رای مثبت داده شده به پست ها توسط %1", "account/downvoted": "رای منفی داده شده به پست ها توسط %1", "account/best": "بهترین پست های ارسال شده توسط %1", diff --git a/public/language/fa-IR/topic.json b/public/language/fa-IR/topic.json index 6dec761e4f..3102da6b99 100644 --- a/public/language/fa-IR/topic.json +++ b/public/language/fa-IR/topic.json @@ -13,7 +13,7 @@ "notify_me": "از پاسخ‌های تازه در موضوع آگاه شوید", "quote": "نقل قول", "reply": "پاسخ", - "replies_to_this_post": "1 درصد انتخاب", + "replies_to_this_post": "%1 پاسخ ", "one_reply_to_this_post": "1 پاسخ", "last_reply_time": "آخرین پاسخ", "reply-as-topic": "پاسخ به موضوع", @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "آیا مطمئنید که می خواهید این موضوع را بازگردانی کنید؟", "thread_tools.purge": "پاک کردن موضوع", "thread_tools.purge_confirm": "آیا مطمئنید که میمید این موضوع را پاکسازی کنید؟", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "جابه‌جایی این موضوع به %1 باموفقیت انجام شد.", "post_delete_confirm": "آیا از پاک کردن این پست اطمینان دارید؟", "post_restore_confirm": "آیا از بازگردانی این پست اطمینان دارید؟", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 پست (ها) انتخاب شده اند", "fork_success": "موضوع با موفقیت منشعب شد! برای رفتن به موضوع انشعابی اینجا را کلیک کنید.", "delete_posts_instruction": "با کلیک بر روی پست شما می خواهید به حذف/پاکسازی", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "عنوان موضوعتان را اینجا بنویسید...", "composer.handle_placeholder": "نام", "composer.discard": "دور بیانداز", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 6b4eda750a..d79da5b654 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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": "Käyttäjä ei ole huoneessa", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index 84b298c455..96c9c894f7 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Haluatko varmasti palauttaa tämän aiheen?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Haluatko varmasti poistaa tämän viestin?", "post_restore_confirm": "Haluatko varmasti palauttaa tämän viestin?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Syötä aiheesi otsikko tähän...", "composer.handle_placeholder": "Name", "composer.discard": "Hylkää", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 81077980e2..ab5a0d0974 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -125,6 +125,7 @@ "parse-error": "Une erreur est survenue en analysant la réponse du serveur", "wrong-login-type-email": "Veuillez utiliser votre adresse email pour vous connecter", "wrong-login-type-username": "Veuillez utiliser votre identifiant pour vous connecter", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Vous avez invité la quantité maximale de personnes (%1 de %2).", "no-session-found": "Pas de session de connexion trouvé!", "not-in-room": "L'utilisateur n'est pas dans cette salle", @@ -133,5 +134,6 @@ "no-users-selected": "Aucun utilisateur sélectionné", "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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index 1c59ccba72..3cbcdfefe8 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Êtes-vous sûr de bien vouloir restaurer ce sujet ?", "thread_tools.purge": "Supprimer définitivement le(s) sujet(s)", "thread_tools.purge_confirm": "Êtes-vous sûr de bien vouloir supprimer définitivement ce sujet ?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Ce sujet a bien été déplacé vers %1.", "post_delete_confirm": "Êtes-vous sûr de bien vouloir supprimer ce message ?", "post_restore_confirm": "Êtes-vous sûr de bien vouloir restaurer ce message ?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 message(s) sélectionné(s)", "fork_success": "Sujet copié avec succès ! Cliquez ici pour aller au sujet copié.", "delete_posts_instruction": "Sélectionnez les messages que vous souhaitez supprimer/vider", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Entrer le titre du sujet ici…", "composer.handle_placeholder": "Nom", "composer.discard": "Abandonner", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 5284042e18..dc2579c4f5 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -125,6 +125,7 @@ "parse-error": "Algo foi mal namentras se agardaba a resposta do servidor", "wrong-login-type-email": "Por favor, emprega o teu correo para contectarte", "wrong-login-type-username": "Por favor, usa o teu nome de usuario para conectarte", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Convidaches á cantidade máxima de persoas (%1 de %2).", "no-session-found": "Non se atopou ningún inicio de sesión!", "not-in-room": "O usuario non se atopa nesta sala", @@ -133,5 +134,6 @@ "no-users-selected": "Ningún usuario seleccionado", "invalid-home-page-route": "Ruta de páxina de inicio inválida", "invalid-session": "Non concordan os datos da sesión", - "invalid-session-text": "Parece que a súa sesión expirou ou non concorda co servidor. Por favor, recarge a páxina." + "invalid-session-text": "Parece que a súa sesión expirou ou non concorda co servidor. Por favor, recarge a páxina.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index ace8074655..4752bf17ab 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Estás seguro de que desexas restaurar este tema?", "thread_tools.purge": "Purgar Tema", "thread_tools.purge_confirm": "Estás seguro de que desexas eliminar definitivamente (purgar) este tema?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Este tema foi movido correctamente a %1", "post_delete_confirm": "Estás seguro de que desexas eliminar esta publicación?", "post_restore_confirm": "Estás seguro de que desexas restaurar esta publicación?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 mensaxe(s) seleccionada(s)", "fork_success": "Creouse un novo tema a partir do orixinal! Fai clic aquí para ir ó novo tema.", "delete_posts_instruction": "Fai clic nas mensaxes que queres eliminar/limpar", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Introduce o título do teu tema", "composer.handle_placeholder": "Nome", "composer.discard": "Descartar", diff --git a/public/language/he/error.json b/public/language/he/error.json index 89e62a5fe2..c2cac88605 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -125,6 +125,7 @@ "parse-error": "אירעה שגיאה בעת בעת ניתוח תגובת השרת", "wrong-login-type-email": "בבקשה השתמש בכתובת המייל שלך להתחברות", "wrong-login-type-username": "בבקשה השתמש בשם המשתמש שלך להתחברות", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "הזמנת את הכמות המירבית של אנשים (%1 מתוך %2).", "no-session-found": "לא נמצאו סשני התחברות!", "not-in-room": "משתמש זה לא בצ'אט", @@ -133,5 +134,6 @@ "no-users-selected": "לא נבחרו משתמשים", "invalid-home-page-route": "כתובת דף הבית הינה שגויה", "invalid-session": "סשן לא תקין", - "invalid-session-text": "נראה שסשן ההתחברות שלך כבר לא פעיל. אנא טען מחדש את העמוד." + "invalid-session-text": "נראה שסשן ההתחברות שלך כבר לא פעיל. אנא טען מחדש את העמוד.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/he/topic.json b/public/language/he/topic.json index b9630978ea..e8d77f491c 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "אתה בטוח שאתה רוצה לשחזר את הנושא הזה?", "thread_tools.purge": "מחק נושא", "thread_tools.purge_confirm": "אתה בטוח שאתה רוצה למחוק את הנושא הזה?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "נושא זה הועבר בהצלחה ל %1", "post_delete_confirm": "אתה בטוח שאתה רוצה למחוק את הפוסט הזה?", "post_restore_confirm": "אתה בטוח שאתה רוצה לשחזר את הפוסט הזה?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "הפוסט שוכפל בהצלחה! לחץ כאן על מנת לעבור לפוסט המשוכפל.", "delete_posts_instruction": "לחץ על הפוסטים שברצונך למחוק", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "הכנס את כותרת הנושא כאן...", "composer.handle_placeholder": "שם", "composer.discard": "מחק", diff --git a/public/language/hr/error.json b/public/language/hr/error.json index 26cc2bf007..492f3afa18 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -125,6 +125,7 @@ "parse-error": "Došlo je do pogreške u komunikaciji sa serverom", "wrong-login-type-email": "Upišite Vaš email za prijavu", "wrong-login-type-username": "Upišite Vaše korisničko ime za prijavu", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Pozvali ste maksimalan broj ljudi (%1 od %2).", "no-session-found": "Nije pronađena sesija prijave!", "not-in-room": "Korisnik nije u sobi", @@ -133,5 +134,6 @@ "no-users-selected": "Korisnici nisu odabrani", "invalid-home-page-route": "Netočna putanja naslovnice", "invalid-session": "Pogreška sesije", - "invalid-session-text": "Vaša sesija nije više aktivna ili se više ne poklapa sa serverom. Molimo osvježite stranicu." + "invalid-session-text": "Vaša sesija nije više aktivna ili se više ne poklapa sa serverom. Molimo osvježite stranicu.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/hr/topic.json b/public/language/hr/topic.json index 98a6210428..00ad1d8de7 100644 --- a/public/language/hr/topic.json +++ b/public/language/hr/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Sigurni ste da želite povratiti ovu temu?", "thread_tools.purge": "Odbaci temu", "thread_tools.purge_confirm": "Sigurni ste da želite odbaciti ovu temu?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Tema je uspješno pomaknuta u %1", "post_delete_confirm": "Sigurni ste da želite obrisati ovu objavu?", "post_restore_confirm": "Sigurni ste da želite povratiti ovu objavu?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 objava odabrana", "fork_success": "Uspješno duplirana tema. Kliknite ovdje za dupliranu temu.", "delete_posts_instruction": "Označite objave koje želite obrisati/odbaciti", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Unesite naslov teme ovdje ...", "composer.handle_placeholder": "Ime", "composer.discard": "Odbaci", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index e5c4c2f198..d6836b3bb7 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -125,6 +125,7 @@ "parse-error": "Hiba történt a szerver válaszának feldolgozása közben", "wrong-login-type-email": "Kérlek az e-mail címedet használd a belépéshez", "wrong-login-type-username": "Kérlek a felhasználónevedet használd a belépéshez", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 2643558f3d..11eeb4eb0f 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Írd be a témanevet...", "composer.handle_placeholder": "Name", "composer.discard": "Elvet", diff --git a/public/language/id/error.json b/public/language/id/error.json index 174ad7be79..1076e7fc8f 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/id/topic.json b/public/language/id/topic.json index 745de176bf..700acd9b84 100644 --- a/public/language/id/topic.json +++ b/public/language/id/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Kamu yakin ingin mengembalikan topik ini?", "thread_tools.purge": "Musnahkan Topik", "thread_tools.purge_confirm": "Kamu yakin ingin memusnahkan topik ini?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Topik ini berhasil dipindahkan ke %1", "post_delete_confirm": "Kamu yakin ingin menghapus posting ini?", "post_restore_confirm": "Kamu yakin ingin mengembalikan posting ini?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Topik berhasil dicabangkan! Klik disini untuk menuju topik yang telah dicabangkan.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Masukkan judul topik di sini...", "composer.handle_placeholder": "Nama", "composer.discard": "Buang", diff --git a/public/language/it/email.json b/public/language/it/email.json index afaa12e945..bcada51df4 100644 --- a/public/language/it/email.json +++ b/public/language/it/email.json @@ -30,7 +30,7 @@ "notif.chat.unsub.info": "Questa notifica di chat ti è stata inviata perché l'hai scelta nelle impostazioni.", "notif.post.cta": "Clicca qui per leggere la discussione completa", "notif.post.unsub.info": "Questo post ti è stato notificato in base alle tue impostazioni di sottoscrizione.", - "notif.cta": "Click here to go to forum", + "notif.cta": "Vai alla discussione", "test.text1": "Questa è una email di test per verificare che il servizio di invio email è configurato correttamente sul tuo NodeBB.", "unsub.cta": "Clicca qui per modificare queste impostazioni", "banned.subject": "You have been banned from %1", diff --git a/public/language/it/error.json b/public/language/it/error.json index b5ccbdf88d..9fa55ff42e 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -125,6 +125,7 @@ "parse-error": "Qualcosa è andato storto durante l'analisi della risposta proveniente dal server", "wrong-login-type-email": "Per favore usa la tua email per accedere", "wrong-login-type-username": "Per favore usa il tuo nome utente per accedere", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Hai invitato il massimo numero di persone possibili (%1 su %2).", "no-session-found": "Nessuna sessione valida di login trovata!", "not-in-room": "L'utente non è in questa stanza", @@ -133,5 +134,6 @@ "no-users-selected": "Nessun utente selezionato", "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." + "invalid-session-text": "Sembra che la tua sessione non sia più attiva, oppure non corrisponde con il server. Per favore ricarica la pagina.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index df14a67067..5aa5225d1b 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -9,10 +9,10 @@ "continue_to": "Continua a %1", "return_to": "Ritorna a %1", "new_notification": "Nuova Notifica", - "new_notification_from": "You have a new Notification from %1", + "new_notification_from": "Notifica dal %1", "you_have_unread_notifications": "Hai notifiche non lette.", "all": "Tutte", - "topics": "Topics", + "topics": "Discussioni", "replies": "Risposte", "chat": "Chat", "follows": "Segui", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index e9540a5b89..747ba4876b 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Sei sicuro di voler ripristinare questa discussione?", "thread_tools.purge": "Svuota Discussione", "thread_tools.purge_confirm": "Sei sicuro di voler svuotare questa discussione?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Questa discussione è stata correttamente spostata in %1", "post_delete_confirm": "Sei sicuro di voler cancellare questo post?", "post_restore_confirm": "Sei sicuro di voler ripristinare questo post?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post selezionati", "fork_success": "Topic Diviso con successo ! Clicca qui per andare al Topic Diviso.", "delete_posts_instruction": "Clicca sui post che vuoi cancellare/eliminare", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Inserisci qui il titolo della discussione...", "composer.handle_placeholder": "Nome", "composer.discard": "Annulla", diff --git a/public/language/it/unread.json b/public/language/it/unread.json index 470c0e4c41..c1244d0fe3 100644 --- a/public/language/it/unread.json +++ b/public/language/it/unread.json @@ -10,6 +10,6 @@ "all-topics": "Tutte le Discussioni", "new-topics": "Nuova Discussione", "watched-topics": "Discussioni seguite", - "unreplied-topics": "Unreplied Topics", + "unreplied-topics": "Nessuna Risposta", "multiple-categories-selected": "Multiple Selected" } \ No newline at end of file diff --git a/public/language/ja/error.json b/public/language/ja/error.json index b46a3b93ac..0ddf8aa938 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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": "ユーザーが部屋にいません", @@ -133,5 +134,6 @@ "no-users-selected": "ユーザー(s)が選択されていません", "invalid-home-page-route": "ホームページのルートが無効", "invalid-session": "セッションの不一致", - "invalid-session-text": "ログインセッションの期限切れ、またはサーバーとの未接続が長すぎると思われます。このページを更新してみてください。" + "invalid-session-text": "ログインセッションの期限切れ、またはサーバーとの未接続が長すぎると思われます。このページを更新してみてください。", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 98e0208920..f34844e326 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "本当にこのスレッドを戻しますか?", "thread_tools.purge": "スレッドを切り離します", "thread_tools.purge_confirm": "本当にこのスレッドを切り離しますか?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "このスレッドを%1に移動しました。", "post_delete_confirm": "本当にこの投稿を削除しますか?", "post_restore_confirm": "本当にこの投稿を元に戻しますか?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 投稿(s)が選択されました", "fork_success": "スレッドをフォークするのに成功しました。ここを押して、このフォークしたスレッドに行きます。", "delete_posts_instruction": "削除または切り離するには、当てはまる投稿を押してください", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "スレッドのタイトルを入力...", "composer.handle_placeholder": "名前", "composer.discard": "破棄する", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 511d875543..38b837c798 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -125,6 +125,7 @@ "parse-error": "서버로 부터의 응답을 읽는 동안 문제가 발생했습니다.", "wrong-login-type-email": "이메일 주소를 통해 로그인하세요.", "wrong-login-type-username": "사용자명을 통해 로그인하세요.", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "초대 한도 만큼의 사용자를 초대했습니다. (%2명 중 %1을 초대)", "no-session-found": "로그인 세션을 찾을 수 없습니다.", "not-in-room": "없는 사용자입니다.", @@ -133,5 +134,6 @@ "no-users-selected": "선택된 사용자가 없습니다.", "invalid-home-page-route": "올바르지 않은 홈페이지 경로입니다. ", "invalid-session": "일치하지 않는 세션입니다.", - "invalid-session-text": "로그인 세션이 비활성화 되었거나 서버와 일치하지 않습니다. 페이지를 새로 고쳐주세요." + "invalid-session-text": "로그인 세션이 비활성화 되었거나 서버와 일치하지 않습니다. 페이지를 새로 고쳐주세요.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 11d0d8fc7e..d55fb7fcec 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "이 게시물을 복원 하시겠습니까?", "thread_tools.purge": "게시물 폐기", "thread_tools.purge_confirm": "이 게시물을 폐기 하시겠습니까?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "성공적으로 이 게시물을 %1로 이동했습니다.", "post_delete_confirm": "이 포스트를 삭제 하시겠습니까?", "post_restore_confirm": "이 포스트를 복원 하시겠습니까?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 개의 포스트(들)이 선택되었습니다", "fork_success": "게시물이 분리되었습니다! 분리된 게시물을 보려면 여기를 클릭 하세요.", "delete_posts_instruction": "삭제할 포스트를 선택하세요.", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "게시물 제목을 입력하세요.", "composer.handle_placeholder": "이름", "composer.discard": "취소", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 69c546337d..064cd77941 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -125,6 +125,7 @@ "parse-error": "Kažkokia klaida įvyko bandant gaut serverio atsaykmą", "wrong-login-type-email": "Prisijungimui prašom naudoti jūsų el. adresą", "wrong-login-type-username": "Prisijungimui prašome naudoti vartotojo vardą", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 406d1062b9..822acaf0b8 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Ar jūs tikrai norite atkurti šią temą?", "thread_tools.purge": "Išvalyti temą", "thread_tools.purge_confirm": "Ar tikrai norite išvalyti šią temą?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Ši tema buvo sėkmingai perkelta į %1", "post_delete_confirm": "Ar jūs tikrai norite ištrinti šį įrašą?", "post_restore_confirm": "Ar jūs tikrai norite atkurti šį įrašą?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Sėkmingai išsišakota iš temos! Spausk čia kad nueitu į išsišakota temą", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Įrašykite temos pavadinimą...", "composer.handle_placeholder": "Vardas ir pavardė", "composer.discard": "Atšaukti", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 889912e5d0..08b28dd54a 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -125,6 +125,7 @@ "parse-error": "Sesuatu tidak kena berlaku ketika menghuraikan repson pelayan (server)", "wrong-login-type-email": "Sila guna emel anda untuk log masuk", "wrong-login-type-username": "Sila guna nama pengguna anda untuk log masuk", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Anda telah menjemput semaksima jumlah orang (%1 daripada %2).", "no-session-found": "Tiada sesyen log masuk dijumpai", "not-in-room": "Pengguna tiada dalam bilik", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index 3f8737d458..5467b70702 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Anda yakin untuk pulihkan topik ini?", "thread_tools.purge": "Singkirkan Topik", "thread_tools.purge_confirm": "Anda yakin untuk singkirkan topik ini?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Topik telah dipindahkan ke %1", "post_delete_confirm": "Adakah anda pasti untuk memadam kiriman ini?", "post_restore_confirm": "Adakah anda pasti untuk memulihkan kiriman ini?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Berjaya menyalin topik. Klik sini untuk ke topik yang disalin.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Masukkan tajuk topik disini", "composer.handle_placeholder": "Nama", "composer.discard": "Abaikan", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index bfdefc58cb..983ae1372e 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -125,6 +125,7 @@ "parse-error": "Noe gikk feil under analysering av serversvar", "wrong-login-type-email": "Vennligst benytt e-posten din for å logge inn", "wrong-login-type-username": "Vennligst benytt brukernavnet ditt for å logge inn", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 031f366c51..27db8ac117 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Er du sikker på at du vil gjenopprette dette emnet?", "thread_tools.purge": "Rensk emne", "thread_tools.purge_confirm": "Er du sikker på at du vil renske dette emnet?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Emnet har blitt flyttet til %1", "post_delete_confirm": "Er du sikker på at du vil slette dette innlegget?", "post_restore_confirm": "Er du sikker på at du vil gjenopprette dette innlegget?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Dette emnet ble forgrenet! Klikk for å gå til forgrenet emne.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Skriv din tråd-tittel her", "composer.handle_placeholder": "Navn", "composer.discard": "Forkast", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index fbc9f95c1a..460254c097 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -125,6 +125,7 @@ "parse-error": "Tijdens het verwerken van het antwoord van de server is er iets misgegaan.", "wrong-login-type-email": "Gebruik je e-mailadres om in te loggen", "wrong-login-type-username": "Gebruik je gebruikersnaam om in te loggen", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Je heb het maximum aantal mensen uitgenodigd (%1 van de %2).", "no-session-found": "Geen login sessie gevonden!", "not-in-room": "Gebruiker niet in de chat", @@ -133,5 +134,6 @@ "no-users-selected": "Geen gebruiker(s) geselecteerd", "invalid-home-page-route": "Onbekende homepage route", "invalid-session": "Verkeerde sessie combinatie", - "invalid-session-text": "Het lijkt erop dat je login sessie niet meer actief is of niet langer synchroon is met de server. Ververs de pagina." + "invalid-session-text": "Het lijkt erop dat je login sessie niet meer actief is of niet langer synchroon is met de server. Ververs de pagina.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index 4908453fee..b1d33fd9da 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Zeker weten dit onderwerp te herstellen?", "thread_tools.purge": "Wis onderwerp ", "thread_tools.purge_confirm": "Weet je zeker dat je dit onderwerp wil verwijderen?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Verplaatsen van onderwerp naar %1 succesvol", "post_delete_confirm": "Is het absoluut de bedoeling dit bericht te verwijderen?", "post_restore_confirm": "Is het de bedoeling dit bericht te herstellen?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 bericht(en) geselecteerd", "fork_success": "Onderwerp is succesvol afgesplitst. Klik hier om het nieuwe onderwerp te zien.", "delete_posts_instruction": "Klik op de berichten die verwijderd moeten worden", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Voer hier de titel van het onderwerp in...", "composer.handle_placeholder": "Naam", "composer.discard": "Annuleren", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 7a8ce1a07f..4be7c3d177 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -125,6 +125,7 @@ "parse-error": "Coś poszło nie tak podczas przetwarzania odpowiedzi serwera", "wrong-login-type-email": "Zaloguj się, używając adresu email", "wrong-login-type-username": "Zaloguj się używając nazwy użytkownika", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Zaprosiłeś maksymalną liczba osób (%1 z %2).", "no-session-found": "Nie znaleziono sesji logowania", "not-in-room": "Użytkownik nie jest w pokoju", @@ -133,5 +134,6 @@ "no-users-selected": "Nie wybrano żadnych użytkowników", "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ę." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index fb2fa3e93c..e3fd7d49fe 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Na pewno chcesz przywrócić ten temat?", "thread_tools.purge": "Wymaż temat", "thread_tools.purge_confirm": "Na pewno chcesz wymazać ten temat?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Temat przeniesiono do %1", "post_delete_confirm": "Na pewno chcesz usunąć ten post?", "post_restore_confirm": "Na pewno chcesz przywrócić ten post?", @@ -89,6 +91,7 @@ "fork_pid_count": "wybrano %1 post(-ów)", "fork_success": "Udało się skopiować temat. Kliknij tutaj, aby do niego przejść.", "delete_posts_instruction": "Kliknij na posty, które chcesz usunąć", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Wpisz tutaj tytuł tematu...", "composer.handle_placeholder": "Nazwa", "composer.discard": "Odrzuć", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index d49ad01827..982acd0441 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -125,6 +125,7 @@ "parse-error": "Algo deu errado ao receber a resposta do servidor", "wrong-login-type-email": "Por favor use seu email para fazer login", "wrong-login-type-username": "Por favor use o seu nome de usuário para fazer login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Você já convidou o número máximo de pessoas (%1 de %2).", "no-session-found": "Nenhuma sessão de login encontrada!", "not-in-room": "O usuário não está na sala", @@ -133,5 +134,6 @@ "no-users-selected": "Nenhuma escolha de usuário(s) foi feita", "invalid-home-page-route": "Rota de página inicial inválida", "invalid-session": "Erro de Sessão", - "invalid-session-text": "Parece que sua sessão de login não está mais ativa, ou não combina mais com a do servidor. Por gentileza, recarregue esta página." + "invalid-session-text": "Parece que sua sessão de login não está mais ativa, ou não combina mais com a do servidor. Por gentileza, recarregue esta página.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/pt-BR/topic.json b/public/language/pt-BR/topic.json index 6ae93feb95..def9099360 100644 --- a/public/language/pt-BR/topic.json +++ b/public/language/pt-BR/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Tem certeza que deseja restaurar este tópico?", "thread_tools.purge": "Expurgar Tópico", "thread_tools.purge_confirm": "Tem certeza que deseja expurgar este tópico? ", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Tópico movido com sucesso para %1", "post_delete_confirm": "Tem certeza que deseja deletar este post?", "post_restore_confirm": "Tem certeza que deseja restaurar este post?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selecionado(s)", "fork_success": "Tópico ramificado com sucesso! Clique aqui para ir ao tópico ramificado.", "delete_posts_instruction": "Clique nos posts que você deseja deletar/limpar", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Digite aqui o título para o seu tópico...", "composer.handle_placeholder": "Nome", "composer.discard": "Descartar", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index 08a351e5e1..d0f7fff518 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -125,6 +125,7 @@ "parse-error": "Ocorreu um erro enquanto analisávamos a resposta do servidor", "wrong-login-type-email": "Por favor utiliza o teu e-mail para efetuares o login", "wrong-login-type-username": "Por favor utiliza o teu nome de utilizador para efetuares o login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Convidaste o máximo de pessoas (%1 em %2).", "no-session-found": "Não encontramos sessões de login!", "not-in-room": "Utilizador não se encontra na sala", @@ -133,5 +134,6 @@ "no-users-selected": "Não existe(m) utilizador(es) selecionado(s)", "invalid-home-page-route": "Rota para a página principal inválida", "invalid-session": "Sessão incompatível", - "invalid-session-text": "Parece que a sua sessão de login não se encontra mais ativa ou não tem correspondência com o servidor. por favor recarregue esta página." + "invalid-session-text": "Parece que a sua sessão de login não se encontra mais ativa ou não tem correspondência com o servidor. por favor recarregue esta página.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/pt-PT/topic.json b/public/language/pt-PT/topic.json index 9647b731c5..fb2ea14eee 100644 --- a/public/language/pt-PT/topic.json +++ b/public/language/pt-PT/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Tens a certeza que pretendes restaurar este tópico?", "thread_tools.purge": "Purgar tópico", "thread_tools.purge_confirm": "Tens a certeza que desejas continuar com a purgação deste tópico?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Este tópico foi movido com sucesso para %1", "post_delete_confirm": "Tens a certeza que desejas eliminar esta publicação?", "post_restore_confirm": "Tens a certeza que desejas restaurar esta publicação?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 publicação(ões) selecionada(s)", "fork_success": "Clonaste um tópico com sucesso! Carrega aqui para ires para o tópico clonado.", "delete_posts_instruction": "Carrega em publicações que queres apagar/purgar", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Insere aqui o título do tópico...", "composer.handle_placeholder": "Nome", "composer.discard": "Descartar", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 5b7c43a530..8b57f80498 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index 36ed0ffb0f..fe89ee4244 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Esti sigur că vrei să restaurezi acest subiect?", "thread_tools.purge": "Curăță Subiect", "thread_tools.purge_confirm": "Ești sigur că vrei sa cureți acest subiect?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Acest mesaj a fost mutat cu succes în %1", "post_delete_confirm": "Ești sigur că vrei să ștergi acest mesaj?", "post_restore_confirm": "Esti sigur că vrei să restaurezi acest mesaj?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Introdu numele subiectului aici ...", "composer.handle_placeholder": "Name", "composer.discard": "Renunță", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 63f1c5ad0c..42b8edb9e9 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -125,6 +125,7 @@ "parse-error": "Похоже, что-то пошло не так в процессе обработки ответа сервера.", "wrong-login-type-email": "Пожалуйста, для входа используйте адрес своей электронной почты.", "wrong-login-type-username": "Пожалуйста, для входа используйте имя пользователя.", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Вы пригласили %1 людей из %2 возможных.", "no-session-found": "Сессия входа не найдена!", "not-in-room": "Пользователь отсутствует в этой комнате", @@ -133,5 +134,6 @@ "no-users-selected": "Выберите одного или нескольких пользователей", "invalid-home-page-route": "Неверная ссылка на домашнюю страницу", "invalid-session": "Сессия не существует", - "invalid-session-text": "Похоже, что ваша сессия больше не активна или она не совпадает с сессией на сервере. Пожалуйста, обновите эту страницу." + "invalid-session-text": "Похоже, что ваша сессия больше не активна или она не совпадает с сессией на сервере. Пожалуйста, обновите эту страницу.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index ba4e4fcec0..84aa1fa724 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Вы уверены, что хотите восстановить тему?", "thread_tools.purge": "Стереть тему", "thread_tools.purge_confirm": "Вы уверены, что хотите стереть эту тему?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Эта тема успешно перемещена в %1", "post_delete_confirm": "Вы уверены, что хотите удалить эту запись?", "post_restore_confirm": "Вы уверены, что хотите восстановить эту запись?", @@ -89,6 +91,7 @@ "fork_pid_count": "Отмечено %1 сообщений", "fork_success": "Готово! Просмотр отделённой темы.", "delete_posts_instruction": "Отметьте записи, которые вы хотите удалить", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Введите название темы...", "composer.handle_placeholder": "Название", "composer.discard": "Отменить", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index bbf35c17af..2cce2ebf54 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -125,6 +125,7 @@ "parse-error": "Hari ikibazo cyavutse mu gihe twari kugerageza kuzana igisubizo kivuye kuri server", "wrong-login-type-email": "Koresha email yawe kugirango winjiremo", "wrong-login-type-username": "Koresha izina ry'umukoresha ryawe kugirango winjiremo", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/rw/topic.json b/public/language/rw/topic.json index dfe0130e0f..c01bbf1dd1 100644 --- a/public/language/rw/topic.json +++ b/public/language/rw/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Wiringiye neza ko ushaka kugarura iki kiganiro?", "thread_tools.purge": "Sibanganya Ikiganiro", "thread_tools.purge_confirm": "Wiringiye neza ko ushaka gusibanganya iki kiganiro?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Nta ngorane, iki kiganiro kimaze kwimurirwa muri %1", "post_delete_confirm": "Wiringiye neza ko ushaka gukuraho iki kiganiro?", "post_restore_confirm": "Wiringiye neza ko ushaka kugarura iki kiganiro? ", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Umaze kugabanyaho ku kiganiro! Kanda hano ugezwe ku kiganiro cyavutse. ", "delete_posts_instruction": "Kanda ku bintu ushaka guhisha/gusiba", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Shyira umutwe w'ikiganiro cyawe aha...", "composer.handle_placeholder": "Izina", "composer.discard": "Byihorere", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 904416d3fd..a986e97f0f 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -125,6 +125,7 @@ "parse-error": "Something went wrong while parsing server response", "wrong-login-type-email": "Please use your email to login", "wrong-login-type-username": "Please use your username to login", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "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", @@ -133,5 +134,6 @@ "no-users-selected": "No user(s) 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." + "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-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index f5e4b1b376..3074f4b2f0 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 post(s) selected", "fork_success": "Successfully forked topic! Click here to go to the forked topic.", "delete_posts_instruction": "Click the posts you want to delete/purge", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Pone su tìtulu de s'arresonada inoghe...", "composer.handle_placeholder": "Name", "composer.discard": "Lassa a Pèrdere", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 2f4cc4e2e9..4a4811880f 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -125,6 +125,7 @@ "parse-error": "Niečo sa pokazilo pri analýze odpovede servera", "wrong-login-type-email": "Prosím použite svoj e-mail, k prihláseniu", "wrong-login-type-username": "Použite svoje užívateľské meno pre prihlásenie", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Pozvali ste maximálny počet ľudí (%1 z %2).", "no-session-found": "Žiadne prihlásenie sa do relácií nenájdené!", "not-in-room": "Užívateľ nie je v miestnosti", @@ -133,5 +134,6 @@ "no-users-selected": "Žiadny užívateľ(ia) neboli vybratý", "invalid-home-page-route": "Neplatná cesta pre domovskú stránku", "invalid-session": "Relácia neodpovedá", - "invalid-session-text": "Vyzerá to, že Vaše prihlasovacia relácia už nie je aktívna, alebo sa už nezhoduje so serverom. Aktualizujte túto stránku." + "invalid-session-text": "Vyzerá to, že Vaše prihlasovacia relácia už nie je aktívna, alebo sa už nezhoduje so serverom. Aktualizujte túto stránku.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index 9eeab330be..f32fa2c20e 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Ste si naozaj istý že chcete obnoviť túto tému?", "thread_tools.purge": "Vyčistiť tému", "thread_tools.purge_confirm": "Ste si naozaj istý že chcete vyčistiť túto tému?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Téma bola úspešne presunutá do %1", "post_delete_confirm": "Ste si istý, že chcete odstrániť tento príspevok?", "post_restore_confirm": "Ste si istí, že chcete obnoviť tento príspevok?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 príspevky(ov) vybraté", "fork_success": "Rozdelenie témy bolo úspešné! Kliknutím sem sa dostanete na rozdelenú tému", "delete_posts_instruction": "Kliknite na príspevky, ktoré chcete odstrániť/očistiť", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Sem zadajte názov témy...", "composer.handle_placeholder": "Meno", "composer.discard": "Zahodiť", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index be4e3a2121..a2a89d593b 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -125,6 +125,7 @@ "parse-error": "Nekaj je šlo narobe pri pridobivanju odgovora s strežnika.", "wrong-login-type-email": "Uporabite svoj e-poštni naslov za prijavo.", "wrong-login-type-username": "Uporabite svoje uporabniško ime za prijavo.", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Povabili ste največje dovoljeno število ljudi (%1 od %2).", "no-session-found": "Prijavne seje ni mogoče najti!", "not-in-room": "Uporabnika ni v sobi.", @@ -133,5 +134,6 @@ "no-users-selected": "Ni izbranih uporabnikov.", "invalid-home-page-route": "Napačna pot do domače strani.", "invalid-session": "Seje se ne ujemajo.", - "invalid-session-text": "Kaže, da vaša prijavna seja ni več aktiva. Prosimo, osvežite to stran." + "invalid-session-text": "Kaže, da vaša prijavna seja ni več aktiva. Prosimo, osvežite to stran.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/sl/topic.json b/public/language/sl/topic.json index cc539f3f40..0c2f4f135e 100644 --- a/public/language/sl/topic.json +++ b/public/language/sl/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Ste prepričani, da želite obnoviti to temo?", "thread_tools.purge": "Očisti temo", "thread_tools.purge_confirm": "Ste prepričani, da želite očistiti to temo?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Ta tema je bila uspešno prestavljena v %1", "post_delete_confirm": "Ste prepričani, da želite izbrisati to objavo?", "post_restore_confirm": "Ste prepričani, da želite razveljaviti to objavo?", @@ -89,6 +91,7 @@ "fork_pid_count": "Izbranih objav: %1 ", "fork_success": "Uspešno ste razcepili temo! Klikni tu za ogled te teme.", "delete_posts_instruction": "Kliknite na teme, ki jih želite izbrisati/očistiti ", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Vpiši naslov teme...", "composer.handle_placeholder": "Ime", "composer.discard": "Zavrzi", diff --git a/public/language/sr/email.json b/public/language/sr/email.json index ad73a44e1d..98cb324038 100644 --- a/public/language/sr/email.json +++ b/public/language/sr/email.json @@ -30,7 +30,7 @@ "notif.chat.unsub.info": "Ова обавештење о ћаскању вам је послато услед вашег подешавања претплате.", "notif.post.cta": "Кликните овде за приказ целе теме", "notif.post.unsub.info": "Ово обавештење вам је послато услед вашег подешавања претплате.", - "notif.cta": "Click here to go to forum", + "notif.cta": "Кликните овде да посетите посетите форум", "test.text1": "Ово је пробно е-писмо за проверу исправности поставки е-поштара у NodeBB.", "unsub.cta": "Кликните овде да измените та подешавања", "banned.subject": "Забрањени сте на %1", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 8e6573715a..e5e02dba37 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -125,6 +125,7 @@ "parse-error": "Нешто је кренуло погрешно приликом анализе одговора сервера", "wrong-login-type-email": "Користите вашу е-пошту за пријављивање", "wrong-login-type-username": "Користите ваше корисничко име за пријављивање", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Позвали сте максимални број особа (%1 од %2).", "no-session-found": "Није пронађена сесија пријављивања!", "not-in-room": "Корисник није у соби", @@ -133,5 +134,6 @@ "no-users-selected": "Није одабран корисник", "invalid-home-page-route": "Неважећа путања почетне странице", "invalid-session": "Неподударање сесија", - "invalid-session-text": "Изгледа да ваша сесија пријављивања није више активна или се више не подудара са сервером. Поново учитајте ову страницу." + "invalid-session-text": "Изгледа да ваша сесија пријављивања није више активна или се више не подудара са сервером. Поново учитајте ову страницу.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index 90d1578a0f..17ba4ee271 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -9,7 +9,7 @@ "continue_to": "Продужи на %1", "return_to": "Врати се на %1", "new_notification": "Ново обавештење", - "new_notification_from": "You have a new Notification from %1", + "new_notification_from": "Имате ново обавештење са %1", "you_have_unread_notifications": "Имате непрочитана обавештења.", "all": "Све", "topics": "Теме", @@ -47,18 +47,18 @@ "email-confirmed-message": "Хвала на овери ваше е-поште. Ваш налог је сада у потпуности активан.", "email-confirm-error-message": "Дошло је до проблема са овером ваше е-поште. Можда је код неисправан или је истекао.", "email-confirm-sent": "Е-пошта за потврду је послата.", - "none": "None", - "notification_only": "Notification Only", - "email_only": "Email Only", - "notification_and_email": "Notification & Email", - "notificationType_upvote": "When someone upvotes your post", - "notificationType_new-topic": "When someone you follow posts a topic", - "notificationType_new-reply": "When a new reply is posted in a topic you are watching", - "notificationType_follow": "When someone starts following you", - "notificationType_new-chat": "When you receive a chat message", - "notificationType_group-invite": "When you receive a group invite", - "notificationType_new-register": "When someone gets added to registration queue", - "notificationType_post-queue": "When a new post is queued", - "notificationType_new-post-flag": "When a post is flagged", - "notificationType_new-user-flag": "When a user is flagged" + "none": "Ниједно", + "notification_only": "Само обавештење", + "email_only": "Само е-пошта", + "notification_and_email": "Обавештење и е-пошта", + "notificationType_upvote": "Када неко гласа за вашу поруку", + "notificationType_new-topic": "Када неко кога пратите постави тему", + "notificationType_new-reply": "Када је постављен нови одговор у теми коју надгледате", + "notificationType_follow": "Када неко почне да вас прати.", + "notificationType_new-chat": "Када примите поруку за ћаскање", + "notificationType_group-invite": "Када примите позивницу за групу", + "notificationType_new-register": "Када је неко додат на чекање за регистрацију", + "notificationType_post-queue": "Када је нова порука на чекању", + "notificationType_new-post-flag": "Када је порука означена", + "notificationType_new-user-flag": "Када је корисник означен" } \ No newline at end of file diff --git a/public/language/sr/topic.json b/public/language/sr/topic.json index e104832976..53f860c3d3 100644 --- a/public/language/sr/topic.json +++ b/public/language/sr/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Да ли сте сигурни да желите да обновите ову тему?", "thread_tools.purge": "Очисти тему", "thread_tools.purge_confirm": "Да ли сте сигурни да желите да очистите ову тему?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Ова тема је успешно премештена у %1", "post_delete_confirm": "Да ли сте сигурни да желите да избришете ову поруку?", "post_restore_confirm": "Да ли сте сигурни да желите да обновите ову поруку?", @@ -89,6 +91,7 @@ "fork_pid_count": "Одабрано порука: %1", "fork_success": "Тема је успешно рачвана! Кликните овде за одлазак на рачвану тему.", "delete_posts_instruction": "Кликните на поруке које желите да избришете/очистите", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Овде унесите назив теме...", "composer.handle_placeholder": "Име", "composer.discard": "Одбаци", diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 60a5eadcfc..961ddef916 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -101,11 +101,11 @@ "outgoing-message-sound": "Звук одлазне поруке", "notification-sound": "Звук обавештења", "no-sound": "Без звука", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq": "Учесталост обавештења о гласовима", + "upvote-notif-freq.all": "На сваки глас", + "upvote-notif-freq.everyTen": "На сваких десет гласова", + "upvote-notif-freq.logarithmic": "На 10, 100, 1000...", + "upvote-notif-freq.disabled": "Онемогућено", "browsing": "Подешавање прегледања", "open_links_in_new_tab": "Отвори одлазне везе у новој картици", "enable_topic_searching": "Омогући претрагу унутар тема", @@ -126,9 +126,9 @@ "sso.title": "Једноструки Sign-on сервиси", "sso.associated": "Повезано са", "sso.not-associated": "Кликните овде за повезивање са", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", + "sso.dissociate": "Одвоји", + "sso.dissociate-confirm-title": "Потврди одвајање", + "sso.dissociate-confirm": "Да ли сте сигурни да желите да одвојите овај налог од %1?", "info.latest-flags": "Најновије ознаке", "info.no-flags": "Нема пронађених означених порука", "info.ban-history": "Историја недавно забрањених налога", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 30ab7144d0..70c14e7590 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -125,6 +125,7 @@ "parse-error": "Något gick fel vid tolkning av svar från servern", "wrong-login-type-email": "Använd din e-postadress för att logga in", "wrong-login-type-username": "Använd ditt användarnamn för att logga in", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Du har bjudit in det maximala antalet användare (%1 av %2)", "no-session-found": "Ingen login-session hittades!", "not-in-room": "Användaren finns inte i rummet", @@ -133,5 +134,6 @@ "no-users-selected": "Ingen användare vald(a)", "invalid-home-page-route": "Ogiltig sidsökväg", "invalid-session": "Session fel", - "invalid-session-text": "Det ser ut som din inloggningssession inte längre är aktiv eller inte längre överensstämmer med servern. Uppdatera denna sida." + "invalid-session-text": "Det ser ut som din inloggningssession inte längre är aktiv eller inte längre överensstämmer med servern. Uppdatera denna sida.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index bf51d85095..131077062e 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Är du säker på att du vill återställa det här ämnet?", "thread_tools.purge": "Rensa bort ämne", "thread_tools.purge_confirm": "Är du säker att du vill rensa bort det här ämnet?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Det här ämnet har flyttats till %1", "post_delete_confirm": "Är du säker på att du vill ta bort det här inlägget?", "post_restore_confirm": "Är du säker på att du vill återställa det här inlägget?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 inlägg vald(a)", "fork_success": "Ämnet har blivit förgrenat. Klicka här för att gå till det förgrenade ämnet.", "delete_posts_instruction": "Klicka på inläggen du vill radera/rensa bort", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Skriv in ämnets titel här...", "composer.handle_placeholder": "Namn", "composer.discard": "Avbryt", diff --git a/public/language/th/error.json b/public/language/th/error.json index 294f4c657f..3f91fb4d47 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -125,6 +125,7 @@ "parse-error": "มีบางอย่างผิดพลาดขณะรอการตอบกลับจากเซิร์ฟเวอร์", "wrong-login-type-email": "กรุณาใช้อีเมล์ของคุณในการเข้าสู่ระบบ", "wrong-login-type-username": "กรุณาใช้ชื่อผู้ใช้ของคุณในการเข้าสู่ระบบ", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "คุณได้ทำการเชิญผู้คนจำนวนมากที่สุด (%1 out of %2).", "no-session-found": "ไม่พบการเข้าสู่ระบบ", "not-in-room": "ผู้ใช้ไม่อยู่ในห้อง", @@ -133,5 +134,6 @@ "no-users-selected": "ไม่มีผู้ใช้ที่เลือก", "invalid-home-page-route": "เส้นทางไปหน้าแรกผิดพลาด", "invalid-session": "เซสชั่นไม่ถูกต้อง", - "invalid-session-text": "เหมือนกับว่าการเข้าสู่ระบบของคุณไม่ได้มีอยู่ในระบบ หรือไม่ก็ไม่ได้รับการตอบกลับจากเซิร์ฟเวอร์ กรุณารีเฟรชหน้าเว็บนี้" + "invalid-session-text": "เหมือนกับว่าการเข้าสู่ระบบของคุณไม่ได้มีอยู่ในระบบ หรือไม่ก็ไม่ได้รับการตอบกลับจากเซิร์ฟเวอร์ กรุณารีเฟรชหน้าเว็บนี้", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/th/topic.json b/public/language/th/topic.json index 69e1b0b54f..980bf12387 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "มั่นใจแล้วหรือไม่ที่จะกู้คืน Topic นี้?", "thread_tools.purge": "ล้างกระทู้", "thread_tools.purge_confirm": "คุณแน่ใจแล้วใช้ไมว่าต้องการล้างกระทู้นี้?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "กระทู้นี้ได้รับการย้ายไปยัง %1 เรียบร้อยแล้ว", "post_delete_confirm": "คุณแน่ใจแล้วใช่ไหมว่าต้องการลบโพสต์นี้", "post_restore_confirm": "คุณแน่ใจแล้วใช้ไหมว่าต้องการกู้คืนโพสต์นี้", @@ -89,6 +91,7 @@ "fork_pid_count": " %1 โพสต์(s) ที่เลือก", "fork_success": "แตกกระทู้สำเร็จแล้ว! คลิกที่นี่เพื่อไปยั้งกระทู้ที่คุณแตกประเด็น", "delete_posts_instruction": "คลิกโพสต์ที่คุณต้องการลบ/ล้าง", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "ป้อนชื่อกระทู้ของคุณที่นี่ ...", "composer.handle_placeholder": "ชื่อ", "composer.discard": "ยกเลิก", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index a2676e3216..b32474d28c 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -125,6 +125,7 @@ "parse-error": "Sunucu yanıtı çözümlemesi sırasında bir şeyler ters gitti", "wrong-login-type-email": "Lütfen giriş için e-posta adresinizi kullanın", "wrong-login-type-username": "Lütfen giriş için kullanıcı adınızı kullanın", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Sen maksimum miktarda insanı davet ettin (%2 üzerinden %1).", "no-session-found": "Giriş yapılmış bir oturum bulunamadı!", "not-in-room": "Odada kullanıcı yok", @@ -133,5 +134,6 @@ "no-users-selected": "Seçili kullanıcı(s) bulunamadı", "invalid-home-page-route": "Geçersiz anasayfa yolu", "invalid-session": "Oturum Uyuşmazlığı", - "invalid-session-text": "Senin giriş oturumun pek aktif gözükmüyor, ya da sunucu ile eşleşmiyor. Lütfen sayfayı yenileyiniz." + "invalid-session-text": "Senin giriş oturumun pek aktif gözükmüyor, ya da sunucu ile eşleşmiyor. Lütfen sayfayı yenileyiniz.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index b05175efa4..4fa9e54998 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Bu konuyu gerçekten geri getirmek istiyor musun?", "thread_tools.purge": "Konuyu Temizle", "thread_tools.purge_confirm": "Bu konuyu temizlemek istediğinize eminmisiniz?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Başlık %1 kategorisine başarıyla taşındı.", "post_delete_confirm": "Bu iletiyi gerçekten silmek istediğinize emin misiniz?", "post_restore_confirm": "Bu iletiyi gerçekten geri getirmek istiyor musun?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 ileti(ler) seçildi", "fork_success": "Başlık başarıyla ayrıldı!", "delete_posts_instruction": "Silmek/temizlemek istediğiniz iletilere tıklayın.", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Başlık ismini buraya girin...", "composer.handle_placeholder": "İsim", "composer.discard": "Vazgeç", diff --git a/public/language/uk/error.json b/public/language/uk/error.json index f13c6bfc3c..883f1b7bfc 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -125,6 +125,7 @@ "parse-error": "Щось пішло не так при розборі відповіді сервера", "wrong-login-type-email": "Будь ласка, використайте вашу електронну пошту для входу", "wrong-login-type-username": "Будь ласка, використайте ваше ім'я для входу", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Ви запросили максимальну кілкість людей (%1 з %2).", "no-session-found": "Жодної сесії не знайдено!", "not-in-room": "Користувача немає в кімнаті", @@ -133,5 +134,6 @@ "no-users-selected": "Не вибрано жодного користувача", "invalid-home-page-route": "Невірний шлях на головну", "invalid-session": "Сесія не існує", - "invalid-session-text": "Здається, що ваша сесія більше неактивна або розійшлася з серверною. Оновіть, будь ласка, цю сторінку." + "invalid-session-text": "Здається, що ваша сесія більше неактивна або розійшлася з серверною. Оновіть, будь ласка, цю сторінку.", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/uk/topic.json b/public/language/uk/topic.json index 76ac483f3b..5b464da5fe 100644 --- a/public/language/uk/topic.json +++ b/public/language/uk/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Ви точно бажаєте відновити цю тему?", "thread_tools.purge": "Стерти тему", "thread_tools.purge_confirm": "Ви точно бажаєте стерти цю тему?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Тема була успішно переміщена до %1", "post_delete_confirm": "Ви точно бажаєте видалити цей пост?", "post_restore_confirm": "Ви точно бажаєте відновити цей пост?", @@ -89,6 +91,7 @@ "fork_pid_count": "вибрано %1 пост(ів) ", "fork_success": "Тему успішно відгалужено. Тисніть тут, щоб перейти до відгалуженої теми.", "delete_posts_instruction": "Тисніть пости які ви бажаєте видалити/стерти", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Уведіть заголовок теми...", "composer.handle_placeholder": "Ім'я", "composer.discard": "Скасувати", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index a566eb3308..894ab8a3c6 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -125,6 +125,7 @@ "parse-error": "Có gì không ổn khi nhận kết quả từ máy chủ", "wrong-login-type-email": "Xin vui lòng sửa dụng email của bạn để đăng nhập", "wrong-login-type-username": "Vui lòng sử dụng tên đăng nhập của bạn để đăng nhập", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "Bạn đã sử dụng hết số lượng lời mời bạn có thể gửi (%1 đã gửi trên tổng số %2 được cho phép)", "no-session-found": "Không tìm thấy phiên đăng nhập!", "not-in-room": "Thành viên không có trong phòng", @@ -133,5 +134,6 @@ "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-session": "Không đúng session", - "invalid-session-text": "Có vẻ như phiên đăng nhập của bạn đã không còn hoạt động nữa, hoặc không còn đúng với thông tin trên máy chủ. Vui lòng tải lại trang này" + "invalid-session-text": "Có vẻ như phiên đăng nhập của bạn đã không còn hoạt động nữa, hoặc không còn đúng với thông tin trên máy chủ. Vui lòng tải lại trang này", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index d3379b29fd..6f8290fa75 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "Bạn có muốn phục hồi chủ đề này?", "thread_tools.purge": "Xóa hẳn chủ đề", "thread_tools.purge_confirm": "Bạn có muốn xóa hẳn chủ đề này?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "Đã chuyển thành công chủ đề này sang %1", "post_delete_confirm": "Bạn có chắc là muốn xóa bài gửi này không?", "post_restore_confirm": "Bạn có chắc là muốn phục hồi bài gửi này không?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 bài viết(s) đã được gửi", "fork_success": "Tạo bản sao thành công! Nhấn vào đây để chuyển tới chủ đề vừa tạo.", "delete_posts_instruction": "Chọn những bài viết bạn muốn xoá", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "Nhập tiêu đề cho chủ đề của bạn tại đây...", "composer.handle_placeholder": "Tên", "composer.discard": "Huỷ bỏ", diff --git a/public/language/zh-CN/admin/appearance/customise.json b/public/language/zh-CN/admin/appearance/customise.json index 9af0d05332..8dfb53f0b1 100644 --- a/public/language/zh-CN/admin/appearance/customise.json +++ b/public/language/zh-CN/admin/appearance/customise.json @@ -3,12 +3,12 @@ "custom-css.description": "在这里输入自定义 CSS 变量声明,它们将被添加在样式中。", "custom-css.enable": "启用自定义 CSS", - "custom-js": "Custom Javascript", - "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", - "custom-js.enable": "Enable Custom Javascript", + "custom-js": "自定义 Javascript", + "custom-js.description": "在这里输入你想在页面加载完成后执行的 Javascript 代码。", + "custom-js.enable": "启用自定义 Javascript", "custom-header": "自定义 Header", - "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", + "custom-header.description": "在这里输入自定义的 HTML 代码 (如 JavaScript,Meta Tags 等),这些代码会被添加到论坛的 <head> 部分。 (您可以在这里使用<script> 标签,但我们建议您将您的 JavaScript 写到 自定义 Javascript 中)", "custom-header.enable": "启用自定义 Header", "custom-css.livereload": "启用实时重载", diff --git a/public/language/zh-CN/admin/menu.json b/public/language/zh-CN/admin/menu.json index 9bef46edcd..943d7c8b76 100644 --- a/public/language/zh-CN/admin/menu.json +++ b/public/language/zh-CN/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "界面", "appearance/themes": "主题", "appearance/skins": "皮肤", - "appearance/customise": "Custom Content (HTML/JS/CSS)", + "appearance/customise": "自定义代码 (HTML/JavaScript/CSS)", "section-extend": "扩展", "extend/plugins": "插件", diff --git a/public/language/zh-CN/admin/settings/notifications.json b/public/language/zh-CN/admin/settings/notifications.json index 693a8e9dc9..bd4ee2967f 100644 --- a/public/language/zh-CN/admin/settings/notifications.json +++ b/public/language/zh-CN/admin/settings/notifications.json @@ -2,5 +2,5 @@ "notifications": "通知", "welcome-notification": "欢迎通知", "welcome-notification-link": "欢迎通知链接", - "welcome-notification-uid": "Welcome Notification User (UID)" + "welcome-notification-uid": "用户欢迎通知 (UID)" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/post.json b/public/language/zh-CN/admin/settings/post.json index 348469863b..fcddda5165 100644 --- a/public/language/zh-CN/admin/settings/post.json +++ b/public/language/zh-CN/admin/settings/post.json @@ -4,7 +4,7 @@ "sorting.oldest-to-newest": "从旧到新", "sorting.newest-to-oldest": "从新到旧", "sorting.most-votes": "最多投票", - "sorting.most-posts": "Most Posts", + "sorting.most-posts": "最多回复", "sorting.topic-default": "默认主题排序", "restrictions": "发帖限制", "restrictions.post-queue": "启用发布队列", diff --git a/public/language/zh-CN/admin/settings/user.json b/public/language/zh-CN/admin/settings/user.json index 22fd387633..113bfec19d 100644 --- a/public/language/zh-CN/admin/settings/user.json +++ b/public/language/zh-CN/admin/settings/user.json @@ -19,8 +19,8 @@ "themes": "主题", "disable-user-skins": "阻止用户选择自定义皮肤", "account-protection": "帐号保护", - "admin-relogin-duration": "Admin relogin duration (minutes)", - "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", + "admin-relogin-duration": "管理面板无操作自动退出时长 (分钟)", + "admin-relogin-duration-help": "访问管理面板一段时间后需要重新登录以保证管理面板的安全,设置为0以禁用。", "login-attempts": "每小时尝试登录次数", "login-attempts-help": "如果用户的尝试登录次数超过此界限,该帐号将会被被锁定预设的时间。", "lockout-duration": "帐户锁定时间(分钟)", diff --git a/public/language/zh-CN/email.json b/public/language/zh-CN/email.json index 3f577b3bca..ce4228fd49 100644 --- a/public/language/zh-CN/email.json +++ b/public/language/zh-CN/email.json @@ -30,7 +30,7 @@ "notif.chat.unsub.info": "根据您的订阅设置,为您发送此聊天提醒。", "notif.post.cta": "点击这里阅读全主题。", "notif.post.unsub.info": "根据您的订阅设置,为您发送此回帖提醒。", - "notif.cta": "Click here to go to forum", + "notif.cta": "点击这里前往论坛", "test.text1": "这是一封测试邮件,用来验证 NodeBB 的邮件配置是否设置正确。", "unsub.cta": "点击这里修改这些设置", "banned.subject": "您已被封禁从 %1", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index ef3a112469..68b4c0a035 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -119,12 +119,13 @@ "not-enough-reputation-to-downvote": "您的声望不足以踩此帖", "not-enough-reputation-to-flag": "您的声望不足以举报此帖", "already-flagged": "您已举报此帖", - "self-vote": "You cannot vote on your own post", + "self-vote": "你不能在您自己的帖子内投票", "reload-failed": "刷新 NodeBB 时遇到问题: \"%1\"。NodeBB 保持给已连接的客户端服务,您应该撤销刷新前做的更改。", "registration-error": "注册错误", "parse-error": "服务器响应解析出错", "wrong-login-type-email": "请输入您的电子邮箱地址登录", "wrong-login-type-username": "请输入您的用户名登录", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "您的邀请人数超出了上限 (%1 超过了 %2)。", "no-session-found": "未登录!", "not-in-room": "用户已不在聊天室中", @@ -133,5 +134,6 @@ "no-users-selected": "尚未选择用户", "invalid-home-page-route": "无效的首页路径", "invalid-session": "Session 无法匹配", - "invalid-session-text": "您的登入状态已经失效,或者是与服务器信息不匹配。请刷新此页面。" + "invalid-session-text": "您的登入状态已经失效,或者是与服务器信息不匹配。请刷新此页面。", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index 3d42b29421..e9f73293f6 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -9,7 +9,7 @@ "continue_to": "继续前往 %1", "return_to": "返回 %1", "new_notification": "新通知", - "new_notification_from": "You have a new Notification from %1", + "new_notification_from": "您有一条来自 %1 的新通知", "you_have_unread_notifications": "您有未读的通知。", "all": "所有", "topics": "主题", @@ -47,18 +47,18 @@ "email-confirmed-message": "感谢您验证您的电子邮箱。您的帐户现已完全激活。", "email-confirm-error-message": "验证的您电子邮箱地址时出现了问题。可能是因为验证码无效或已过期。", "email-confirm-sent": "确认邮件已发送。", - "none": "None", - "notification_only": "Notification Only", - "email_only": "Email Only", - "notification_and_email": "Notification & Email", - "notificationType_upvote": "When someone upvotes your post", - "notificationType_new-topic": "When someone you follow posts a topic", - "notificationType_new-reply": "When a new reply is posted in a topic you are watching", - "notificationType_follow": "When someone starts following you", - "notificationType_new-chat": "When you receive a chat message", - "notificationType_group-invite": "When you receive a group invite", - "notificationType_new-register": "When someone gets added to registration queue", - "notificationType_post-queue": "When a new post is queued", - "notificationType_new-post-flag": "When a post is flagged", - "notificationType_new-user-flag": "When a user is flagged" + "none": "无", + "notification_only": "用通知提醒我", + "email_only": "用邮件提醒我", + "notification_and_email": "同时使用 通知 和 邮件 提醒我", + "notificationType_upvote": "当有人顶了我的帖子时", + "notificationType_new-topic": "当有人回复我的帖子时", + "notificationType_new-reply": "当您正在查看的主题中有新回复时", + "notificationType_follow": "当有人关注你时", + "notificationType_new-chat": "当你收到聊天消息时", + "notificationType_group-invite": "当你收到群组邀请时", + "notificationType_new-register": "当有人被添加到申请队列时", + "notificationType_post-queue": "当有新帖子等待审核时", + "notificationType_new-post-flag": "当有新的帖子举报时", + "notificationType_new-user-flag": "当有新的用户信息举报时" } \ No newline at end of file diff --git a/public/language/zh-CN/topic.json b/public/language/zh-CN/topic.json index 63d808ecd6..6687b7b58c 100644 --- a/public/language/zh-CN/topic.json +++ b/public/language/zh-CN/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "确定要恢复此主题吗?", "thread_tools.purge": "清除主题", "thread_tools.purge_confirm": "确认清除此主题吗?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "此主题已成功移到 %1", "post_delete_confirm": "确定删除此帖吗?", "post_restore_confirm": "确定恢复此帖吗?", @@ -89,6 +91,7 @@ "fork_pid_count": "选择了 %1 个帖子", "fork_success": "成功分割主题! 点这里跳转到分割后的主题。", "delete_posts_instruction": "点击想要删除/永久删除的帖子", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "在此输入您主题的标题...", "composer.handle_placeholder": "姓名", "composer.discard": "撤销", diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 4cb132bc59..170700628e 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -101,11 +101,11 @@ "outgoing-message-sound": "消息送出提示音", "notification-sound": "通知提示音", "no-sound": "无提示音", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq": "帖子被顶的通知频率", + "upvote-notif-freq.all": "每一次被顶都通知我", + "upvote-notif-freq.everyTen": "每10次被顶通知我一次", + "upvote-notif-freq.logarithmic": "当被顶的数目为10, 100, 1000...时通知我", + "upvote-notif-freq.disabled": "任何时候都不要通知我", "browsing": "浏览设置", "open_links_in_new_tab": "在新标签打开外部链接", "enable_topic_searching": "启用主题内搜索", @@ -126,9 +126,9 @@ "sso.title": "单点登录服务", "sso.associated": "已关联到", "sso.not-associated": "点击这里来关联", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", + "sso.dissociate": "解除关联", + "sso.dissociate-confirm-title": "确认解除关联", + "sso.dissociate-confirm": "你确定要将你的账户与 %1 解除关联吗?", "info.latest-flags": "最新举报", "info.no-flags": "没有找到被举报的帖子", "info.ban-history": "最近封禁历史", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index 8b21e7ed10..152dad5f0d 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -125,6 +125,7 @@ "parse-error": "當剖析伺服器回應時發生了某個錯誤", "wrong-login-type-email": "請使用你的電子郵件進行登入", "wrong-login-type-username": "請使用你的帳號進行登入", + "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", "invite-maximum-met": "你已經邀請最多可邀請的人數限制 (%1 於 %2)。", "no-session-found": "沒有找到登入的連線階段!", "not-in-room": "使用者沒有在聊天室中", @@ -133,5 +134,6 @@ "no-users-selected": "沒有選定使用者", "invalid-home-page-route": "無效的首頁路由", "invalid-session": "會話階段錯誤", - "invalid-session-text": "看起來你的登入會話階段已經無效,或是不符合於伺服器。請重新整理這個頁面。" + "invalid-session-text": "看起來你的登入會話階段已經無效,或是不符合於伺服器。請重新整理這個頁面。", + "no-topics-selected": "No topics selected!" } \ No newline at end of file diff --git a/public/language/zh-TW/topic.json b/public/language/zh-TW/topic.json index 07b37ee21e..bcfd71fb09 100644 --- a/public/language/zh-TW/topic.json +++ b/public/language/zh-TW/topic.json @@ -68,6 +68,8 @@ "thread_tools.restore_confirm": "你確定你要恢復這個主題嗎?", "thread_tools.purge": "清除主題", "thread_tools.purge_confirm": "你確定要清除這個主題?", + "thread_tools.merge_topics": "Merge Topics", + "thread_tools.merge": "Merge", "topic_move_success": "主題已成功移至 %1", "post_delete_confirm": "你確定要刪除這文章嗎?", "post_restore_confirm": "你確定要還原這文章嗎?", @@ -89,6 +91,7 @@ "fork_pid_count": "%1 張貼已選定", "fork_success": "成功分叉成新的主題!點擊這裡進入新的主題。", "delete_posts_instruction": "點擊你想要刪除/清除的張貼", + "merge_topics_instruction": "Click the topics you want to merge", "composer.title_placeholder": "輸入標題...", "composer.handle_placeholder": "名字", "composer.discard": "放棄", diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 0be6453a88..35c30ab1a1 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -37,6 +37,7 @@ $(document).ready(function () { } }); + ajaxify.count = 0; ajaxify.currentPage = null; ajaxify.go = function (url, callback, quiet) { @@ -100,6 +101,10 @@ $(document).ready(function () { return true; }; + ajaxify.isCold = function () { + return ajaxify.count <= 1; + }; + ajaxify.handleRedirects = function (url) { url = ajaxify.removeRelativePath(url.replace(/^\/|\/$/g, '')).toLowerCase(); var isClientToAdmin = url.startsWith('admin') && window.location.pathname.indexOf(RELATIVE_PATH + '/admin') !== 0; @@ -113,7 +118,6 @@ $(document).ready(function () { return false; }; - ajaxify.start = function (url) { url = ajaxify.removeRelativePath(url.replace(/^\/|\/$/g, '')); @@ -123,6 +127,8 @@ $(document).ready(function () { $(window).trigger('action:ajaxify.start', payload); + ajaxify.count += 1; + return payload.url; }; @@ -197,7 +203,6 @@ $(document).ready(function () { ajaxify.end = function (url, tpl_url) { var count = 2; - function done() { count -= 1; if (count === 0) { @@ -205,17 +210,11 @@ $(document).ready(function () { } } ajaxify.loadScript(tpl_url, done); - ajaxify.widgets.render(tpl_url, done); $(window).trigger('action:ajaxify.contentLoaded', { url: url, tpl: tpl_url }); app.processPage(); - - var timeElapsed = Date.now() - ajaxifyTimer; - if (config.environment === 'development' && !isNaN(timeElapsed)) { - console.info('[ajaxify /' + url + '] Time elapsed:', timeElapsed + 'ms'); - } }; ajaxify.parseData = function () { diff --git a/public/src/app.js b/public/src/app.js index 421cf71943..f56d894de8 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -9,7 +9,9 @@ app.widgets = {}; app.cacheBuster = null; (function () { - var showWelcomeMessage = !!utils.params().loggedin; + var params = utils.params(); + var showWelcomeMessage = !!params.loggedin; + var registerMessage = params.register; require(['benchpress'], function (Benchpress) { Benchpress.setGlobal('config', config); @@ -276,7 +278,9 @@ app.cacheBuster = null; app.replaceSelfLinks(); // Scroll back to top of page - window.scrollTo(0, 0); + if (!ajaxify.isCold()) { + window.scrollTo(0, 0); + } }; app.showMessages = function () { @@ -286,9 +290,12 @@ app.cacheBuster = null; title: '[[global:welcome_back]] ' + app.user.username + '!', message: '[[global:you_have_successfully_logged_in]]', }, + register: { + format: 'modal', + }, }; - function showAlert(type) { + function showAlert(type, message) { switch (messages[type].format) { case 'alert': app.alert({ @@ -301,7 +308,7 @@ app.cacheBuster = null; case 'modal': require(['translator'], function (translator) { - translator.translate(messages[type].message, function (translated) { + translator.translate(message || messages[type].message, function (translated) { bootbox.alert({ title: messages[type].title, message: translated, @@ -318,6 +325,12 @@ app.cacheBuster = null; showAlert('login'); }); } + if (registerMessage) { + $(document).ready(function () { + showAlert('register', decodeURIComponent(registerMessage)); + registerMessage = false; + }); + } }; app.openChat = function (roomId, uid) { diff --git a/public/src/client/category/tools.js b/public/src/client/category/tools.js index 3f211400c4..dfa31ca86a 100644 --- a/public/src/client/category/tools.js +++ b/public/src/client/category/tools.js @@ -4,10 +4,11 @@ define('forum/category/tools', [ 'forum/topic/move', + 'forum/topic/merge', 'topicSelect', 'components', 'translator', -], function (move, topicSelect, components, translator) { +], function (move, merge, topicSelect, components, translator) { var CategoryTools = {}; CategoryTools.init = function (cid) { @@ -34,60 +35,65 @@ define('forum/category/tools', [ components.get('topic/lock').on('click', function () { var tids = topicSelect.getSelectedTids(); - if (tids.length) { - socket.emit('topics.lock', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); + if (!tids.length) { + return app.alertError('[[error:no-topics-selected]]'); } + socket.emit('topics.lock', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); return false; }); components.get('topic/unlock').on('click', function () { var tids = topicSelect.getSelectedTids(); - if (tids.length) { - socket.emit('topics.unlock', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); + if (!tids.length) { + return app.alertError('[[error:no-topics-selected]]'); } + socket.emit('topics.unlock', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); return false; }); components.get('topic/pin').on('click', function () { var tids = topicSelect.getSelectedTids(); - if (tids.length) { - socket.emit('topics.pin', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); + if (!tids.length) { + return app.alertError('[[error:no-topics-selected]]'); } + socket.emit('topics.pin', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); return false; }); components.get('topic/unpin').on('click', function () { var tids = topicSelect.getSelectedTids(); - if (tids.length) { - socket.emit('topics.unpin', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); + if (!tids.length) { + return app.alertError('[[error:no-topics-selected]]'); } + socket.emit('topics.unpin', { tids: tids, cid: CategoryTools.cid }, onCommandComplete); return false; }); components.get('topic/mark-unread-for-all').on('click', function () { var tids = topicSelect.getSelectedTids(); - if (tids.length) { - socket.emit('topics.markAsUnreadForAll', tids, function (err) { - if (err) { - return app.alertError(err.message); - } - app.alertSuccess('[[topic:markAsUnreadForAll.success]]'); - tids.forEach(function (tid) { - $('[component="category/topic"][data-tid="' + tid + '"]').addClass('unread'); - }); - onCommandComplete(); - }); + if (!tids.length) { + return app.alertError('[[error:no-topics-selected]]'); } - + socket.emit('topics.markAsUnreadForAll', tids, function (err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('[[topic:markAsUnreadForAll.success]]'); + tids.forEach(function (tid) { + $('[component="category/topic"][data-tid="' + tid + '"]').addClass('unread'); + }); + onCommandComplete(); + }); return false; }); components.get('topic/move').on('click', function () { var tids = topicSelect.getSelectedTids(); - if (tids.length) { - move.init(tids, cid, onCommandComplete); + if (!tids.length) { + return app.alertError('[[error:no-topics-selected]]'); } + move.init(tids, cid, onCommandComplete); return false; }); @@ -101,6 +107,8 @@ define('forum/category/tools', [ }); }); + merge.init(); + CategoryTools.removeListeners(); socket.on('event:topic_deleted', setDeleteState); socket.on('event:topic_restored', setDeleteState); @@ -114,7 +122,7 @@ define('forum/category/tools', [ function categoryCommand(command, tids) { if (!tids.length) { - return; + return app.alertError('[[error:no-topics-selected]]'); } translator.translate('[[topic:thread_tools.' + command + '_confirm]]', function (msg) { diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 57d276d986..b3fa02b509 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -29,7 +29,6 @@ define('forum/topic', [ app.removeAlert('bookmark'); events.removeListeners(); - $(window).off('keydown', onKeyDown); require(['search'], function (search) { if (search.topicDOM.active) { @@ -63,8 +62,6 @@ define('forum/topic', [ addParentHandler(); - handleKeys(); - navigator.init('[component="post"]', ajaxify.data.postcount, Topic.toTop, Topic.toBottom, Topic.navigatorCallback, Topic.calculateIndex); handleBookmark(tid); @@ -76,27 +73,6 @@ define('forum/topic', [ $(window).trigger('action:topic.loaded', ajaxify.data); }; - function handleKeys() { - if (!config.usePagination) { - $(window).off('keydown', onKeyDown).on('keydown', onKeyDown); - } - } - - function onKeyDown(ev) { - if (ev.target.nodeName === 'BODY') { - if (ev.shiftKey || ev.ctrlKey || ev.altKey) { - return; - } - if (ev.which === 36) { // home key - Topic.toTop(); - return false; - } else if (ev.which === 35) { // end key - Topic.toBottom(); - return false; - } - } - } - function handleTopicSearch() { require(['search', 'mousetrap'], function (search, mousetrap) { $('.topic-search').off('click') diff --git a/public/src/client/topic/merge.js b/public/src/client/topic/merge.js new file mode 100644 index 0000000000..473f76583c --- /dev/null +++ b/public/src/client/topic/merge.js @@ -0,0 +1,107 @@ +'use strict'; + + +define('forum/topic/merge', function () { + var Merge = {}; + var modal; + var mergeBtn; + + var selectedTids = {}; + + Merge.init = function () { + $('.category').on('click', '[component="topic/merge"]', onMergeTopicsClicked); + if (modal) { + $('[component="category/topic"]').on('click', 'a', onTopicClicked); + } + }; + + function onMergeTopicsClicked() { + if (modal) { + return; + } + app.parseAndTranslate('partials/merge_topics_modal', {}, function (html) { + modal = html; + + $('body').append(modal); + + mergeBtn = modal.find('#merge_topics_confirm'); + + modal.find('.close,#merge_topics_cancel').on('click', closeModal); + + $('[component="category/topic"]').on('click', 'a', onTopicClicked); + + showTopicsSelected(); + + mergeBtn.on('click', function () { + mergeTopics(mergeBtn); + }); + }); + } + + function onTopicClicked(ev) { + var tid = $(this).parents('[component="category/topic"]').attr('data-tid'); + var index = $(this).parents('[component="category/topic"]').attr('data-index'); + var title = ajaxify.data.topics[index] ? ajaxify.data.topics[index].title : 'No title'; + if (selectedTids[tid]) { + delete selectedTids[tid]; + } else { + selectedTids[tid] = title; + } + checkButtonEnable(); + showTopicsSelected(); + ev.preventDefault(); + ev.stopPropagation(); + return false; + } + + function mergeTopics(btn) { + btn.attr('disabled', true); + var tids = Object.keys(selectedTids); + socket.emit('topics.merge', tids, function (err) { + btn.removeAttr('disabled'); + if (err) { + return app.alertError(err.message); + } + ajaxify.go('/topic/' + tids[0]); + closeModal(); + }); + } + + function showTopicsSelected() { + var tids = Object.keys(selectedTids); + tids.sort(function (a, b) { + return a - b; + }); + + var topics = tids.map(function (tid) { + return { tid: tid, title: selectedTids[tid] }; + }); + + if (tids.length) { + app.parseAndTranslate('partials/merge_topics_modal', 'topics', { topics: topics }, function (html) { + modal.find('.topics-section').html(html); + }); + } else { + modal.find('.topics-section').translateHtml('[[error:no-topics-selected]]'); + } + } + + function checkButtonEnable() { + if (Object.keys(selectedTids).length) { + mergeBtn.removeAttr('disabled'); + } else { + mergeBtn.attr('disabled', true); + } + } + + function closeModal() { + if (modal) { + modal.remove(); + modal = null; + } + selectedTids = {}; + $('[component="category/topic"]').off('click', 'a', onTopicClicked); + } + + return Merge; +}); diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 77a060ed7a..07515b9834 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -210,14 +210,14 @@ function renderDigestAvatar(block) { if (block.teaser) { if (block.teaser.user.picture) { - return ''; + return ''; } - return '
' + block.teaser.user['icon:text'] + '
'; + return '
' + block.teaser.user['icon:text'] + '
'; } if (block.user.picture) { - return ''; + return ''; } - return '
' + block.user['icon:text'] + '
'; + return '
' + block.user['icon:text'] + '
'; } function userAgentIcons(data) { diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index ac6c06ac88..6c820cdd7f 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -8,12 +8,16 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co navigator.scrollActive = false; + $(window).on('action:ajaxify.start', function () { + $(window).off('keydown', onKeyDown); + }); + navigator.init = function (selector, count, toTop, toBottom, callback, calculateIndex) { index = 1; navigator.selector = selector; navigator.callback = callback; - toTop = toTop || function () {}; - toBottom = toBottom || function () {}; + navigator.toTop = toTop || function () {}; + navigator.toBottom = toBottom || function () {}; $(window).off('scroll', navigator.delayedUpdate).on('scroll', navigator.delayedUpdate); @@ -29,8 +33,8 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co $('.pagination-block .pageup').off('click').on('click', navigator.scrollUp); $('.pagination-block .pagedown').off('click').on('click', navigator.scrollDown); - $('.pagination-block .pagetop').off('click').on('click', toTop); - $('.pagination-block .pagebottom').off('click').on('click', toBottom); + $('.pagination-block .pagetop').off('click').on('click', navigator.toTop); + $('.pagination-block .pagebottom').off('click').on('click', navigator.toBottom); $('.pagination-block input').on('keydown', function (e) { if (e.which === 13) { @@ -52,10 +56,33 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co } }); + handleKeys(); + navigator.setCount(count); navigator.update(0); }; + function handleKeys() { + if (!config.usePagination) { + $(window).off('keydown', onKeyDown).on('keydown', onKeyDown); + } + } + + function onKeyDown(ev) { + if (ev.target.nodeName === 'BODY') { + if (ev.shiftKey || ev.ctrlKey || ev.altKey) { + return; + } + if (ev.which === 36 && navigator.toTop) { // home key + navigator.toTop(); + return false; + } else if (ev.which === 35 && navigator.toBottom) { // end key + navigator.toBottom(); + return false; + } + } + } + function generateUrl(index) { var pathname = window.location.pathname.replace(config.relative_path, ''); var parts = pathname.split('/'); @@ -164,13 +191,26 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co return; } index = index > count ? count : index; - - $('.pagination-block .pagination-text').translateHtml('[[global:pagination.out_of, ' + index + ', ' + count + ']]'); - var fraction = $(window).scrollTop() / ($(document).height() - $(window).height()); + var relIndex = getRelativeIndex(); + $('.pagination-block .pagination-text').translateHtml('[[global:pagination.out_of, ' + relIndex + ', ' + count + ']]'); + var fraction = relIndex / count; $('.pagination-block meter').val(fraction); $('.pagination-block .progress-bar').width((fraction * 100) + '%'); }; + function getRelativeIndex() { + var relIndex = index; + if (relIndex === 1) { + return 1; + } + if (ajaxify.data.template.topic) { + if (config.topicPostSort === 'most_votes' || config.topicPostSort === 'newest_to_oldest') { + relIndex = ajaxify.data.postcount - index + 2; + } + } + return relIndex; + } + navigator.scrollUp = function () { $('body,html').animate({ scrollTop: $(window).scrollTop() - $(window).height(), @@ -244,7 +284,7 @@ define('navigator', ['forum/pagination', 'components'], function (pagination, co } } else if (inCategory) { if (config.categoryTopicSort === 'most_posts' || config.categoryTopicSort === 'oldest_to_newest') { - index = ajaxify.data.ajaxify.data.topic_count - index; + index = ajaxify.data.topic_count - index; } } diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index f192020ec5..817f6095b6 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -4,10 +4,7 @@ function loadClient(language, namespace) { return Promise.resolve(jQuery.getJSON(config.relative_path + '/assets/language/' + language + '/' + namespace + '.json?' + config['cache-buster'])); } - var warn = function () {}; - if (typeof config === 'object' && config.environment === 'development') { - warn = console.warn.bind(console); - } + var warn = console.warn; if (typeof define === 'function' && define.amd) { // AMD. Register as a named module define('translator', [], function () { diff --git a/public/src/utils.js b/public/src/utils.js index 0e300d2772..37eb821c83 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -336,8 +336,8 @@ return String(str).replace(new RegExp('<(\\/)?(' + (pattern || '[^\\s>]+') + ')(\\s+[^<>]*?)?\\s*(\\/)?>', 'gi'), ''); }, - invalidUnicodeChars: XRegExp('[^\\p{L}\\s\\d\\-_]', 'g'), - invalidLatinChars: /[^\w\s\d\-_]/g, + invalidUnicodeChars: XRegExp('([^\\p{L}\\s\\d-]|_)', 'g'), + invalidLatinChars: /([^\w\s\d-]|_)/g, trimRegex: /^\s+|\s+$/g, collapseWhitespace: /\s+/g, collapseDash: /-+/g, diff --git a/src/cli/index.js b/src/cli/index.js index da2d4dfc71..0bc95a7c6d 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -9,14 +9,30 @@ var dirname = require('./paths').baseDir; // check to make sure dependencies are installed try { fs.readFileSync(path.join(dirname, 'package.json')); - fs.readFileSync(path.join(dirname, 'node_modules/async/package.json')); +} catch (e) { + if (e.code === 'ENOENT') { + console.warn('package.json not found.'); + console.log('Populating package.json...\n'); + + packageInstall.updatePackageFile(); + packageInstall.preserveExtraneousPlugins(); + + console.log('OK'.green + '\n'.reset); + } else { + throw e; + } +} + +try { + fs.readFileSync(path.join(dirname, 'node_modules/async/package.json'), 'utf8'); + fs.readFileSync(path.join(dirname, 'node_modules/commander/package.json'), 'utf8'); + fs.readFileSync(path.join(dirname, 'node_modules/colors/package.json'), 'utf8'); + fs.readFileSync(path.join(dirname, 'node_modules/nconf/package.json'), 'utf8'); } catch (e) { if (e.code === 'ENOENT') { console.warn('Dependencies not yet installed.'); console.log('Installing them now...\n'); - packageInstall.updatePackageFile(); - packageInstall.preserveExtraneousPlugins(); packageInstall.npmInstallProduction(); require('colors'); @@ -121,10 +137,20 @@ program // management commands program - .command('setup') - .description('Run the NodeBB setup script') - .action(function () { - require('./setup').setup(); + .command('setup [config]') + .description('Run the NodeBB setup script, or setup with an initial config') + .action(function (initConfig) { + if (initConfig) { + try { + initConfig = JSON.parse(initConfig); + } catch (e) { + console.warn('Invalid JSON passed as initial config value.'.red); + console.log('If you meant to pass in an initial config value, please try again.\n'); + + throw e; + } + } + require('./setup').setup(initConfig); }); program diff --git a/src/cli/paths.js b/src/cli/paths.js index df5532cacd..2a9bec3547 100644 --- a/src/cli/paths.js +++ b/src/cli/paths.js @@ -6,10 +6,12 @@ var baseDir = path.join(__dirname, '../../'); var loader = path.join(baseDir, 'loader.js'); var app = path.join(baseDir, 'app.js'); var pidfile = path.join(baseDir, 'pidfile'); +var config = path.join(baseDir, 'config.json'); module.exports = { baseDir: baseDir, loader: loader, app: app, pidfile: pidfile, + config: config, }; diff --git a/src/cli/setup.js b/src/cli/setup.js index 541dd98fec..509de52ddb 100644 --- a/src/cli/setup.js +++ b/src/cli/setup.js @@ -2,23 +2,37 @@ var winston = require('winston'); var async = require('async'); +var path = require('path'); +var nconf = require('nconf'); var install = require('../../install/web').install; -function setup() { +function setup(initConfig) { + var paths = require('./paths'); var install = require('../install'); var build = require('../meta/build'); var prestart = require('../prestart'); + var pkg = require('../../package.json'); winston.info('NodeBB Setup Triggered via Command Line'); - console.log('\nWelcome to NodeBB!'); + console.log('\nWelcome to NodeBB v' + pkg.version + '!'); console.log('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.'); console.log('Press enter to accept the default setting (shown in brackets).'); + install.values = initConfig; + async.series([ install.setup, - prestart.loadConfig, + function (next) { + var configFile = paths.config; + if (nconf.get('config')) { + configFile = path.resolve(paths.baseDir, nconf.get('config')); + } + + prestart.loadConfig(configFile); + next(); + }, build.buildAll, ], function (err, data) { // Disregard build step data diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index d454b287a1..5c71c19da7 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -2,6 +2,7 @@ var async = require('async'); var validator = require('validator'); +var nconf = require('nconf'); var user = require('../../user'); var meta = require('../../meta'); @@ -183,6 +184,11 @@ function render(req, res, data) { } usersController.getCSV = function (req, res, next) { + var referer = req.headers.referer; + + if (!referer || !referer.replace(nconf.get('url'), '').startsWith('/admin/manage/users')) { + return res.status(403).send('[[error:invalid-origin]]'); + } events.log({ type: 'getUsersCSV', uid: req.user.uid, diff --git a/src/controllers/api.js b/src/controllers/api.js index b464748f49..8034f958f6 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -17,9 +17,7 @@ var apiController = module.exports; apiController.loadConfig = function (req, callback) { var config = {}; - config.environment = process.env.NODE_ENV; config.relative_path = nconf.get('relative_path'); - config.version = nconf.get('version'); config.siteTitle = validator.escape(String(meta.config.title || meta.config.browserTitle || 'NodeBB')); config.browserTitle = validator.escape(String(meta.config.browserTitle || meta.config.title || 'NodeBB')); config.titleLayout = (meta.config.titleLayout || '{pageTitle} | {browserTitle}').replace(/{/g, '{').replace(/}/g, '}'); diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 73eb6be287..c6b418ff9b 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -57,18 +57,7 @@ authenticationController.register = function (req, res) { user.isPasswordValid(userData.password, next); }, function (next) { - user.shouldQueueUser(req.ip, next); - }, - function (queue, next) { - res.locals.processLogin = true; // set it to false in plugin if you wish to just register only - plugins.fireHook('filter:register.check', { req: req, res: res, userData: userData, queue: queue }, next); - }, - function (data, next) { - if (data.queue) { - addToApprovalQueue(req, userData, next); - } else { - registerAndLoginUser(req, res, userData, next); - } + registerAndLoginUser(req, res, userData, next); }, ], function (err, data) { if (err) { @@ -108,7 +97,18 @@ function registerAndLoginUser(req, res, userData, callback) { return res.json({ referrer: nconf.get('relative_path') + '/register/complete' }); }, function (next) { - user.create(userData, next); + user.shouldQueueUser(req.ip, next); + }, + function (queue, next) { + res.locals.processLogin = true; // set it to false in plugin if you wish to just register only + plugins.fireHook('filter:register.check', { req: req, res: res, userData: userData, queue: queue }, next); + }, + function (data, next) { + if (data.queue) { + addToApprovalQueue(req, userData, callback); + } else { + user.create(userData, next); + } }, function (_uid, next) { uid = _uid; @@ -155,9 +155,11 @@ authenticationController.registerComplete = function (req, res, next) { return memo; }, []); - var done = function () { + var done = function (err, data) { delete req.session.registration; - + if (!err && data && data.message) { + return res.redirect(nconf.get('relative_path') + '/?register=' + encodeURIComponent(data.message)); + } if (req.session.returnTo) { res.redirect(req.session.returnTo); } else { @@ -289,26 +291,30 @@ authenticationController.doLogin = function (req, uid, callback) { authenticationController.onSuccessfulLogin = function (req, uid, callback) { var uuid = utils.generateUUID(); - req.session.meta = {}; - - delete req.session.forceLogin; - - // Associate IP used during login with user account - user.logIP(uid, req.ip); - req.session.meta.ip = req.ip; - - // Associate metadata retrieved via user-agent - req.session.meta = _.extend(req.session.meta, { - uuid: uuid, - datetime: Date.now(), - platform: req.useragent.platform, - browser: req.useragent.browser, - version: req.useragent.version, - }); async.waterfall([ - async.apply(meta.blacklist.test, req.ip), function (next) { + meta.blacklist.test(req.ip, next); + }, + function (next) { + user.logIP(uid, req.ip, next); + }, + function (next) { + req.session.meta = {}; + + delete req.session.forceLogin; + // Associate IP used during login with user account + req.session.meta.ip = req.ip; + + // Associate metadata retrieved via user-agent + req.session.meta = _.extend(req.session.meta, { + uuid: uuid, + datetime: Date.now(), + platform: req.useragent.platform, + browser: req.useragent.browser, + version: req.useragent.version, + }); + async.parallel([ function (next) { user.auth.addSession(uid, req.sessionID, next); diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 25461205bc..1eb46a0041 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -33,11 +33,12 @@ categoriesController.list = function (req, res, next) { }, function () { var data = { - title: '[[pages:categories]]', + title: meta.config.homePageTitle || '[[pages:home]]', categories: categoryData, }; if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/categories') || req.originalUrl.startsWith(nconf.get('relative_path') + '/categories')) { + data.title = '[[pages:categories]]'; data.breadcrumbs = helpers.buildBreadcrumbs([{ text: data.title }]); res.locals.metaTags.push({ property: 'og:title', diff --git a/src/controllers/popular.js b/src/controllers/popular.js index 8b0ee26899..b6a189383c 100644 --- a/src/controllers/popular.js +++ b/src/controllers/popular.js @@ -45,14 +45,15 @@ popularController.get = function (req, res, next) { }, function (topics) { var data = { + title: meta.config.homePageTitle || '[[pages:home]]', topics: topics, 'feeds:disableRSS': parseInt(meta.config['feeds:disableRSS'], 10) === 1, rssFeedUrl: nconf.get('relative_path') + '/popular/' + (req.params.term || 'daily') + '.rss', - title: '[[pages:popular-' + term + ']]', term: term, }; if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/popular') || req.originalUrl.startsWith(nconf.get('relative_path') + '/popular')) { + data.title = '[[pages:popular-' + term + ']]'; var breadcrumbs = [{ text: termToBreadcrumb[term] }]; if (req.params.term) { diff --git a/src/controllers/recent.js b/src/controllers/recent.js index 1477cf01f9..7b997894c1 100644 --- a/src/controllers/recent.js +++ b/src/controllers/recent.js @@ -61,7 +61,7 @@ recentController.get = function (req, res, next) { if (req.uid) { data.rssFeedUrl += '?uid=' + req.uid + '&token=' + rssToken; } - data.title = '[[pages:recent]]'; + data.title = meta.config.homePageTitle || '[[pages:home]]'; data.filters = helpers.buildFilters('recent', filter); data.selectedFilter = data.filters.find(function (filter) { @@ -72,6 +72,7 @@ recentController.get = function (req, res, next) { data.pagination = pagination.create(page, pageCount, req.query); if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/recent') || req.originalUrl.startsWith(nconf.get('relative_path') + '/recent')) { + data.title = '[[pages:recent]]'; data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[recent:title]]' }]); } diff --git a/src/controllers/unread.js b/src/controllers/unread.js index 6d60bab8e7..b4b8e23f38 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -5,6 +5,7 @@ var async = require('async'); var nconf = require('nconf'); var querystring = require('querystring'); +var meta = require('../meta'); var pagination = require('../pagination'); var user = require('../user'); var topics = require('../topics'); @@ -54,6 +55,7 @@ unreadController.get = function (req, res, next) { }, next); }, function (data) { + data.title = meta.config.homePageTitle || '[[pages:home]]'; data.pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage)); data.pagination = pagination.create(page, data.pageCount, req.query); @@ -66,10 +68,10 @@ unreadController.get = function (req, res, next) { data.selectedCategory = results.watchedCategories.selectedCategory; data.selectedCids = results.watchedCategories.selectedCids; if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/unread') || req.originalUrl.startsWith(nconf.get('relative_path') + '/unread')) { + data.title = '[[pages:unread]]'; data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[unread:title]]' }]); } - data.title = '[[pages:unread]]'; data.filters = helpers.buildFilters('unread', filter); data.selectedFilter = data.filters.find(function (filter) { diff --git a/src/install.js b/src/install.js index 89b3d3fa49..b55b1ed08e 100644 --- a/src/install.js +++ b/src/install.js @@ -8,7 +8,7 @@ var winston = require('winston'); var nconf = require('nconf'); var utils = require('./utils.js'); -var install = {}; +var install = module.exports; var questions = {}; questions.main = [ @@ -42,17 +42,15 @@ questions.optional = [ ]; function checkSetupFlag(next) { - var setupVal; + var setupVal = install.values; try { if (nconf.get('setup')) { setupVal = JSON.parse(nconf.get('setup')); } - } catch (err) { - setupVal = undefined; - } + } catch (err) {} - if (setupVal && setupVal instanceof Object) { + if (setupVal && typeof setupVal === 'object') { if (setupVal['admin:username'] && setupVal['admin:password'] && setupVal['admin:password:confirm'] && setupVal['admin:email']) { install.values = setupVal; next(); @@ -74,9 +72,8 @@ function checkSetupFlag(next) { process.exit(); } } else if (nconf.get('database')) { - install.values = { - database: nconf.get('database'), - }; + install.values = install.values || {}; + install.values.database = nconf.get('database'); next(); } else { next(); @@ -549,11 +546,9 @@ install.save = function (server_conf, callback) { console.log('Configuration Saved OK'); nconf.file({ - file: path.join(__dirname, '..', 'config.json'), + file: serverConfigPath, }); callback(); }); }; - -module.exports = install; diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js index c8d5b6a9fb..2b2f897284 100644 --- a/src/meta/blacklist.js +++ b/src/meta/blacklist.js @@ -68,7 +68,12 @@ Blacklist.test = function (clientIp, callback) { // clientIp = '127.0.15.1:3443'; // IPv4 with port strip port to not fail clientIp = clientIp.split(':').length === 2 ? clientIp.split(':')[0] : clientIp; - var addr = ipaddr.parse(clientIp); + var addr; + try { + addr = ipaddr.parse(clientIp); + } catch (err) { + return callback(err); + } if ( Blacklist._rules.ipv4.indexOf(clientIp) === -1 && // not explicitly specified in ipv4 list @@ -88,11 +93,7 @@ Blacklist.test = function (clientIp, callback) { analytics.increment('blacklist'); } - if (typeof callback === 'function') { - callback(err); - } else { - return !!err; - } + callback(err); }); } else { var err = new Error('[[error:blacklisted-ip]]'); @@ -100,11 +101,7 @@ Blacklist.test = function (clientIp, callback) { analytics.increment('blacklist'); - if (typeof callback === 'function') { - setImmediate(callback, err); - } else { - return true; - } + setImmediate(callback, err); } }; diff --git a/src/meta/js.js b/src/meta/js.js index e3c988736b..e8b71cf6a3 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -49,6 +49,7 @@ JS.scripts = { 'public/src/client/unread.js', 'public/src/client/topic.js', 'public/src/client/topic/events.js', + 'public/src/client/topic/merge.js', 'public/src/client/topic/fork.js', 'public/src/client/topic/move.js', 'public/src/client/topic/posts.js', diff --git a/src/middleware/index.js b/src/middleware/index.js index 28ce7c3e10..cb91f82339 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -203,12 +203,19 @@ middleware.delayLoading = function (req, res, next) { }; var viewsDir = nconf.get('views_dir'); +var workingCache = {}; + middleware.templatesOnDemand = function (req, res, next) { var filePath = req.filePath || path.join(viewsDir, req.path); if (!filePath.endsWith('.js')) { return next(); } + if (workingCache[filePath]) { + workingCache[filePath].push(next); + return; + } + async.waterfall([ function (cb) { file.exists(filePath, cb); @@ -218,6 +225,14 @@ middleware.templatesOnDemand = function (req, res, next) { return next(); } + // need to check here again + // because compilation could have started since last check + if (workingCache[filePath]) { + workingCache[filePath].push(next); + return; + } + + workingCache[filePath] = [next]; fs.readFile(filePath.replace(/\.js$/, '.tpl'), 'utf8', cb); }, function (source, cb) { @@ -229,5 +244,12 @@ middleware.templatesOnDemand = function (req, res, next) { function (compiled, cb) { fs.writeFile(filePath, compiled, cb); }, - ], next); + ], function (err) { + var arr = workingCache[filePath]; + workingCache[filePath] = null; + + arr.forEach(function (callback) { + callback(err); + }); + }); }; diff --git a/src/middleware/render.js b/src/middleware/render.js index f0e77540b4..a4571b6879 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -8,6 +8,7 @@ var winston = require('winston'); var plugins = require('../plugins'); var translator = require('../translator'); var widgets = require('../widgets'); +var utils = require('../utils'); module.exports = function (middleware) { middleware.processRender = function (req, res, next) { @@ -40,7 +41,7 @@ module.exports = function (middleware) { options.template = { name: template }; options.template[template] = true; options.url = (req.baseUrl + req.path.replace(/^\/api/, '')); - options.bodyClass = buildBodyClass(req); + options.bodyClass = buildBodyClass(req, options); plugins.fireHook('filter:' + template + '.build', { req: req, res: res, templateData: options }, next); }, @@ -125,7 +126,7 @@ module.exports = function (middleware) { }); } - function buildBodyClass(req) { + function buildBodyClass(req, templateData) { var clean = req.path.replace(/^\/api/, '').replace(/^\/|\/$/g, ''); var parts = clean.split('/').slice(0, 3); parts.forEach(function (p, index) { @@ -138,6 +139,12 @@ module.exports = function (middleware) { p = validator.escape(String(p)); parts[index] = index ? parts[0] + '-' + p : 'page-' + (p || 'home'); }); + + if (templateData.template.topic) { + parts.push('page-topic-category-' + templateData.category.cid); + parts.push('page-topic-category-' + utils.slugify(templateData.category.name)); + } + return parts.join(' '); } }; diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index f8d333e67a..a7aa7a3ab0 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -16,6 +16,7 @@ require('./topics/move')(SocketTopics); require('./topics/tools')(SocketTopics); require('./topics/infinitescroll')(SocketTopics); require('./topics/tags')(SocketTopics); +require('./topics/merge')(SocketTopics); SocketTopics.post = function (socket, data, callback) { if (!data) { diff --git a/src/socket.io/topics/merge.js b/src/socket.io/topics/merge.js new file mode 100644 index 0000000000..8b475f2ede --- /dev/null +++ b/src/socket.io/topics/merge.js @@ -0,0 +1,27 @@ +'use strict'; + +var async = require('async'); +var topics = require('../../topics'); +var privileges = require('../../privileges'); + +module.exports = function (SocketTopics) { + SocketTopics.merge = function (socket, tids, callback) { + if (!Array.isArray(tids)) { + return callback(new Error('[[error:invalid-data]]')); + } + + async.waterfall([ + function (next) { + async.map(tids, function (tid, next) { + privileges.topics.isAdminOrMod(tid, socket.uid, next); + }, next); + }, + function (allowed, next) { + if (allowed.includes(false)) { + return next(new Error('[[error:no-privileges]]')); + } + topics.merge(tids, socket.uid, next); + }, + ], callback); + }; +}; diff --git a/src/topics.js b/src/topics.js index 5f744316c0..44c263210d 100644 --- a/src/topics.js +++ b/src/topics.js @@ -31,6 +31,7 @@ require('./topics/suggested')(Topics); require('./topics/tools')(Topics); require('./topics/thumb')(Topics); require('./topics/bookmarks')(Topics); +require('./topics/merge')(Topics); Topics.exists = function (tid, callback) { db.isSortedSetMember('topics:tid', tid, callback); @@ -252,7 +253,7 @@ function getMainPostAndReplies(topic, set, uid, start, stop, reverse, callback) return callback(null, []); } - if (topic.mainPid && start === 0) { + if (parseInt(topic.mainPid, 10) && start === 0) { pids.unshift(topic.mainPid); } posts.getPostsByPids(pids, uid, next); diff --git a/src/topics/merge.js b/src/topics/merge.js new file mode 100644 index 0000000000..9fd97f60eb --- /dev/null +++ b/src/topics/merge.js @@ -0,0 +1,36 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (Topics) { + Topics.merge = function (tids, uid, callback) { + var mergeIntoTid = findOldestTopic(tids); + + var otherTids = tids.filter(function (tid) { + return tid && parseInt(tid, 10) !== parseInt(mergeIntoTid, 10); + }); + + async.eachSeries(otherTids, function (tid, next) { + async.waterfall([ + function (next) { + Topics.getPids(tid, next); + }, + function (pids, next) { + async.eachSeries(pids, function (pid, next) { + Topics.movePostToTopic(pid, mergeIntoTid, next); + }, next); + }, + function (next) { + Topics.setTopicField(tid, 'mainPid', 0, next); + }, + function (next) { + Topics.delete(tid, uid, next); + }, + ], next); + }, callback); + }; + + function findOldestTopic(tids) { + return Math.min.apply(null, tids); + } +}; diff --git a/src/topics/posts.js b/src/topics/posts.js index ebfbd106c0..9816d8178f 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -326,7 +326,7 @@ module.exports = function (Topics) { }, next); }, function (results, next) { - if (results.mainPid) { + if (parseInt(results.mainPid, 10)) { results.pids = [results.mainPid].concat(results.pids); } next(null, results.pids); diff --git a/src/upgrades/TEMPLATE b/src/upgrades/TEMPLATE index 9618bc4f9e..54e4e2a2c0 100644 --- a/src/upgrades/TEMPLATE +++ b/src/upgrades/TEMPLATE @@ -6,7 +6,10 @@ var async = require('async'); var winston = require('winston'); module.exports = { + // you should use spaces + // the underscores are there so you can double click to select the whole thing name: 'User_friendly_upgrade_script_name', + // remember, month is zero-indexed (so January is 0, December is 11) timestamp: Date.UTC(2017, 0, 1), method: function (callback) { // Do stuff here... diff --git a/src/user/admin.js b/src/user/admin.js index d463523f89..1b273bca48 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -2,21 +2,41 @@ 'use strict'; var async = require('async'); +var winston = require('winston'); +var validator = require('validator'); + var db = require('../database'); var plugins = require('../plugins'); -var winston = require('winston'); module.exports = function (User) { - User.logIP = function (uid, ip) { + User.logIP = function (uid, ip, callback) { var now = Date.now(); - db.sortedSetAdd('uid:' + uid + ':ip', now, ip || 'Unknown'); - if (ip) { - db.sortedSetAdd('ip:' + ip + ':uid', now, uid); - } + async.waterfall([ + function (next) { + db.sortedSetAdd('uid:' + uid + ':ip', now, ip || 'Unknown', next); + }, + function (next) { + if (ip) { + db.sortedSetAdd('ip:' + ip + ':uid', now, uid, next); + } else { + next(); + } + }, + ], callback); }; User.getIPs = function (uid, stop, callback) { - db.getSortedSetRevRange('uid:' + uid + ':ip', 0, stop, callback); + async.waterfall([ + function (next) { + db.getSortedSetRevRange('uid:' + uid + ':ip', 0, stop, next); + }, + function (ips, next) { + ips = ips.map(function (ip) { + return validator.escape(String(ip)); + }); + next(null, ips); + }, + ], callback); }; User.getUsersCSV = function (callback) { diff --git a/src/user/approval.js b/src/user/approval.js index 710b66930a..a42c400109 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -4,6 +4,7 @@ var async = require('async'); var request = require('request'); var winston = require('winston'); +var validator = require('validator'); var db = require('../database'); var meta = require('../meta'); @@ -168,6 +169,7 @@ module.exports = function (User) { function (users, next) { users = users.filter(Boolean).map(function (user, index) { user.timestampISO = utils.toISOString(data[index].score); + user.email = validator.escape(String(user.email)); delete user.hashedPassword; return user; }); diff --git a/src/user/auth.js b/src/user/auth.js index 1fbc316f18..6d0002939e 100644 --- a/src/user/auth.js +++ b/src/user/auth.js @@ -2,6 +2,7 @@ var async = require('async'); var winston = require('winston'); +var validator = require('validator'); var db = require('../database'); var meta = require('../meta'); var events = require('../events'); @@ -126,12 +127,15 @@ module.exports = function (User) { next(err, sessions); }); }, - ], function (err, sessions) { - callback(err, sessions ? sessions.map(function (sessObj) { - sessObj.meta.datetimeISO = new Date(sessObj.meta.datetime).toISOString(); - return sessObj.meta; - }) : undefined); - }); + function (sessions, next) { + sessions = sessions.map(function (sessObj) { + sessObj.meta.datetimeISO = new Date(sessObj.meta.datetime).toISOString(); + sessObj.meta.ip = validator.escape(String(sessObj.meta.ip)); + return sessObj.meta; + }); + next(null, sessions); + }, + ], callback); }; User.auth.addSession = function (uid, sessionId, callback) { diff --git a/src/user/invite.js b/src/user/invite.js index d3d7189296..e211a67bc7 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -3,6 +3,7 @@ var async = require('async'); var nconf = require('nconf'); +var validator = require('validator'); var db = require('./../database'); var meta = require('../meta'); @@ -10,10 +11,19 @@ var emailer = require('../emailer'); var translator = require('../translator'); var utils = require('../utils'); - module.exports = function (User) { User.getInvites = function (uid, callback) { - db.getSetMembers('invitation:uid:' + uid, callback); + async.waterfall([ + function (next) { + db.getSetMembers('invitation:uid:' + uid, next); + }, + function (emails, next) { + emails = emails.map(function (email) { + return validator.escape(String(email)); + }); + next(null, emails); + }, + ], callback); }; User.getInvitesNumber = function (uid, callback) { diff --git a/src/views/admin/general/homepage.tpl b/src/views/admin/general/homepage.tpl index f6bc21b6cb..049721e829 100644 --- a/src/views/admin/general/homepage.tpl +++ b/src/views/admin/general/homepage.tpl @@ -24,6 +24,9 @@ [[admin/general/homepage:allow-user-home-pages]] +
+ + diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 6a16141aca..bebded1a5e 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -28,7 +28,7 @@ [[admin/manage/users:download-csv]] - + diff --git a/src/views/admin/settings/post.tpl b/src/views/admin/settings/post.tpl index 094ec4b7e7..3eb7be42b8 100644 --- a/src/views/admin/settings/post.tpl +++ b/src/views/admin/settings/post.tpl @@ -24,43 +24,41 @@ +
+
[[admin/settings/post:length]]
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+ +
+
+
+
+
[[admin/settings/post:restrictions]]
-
-
- -
-

- [[admin/settings/post:restrictions.post-queue-help]] -

-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
+
@@ -73,22 +71,7 @@
-
- - -
-
- - -
-
- - -
-
- - -
+
@@ -100,6 +83,45 @@
+
+
[[admin/settings/post:restrictions-new]]
+
+ +
+
+
+ + +
+
+
+
+ + + +
+
+
+
+
+ +
+

+ [[admin/settings/post:restrictions.post-queue-help]] +

+
+ +
+ + +
+ +
+
+
[[admin/settings/post:timestamp]]
diff --git a/src/views/emails/digest.tpl b/src/views/emails/digest.tpl index 3a50fded7a..38fba1232f 100644 --- a/src/views/emails/digest.tpl +++ b/src/views/emails/digest.tpl @@ -16,22 +16,22 @@ - - -
+

[[email:greeting_with_name, {username}]],

+

[[email:digest.notifications, {site_title}]]

+

[[email:digest.latest_topics, {site_title}]]

    diff --git a/test/authentication.js b/test/authentication.js index bacbcb679a..99512c7af4 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -235,6 +235,36 @@ describe('authentication', function () { }); }); + it('should fail to login if ip address if invalid', function (done) { + var jar = request.jar(); + request({ + url: nconf.get('url') + '/api/config', + json: true, + jar: jar, + }, function (err, response, body) { + if (err) { + return done(err); + } + + request.post(nconf.get('url') + '/login', { + form: { + username: 'regular', + password: 'regularpwd', + }, + json: true, + jar: jar, + headers: { + 'x-csrf-token': body.csrf_token, + 'x-forwarded-for': '', + }, + }, function (err, response, body) { + assert.ifError(err); + assert.equal(response.statusCode, 500); + done(); + }); + }); + }); + it('should fail to login if user does not exist', function (done) { loginUser('doesnotexist', 'nopassword', function (err, response, body) { assert.ifError(err); diff --git a/test/blacklist.js b/test/blacklist.js index 763c5364f7..9ec1e557d3 100644 --- a/test/blacklist.js +++ b/test/blacklist.js @@ -49,32 +49,24 @@ describe('blacklist', function () { }); }); - it('should pass ip test against blacklist async', function (done) { + it('should pass ip test against blacklist', function (done) { blacklist.test('3.3.3.3', function (err) { assert.ifError(err); done(); }); }); - it('should pass ip test against blacklist sync', function (done) { - assert(!blacklist.test('3.3.3.3')); - done(); - }); - - it('should fail ip test against blacklist async', function (done) { + it('should fail ip test against blacklist', function (done) { blacklist.test('1.1.1.1', function (err) { assert.equal(err.message, '[[error:blacklisted-ip]]'); done(); }); }); - it('should fail ip test against blacklist sync', function (done) { - assert(blacklist.test('1.1.1.1')); - done(); - }); - it('should pass ip test and not crash with ipv6 address', function (done) { - assert(!blacklist.test('2001:db8:85a3:0:0:8a2e:370:7334')); - done(); + blacklist.test('2001:db8:85a3:0:0:8a2e:370:7334', function (err) { + assert.ifError(err); + done(); + }); }); }); diff --git a/test/controllers-admin.js b/test/controllers-admin.js index 74cb521bc1..7639a0df4f 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -255,9 +255,38 @@ describe('Admin Controllers', function () { }); }); - it('should load /admin/users/csv', function (done) { + it('should return 403 if no referer', function (done) { request(nconf.get('url') + '/api/admin/users/csv', { jar: jar }, function (err, res, body) { assert.ifError(err); + assert.equal(res.statusCode, 403); + assert.equal(body, '[[error:invalid-origin]]'); + done(); + }); + }); + + it('should return 403 if referer is not /admin/users/csv', function (done) { + request(nconf.get('url') + '/api/admin/users/csv', { + jar: jar, + headers: { + referer: '/topic/1/test', + }, + }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 403); + assert.equal(body, '[[error:invalid-origin]]'); + done(); + }); + }); + + it('should load /admin/users/csv', function (done) { + request(nconf.get('url') + '/api/admin/users/csv', { + jar: jar, + headers: { + referer: nconf.get('url') + '/admin/manage/users', + }, + }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); assert(body); done(); }); diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index a3642bb78d..96eada54b2 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -48,7 +48,7 @@ if (!testDbConfig) { ' "host": "127.0.0.1",\n' + ' "port": "27017",\n' + ' "password": "",\n' + - ' "database": "1\n' + + ' "database": "1"\n' + '}\n' + ' or (mongo) in a replicaset\n' + '"test_database": {\n' + diff --git a/test/template-helpers.js b/test/template-helpers.js index eb145e98a8..8ada13f29e 100644 --- a/test/template-helpers.js +++ b/test/template-helpers.js @@ -164,28 +164,28 @@ describe('helpers', function () { it('should render digest avatar', function (done) { var block = { teaser: { user: { username: 'baris', picture: '/uploads/1.png' } } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, ''); + assert.equal(html, ''); done(); }); it('should render digest avatar', function (done) { var block = { teaser: { user: { username: 'baris', 'icon:text': 'B', 'icon:bgColor': '#ff000' } } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, '
    ' + block.teaser.user['icon:text'] + '
    '); + assert.equal(html, '
    ' + block.teaser.user['icon:text'] + '
    '); done(); }); it('should render digest avatar', function (done) { var block = { user: { username: 'baris', picture: '/uploads/1.png' } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, ''); + assert.equal(html, ''); done(); }); it('should render digest avatar', function (done) { var block = { user: { username: 'baris', 'icon:text': 'B', 'icon:bgColor': '#ff000' } }; var html = helpers.renderDigestAvatar(block); - assert.equal(html, '
    ' + block.user['icon:text'] + '
    '); + assert.equal(html, '
    ' + block.user['icon:text'] + '
    '); done(); }); diff --git a/test/topics.js b/test/topics.js index e6c341cb9e..f4d91ad763 100644 --- a/test/topics.js +++ b/test/topics.js @@ -1699,4 +1699,90 @@ describe('Topic\'s', function () { }); }); }); + + describe('topic merge', function () { + var uid; + var topic1Data; + var topic2Data; + + before(function (done) { + async.waterfall([ + function (next) { + User.create({ username: 'mergevictim' }, next); + }, + function (_uid, next) { + uid = _uid; + topics.post({ uid: uid, cid: categoryObj.cid, title: 'topic 1', content: 'topic 1 OP' }, next); + }, + function (result, next) { + topic1Data = result.topicData; + topics.post({ uid: uid, cid: categoryObj.cid, title: 'topic 2', content: 'topic 2 OP' }, next); + }, + function (result, next) { + topic2Data = result.topicData; + topics.reply({ uid: uid, content: 'topic 1 reply', tid: topic1Data.tid }, next); + }, + function (postData, next) { + topics.reply({ uid: uid, content: 'topic 2 reply', tid: topic2Data.tid }, next); + }, + ], done); + }); + + it('should error if data is not an array', function (done) { + socketTopics.merge({ uid: 0 }, null, function (err) { + assert.equal(err.message, '[[error:invalid-data]]'); + done(); + }); + }); + + it('should error if user does not have privileges', function (done) { + socketTopics.merge({ uid: 0 }, [topic2Data.tid, topic1Data.tid], function (err) { + assert.equal(err.message, '[[error:no-privileges]]'); + done(); + }); + }); + + it('should merge 2 topics', function (done) { + async.waterfall([ + function (next) { + socketTopics.merge({ uid: adminUid }, [topic2Data.tid, topic1Data.tid], next); + }, + function (next) { + async.parallel({ + topic1: function (next) { + async.waterfall([ + function (next) { + topics.getTopicData(topic1Data.tid, next); + }, + function (topicData, next) { + topics.getTopicWithPosts(topicData, 'tid:' + topicData.tid + ':posts', adminUid, 0, 19, false, next); + }, + ], next); + }, + topic2: function (next) { + async.waterfall([ + function (next) { + topics.getTopicData(topic2Data.tid, next); + }, + function (topicData, next) { + topics.getTopicWithPosts(topicData, 'tid:' + topicData.tid + ':posts', adminUid, 0, 19, false, next); + }, + ], next); + }, + }, next); + }, + function (results, next) { + assert.equal(results.topic1.posts.length, 4); + assert.equal(results.topic2.posts.length, 0); + assert.equal(results.topic2.deleted, true); + + assert.equal(results.topic1.posts[0].content, 'topic 1 OP'); + assert.equal(results.topic1.posts[1].content, 'topic 2 OP'); + assert.equal(results.topic1.posts[2].content, 'topic 1 reply'); + assert.equal(results.topic1.posts[3].content, 'topic 2 reply'); + next(); + }, + ], done); + }); + }); }); diff --git a/test/user.js b/test/user.js index 0135c339b2..82046c525a 100644 --- a/test/user.js +++ b/test/user.js @@ -1405,7 +1405,7 @@ describe('User', function () { username: 'rejectme', password: '123456', 'password-confirm': '123456', - email: 'reject@me.com', + email: '', function (err) { + assert.ifError(err); + User.getInvites(inviterUid, function (err, data) { + assert.ifError(err); + assert.equal(data[0], '<script>alert("ok");</script>'); + done(); + }); + }); + }); }); describe('email confirm', function () {